Java之dao模式詳解及代碼示例
什么是dao模式?
DAO(Data Access Object)顧名思義是一個(gè)為數(shù)據(jù)庫(kù)或其他持久化機(jī)制提供了抽象接口的對(duì)象,在不暴露底層持久化方案實(shí)現(xiàn)細(xì)節(jié)的前提下提供了各種數(shù)據(jù)訪問操作。在實(shí)際的開發(fā)中,應(yīng)該將所有對(duì)數(shù)據(jù)源的訪問操作進(jìn)行抽象化后封裝在一個(gè)公共API中。用程序設(shè)計(jì)語言來說,就是建立一個(gè)接口,接口中定義了此應(yīng)用程序中將會(huì)用到的所有事務(wù)方法。在這個(gè)應(yīng)用程序中,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時(shí)候則使用這個(gè)接口,并且編寫一個(gè)單獨(dú)的類來實(shí)現(xiàn)這個(gè)接口,在邏輯上該類對(duì)應(yīng)一個(gè)特定的數(shù)據(jù)存儲(chǔ)。DAO模式實(shí)際上包含了兩個(gè)模式,一是Data Accessor(數(shù)據(jù)訪問器),二是Data Object(數(shù)據(jù)對(duì)象),前者要解決如何訪問數(shù)據(jù)的問題,而后者要解決的是如何用對(duì)象封裝數(shù)據(jù)。
一、信息系統(tǒng)的開發(fā)架構(gòu)
客戶層-------顯示層-------業(yè)務(wù)層---------數(shù)據(jù)層---------數(shù)據(jù)庫(kù)
1.客戶層:客戶層就是客戶端,簡(jiǎn)單的來說就是瀏覽器。
2.顯示層:JSP/Servlet,用于給瀏覽器顯示。
3.業(yè)務(wù)層:對(duì)于數(shù)據(jù)層的原子操作進(jìn)行整合。
4.數(shù)據(jù)層:對(duì)于數(shù)據(jù)庫(kù)進(jìn)行的原子操作,增加、刪除等;
二、DAO(Data Access Object)介紹
DAO應(yīng)用在數(shù)據(jù)層那塊(對(duì)于數(shù)據(jù)庫(kù)進(jìn)行的原子操作,增加、刪除等;),用于訪問數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的類。
三、DAO設(shè)計(jì)模式的結(jié)構(gòu)
DAO設(shè)計(jì)模式一般分為幾個(gè)類:
1.VO(Value Object):一個(gè)用于存放網(wǎng)頁(yè)的一行數(shù)據(jù)即一條記錄的類,比如網(wǎng)頁(yè)要顯示一個(gè)用戶的信息,則這個(gè)類就是用戶的類。
2.DatabaseConnection:用于打開和關(guān)閉數(shù)據(jù)庫(kù)。
3.DAO接口:用于聲明對(duì)于數(shù)據(jù)庫(kù)的操作。
4.DAOImpl:必須實(shí)現(xiàn)DAO接口,真實(shí)實(shí)現(xiàn)DAO接口的函數(shù),但是不包括數(shù)據(jù)庫(kù)的打開和關(guān)閉。
5.DAOProxy:也是實(shí)現(xiàn)DAO接口,但是只需要借助DAOImpl即可,但是包括數(shù)據(jù)庫(kù)的打開和關(guān)閉。
6.DAOFactory:工廠類,含有g(shù)etInstance()創(chuàng)建一個(gè)Proxy類。
四、DAO的好處
DAO的好處就是提供給用戶的接口只有DAO的接口,所以如果用戶想添加數(shù)據(jù),只需要調(diào)用create函數(shù)即可,不需要數(shù)據(jù)庫(kù)的操作。
五、DAO包命名
對(duì)于DAO,包的命名和類的命名一定要有層次。
1.Emp.Java
package org.vo;
import java.util.*;
public class Emp{
private int empno;
private String ename;
private String job;
private Date hireDate;
private float sal;
public Emp(){
}
public int getEmpno(){
return empno;
}
public void setEmpno(int empno){
this.empno = empno;
}
public String getEname(){
return ename;
}
public void setEname(String ename){
this.ename = ename;
}
public Date getHireDate(){
return hireDate;
}
public void setHireDate(Date hireDate){
this.hireDate = hireDate;
}
public float getSal(){
return sal;
}
public void setSal(float sal){
this.sal = sal;
}
public String getJob(){
return job;
}
public void setJob(String job){
this.job = job;
}
}
2.DatabaseConnection.java
package org.dbc;
import java.sql.*;
public class DatabaseConnection{
private Connection con = null;
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String USER = "root";
private static final String URL = "jdbc:mysql://localhost:3306/mldn";
private static final String PASS = "12345";
public DatabaseConnection()throws Exception{
Class.forName(DRIVER);
con = DriverManager.getConnection(URL,USER,PASS);
}
public Connection getConnection()throws Exception{
return con;
}
public void close()throws Exception{
if(con!=null){
con.close();
}
}
}
3.IEmpDAO.java
package org.dao;
import java.util.List;
import org.vo.*;
public interface IEmpDAO{
public boolean doCreate(Emp emp)throws Exception;
public List<Emp> findAll()throws Exception;
public Emp findById(int empno)throws Exception;
}
4.EmpDAOImpl.java
package org.dao.impl;
import org.dao.*;
import java.sql.*;
import org.vo.*;
import java.util.*;
public class EmpDAOImpl implements IEmpDAO{
private Connection con;
private PreparedStatement stat = null;
public EmpDAOImpl(Connection con){
this.con = con;
}
public boolean doCreate(Emp emp)throws Exception{
String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)";
stat = con.prepareStatement(sql);
stat.setInt(1,emp.getEmpno());
stat.setString(2,emp.getEname());
stat.setString(3,emp.getJob());
stat.setDate(4,new java.sql.Date(emp.getHireDate().getTime()));
stat.setFloat(5,emp.getSal());
int update = stat.executeUpdate();
if(update>0){
return true;
}
else{
return false;
}
}
public List<Emp> findAll()throws Exception{
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp";
stat = con.prepareStatement(sql);
ResultSet rs = stat.executeQuery();
Emp emp = null;
List<Emp> list = new ArrayList<Emp>();
while(rs.next()){
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
float sal = rs.getFloat(5);
emp = new Emp();
emp.setEmpno(empno);
emp.setEname(ename);
emp.setJob(job);
emp.setHireDate(rs.getDate(4));
emp.setSal(sal);
list.add(emp);
}
return list;
}
public Emp findById(int empno)throws Exception{
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?";
stat = con.prepareStatement(sql);
stat.setInt(1,empno);
ResultSet rs = stat.executeQuery();
Emp emp = null;
if(rs.next()){
String ename = rs.getString(2);
String job = rs.getString(3);
float sal = rs.getFloat(5);
emp = new Emp();
emp.setEmpno(empno);
emp.setEname(ename);
emp.setJob(job);
emp.setHireDate(rs.getDate(4));
emp.setSal(sal);
}
return emp;
}
}
5.EmpDAOProxy.java
package org.dao.impl;
import org.dao.*;
import java.sql.*;
import org.vo.*;
import java.util.*;
import org.dbc.*;
public class EmpDAOProxy implements IEmpDAO{
private DatabaseConnection dbc;
private IEmpDAO dao = null;
public EmpDAOProxy()throws Exception{
dbc = new DatabaseConnection();
dao = new EmpDAOImpl(dbc.getConnection());
}
public boolean doCreate(Emp emp)throws Exception{
boolean flag = false;
if(dao.findById(emp.getEmpno())==null){
flag = dao.doCreate(emp);
}
dbc.close();
return flag;
}
public List<Emp> findAll()throws Exception{
List<Emp>list = dao.findAll();
dbc.close();
return list;
}
public Emp findById(int empno)throws Exception{
Emp emp = dao.findById(empno);
dbc.close();
return emp;
}
}
6.DAOFactory.java
package org.dao.factory;
import org.dao.*;
import java.sql.*;
import org.vo.*;
import java.util.*;
import org.dbc.*;
import org.dao.impl.*;
public class DAOFactory{
public static IEmpDAO getInstance(){
IEmpDAO dao = null;
try{
dao = new EmpDAOProxy();
}
catch(Exception e){
e.printStackTrace();
}
return dao;
}
}
7.TestDAO.java
package org.dao.test;
import org.dao.factory.*;
import org.vo.*;
import org.dao.*;
public class TestDAO{
public static void main(String args[])throws Exception{
Emp emp = null;
for(int i=0;i<5;i++){
emp = new Emp();
emp.setEmpno(i);
emp.setEname("xiazdong-"+i);
emp.setJob("stu-"+i);
emp.setHireDate(new java.util.Date());
emp.setSal(500*i);
DAOFactory.getInstance().doCreate(emp);
}
}
}
通過DAO設(shè)計(jì)模式,可以在JSP中屏蔽了數(shù)據(jù)庫(kù)連接的操作,達(dá)到JSP只負(fù)責(zé)顯示的效果。
//對(duì)應(yīng)
String sql = "INSERT INTO emp_table(ename,job,sal,hiredate) VALUES(?,?,?,?)";
stat = (PreparedStatement) con.prepareStatement(sql);
stat.setString(1,emp.getEname());
stat.setString(2,emp.getJob());
stat.setFloat(3,emp.getSal());
總結(jié)
以上就是本文關(guān)于Java之dao模式詳解及代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助,歡迎參閱:Java設(shè)計(jì)模式筆記之抽象工廠代碼示例、Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解、Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例等,有什么問題可以隨時(shí)留言,感謝大家!
- 詳解Javaee Dao層的抽取
- java 設(shè)計(jì)模式(DAO)的實(shí)例詳解
- Java利用自定義注解、反射實(shí)現(xiàn)簡(jiǎn)單BaseDao實(shí)例
- Java 中利用泛型和反射機(jī)制抽象DAO的實(shí)例
- Java的MyBatis+Spring框架中使用數(shù)據(jù)訪問對(duì)象DAO模式的方法
- Java的Spring框架中DAO數(shù)據(jù)訪問對(duì)象的使用示例
- 通過代理類實(shí)現(xiàn)java連接數(shù)據(jù)庫(kù)(使用dao層操作數(shù)據(jù))實(shí)例分享
- Java接口DAO模式代碼原理及應(yīng)用詳解
相關(guān)文章
圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)
希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡(jiǎn)單插入排序經(jīng)過改進(jìn)之后的一個(gè)更高效的版本,也稱為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)2022-09-09
JavaSE實(shí)戰(zhàn)之酒店訂房系統(tǒng)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用JavaSE實(shí)現(xiàn)酒店訂房系統(tǒng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaSE開發(fā)有一定的幫助,需要的可以參考一下2022-07-07
Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼
這篇文章主要介紹了Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
springboot讀取application.yaml文件數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

