Java之dao模式詳解及代碼示例java
這篇文章主要介紹了Java之dao模式詳解及代碼示例,具備必定參考價值,須要的朋友能夠了解下。mysql
什麼是dao模式?sql
DAO(Data Access Object)顧名思義是一個爲數據庫或其餘持久化機制提供了抽象接口的對象,在不暴露底層持久化方案實現細節的前提下提供了各類數據訪問操做。在實際的開發中,應該將全部對數據源的訪問操做進行抽象化後封裝在一個公共API中。用程序設計語言來講,就是創建一個接口,接口中定義了此應用程序中將會用到的全部事務方法。在這個應用程序中,當須要和數據源進行交互的時候則使用這個接口,而且編寫一個單獨的類來實現這個接口,在邏輯上該類對應一個特定的數據存儲。DAO模式實際上包含了兩個模式,一是Data Accessor(數據訪問器),二是Data Object(數據對象),前者要解決如何訪問數據的問題,然後者要解決的是如何用對象封裝數據。數據庫
1、信息系統的開發架構設計模式
客戶層-------顯示層-------業務層---------數據層---------數據庫瀏覽器
1.客戶層:客戶層就是客戶端,簡單的來講就是瀏覽器。架構
2.顯示層:JSP/Servlet,用於給瀏覽器顯示。函數
3.業務層:對於數據層的原子操做進行整合。this
4.數據層:對於數據庫進行的原子操做,增長、刪除等;設計
2、DAO(Data Access Object)介紹
DAO應用在數據層那塊(對於數據庫進行的原子操做,增長、刪除等;),用於訪問數據庫,對數據庫進行操做的類。
3、DAO設計模式的結構
DAO設計模式通常分爲幾個類:
1.VO(Value Object):一個用於存放網頁的一行數據即一條記錄的類,好比網頁要顯示一個用戶的信息,則這個類就是用戶的類。
2.DatabaseConnection:用於打開和關閉數據庫。
3.DAO接口:用於聲明對於數據庫的操做。
4.DAOImpl:必須實現DAO接口,真實實現DAO接口的函數,可是不包括數據庫的打開和關閉。
5.DAOProxy:也是實現DAO接口,可是隻須要藉助DAOImpl便可,可是包括數據庫的打開和關閉。
6.DAOFactory:工廠類,含有getInstance()建立一個Proxy類。
4、DAO的好處
DAO的好處就是提供給用戶的接口只有DAO的接口,因此若是用戶想添加數據,只須要調用create函數便可,不須要數據庫的操做。
5、DAO包命名
對於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設計模式,能夠在JSP中屏蔽了數據庫鏈接的操做,達到JSP只負責顯示的效果。
//對應
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());