JavaBean中DAO設計模式介紹
阿新 • • 發佈:2018-12-20
一、資訊系統的開發架構
客戶層-------顯示層-------業務層---------資料層---------資料庫
1.客戶層:客戶層就是客戶端,簡單的來說就是瀏覽器。
2.顯示層:JSP/Servlet,用於給瀏覽器顯示。
3.業務層:對於資料層的原子操作進行整合。
4.資料層:對於資料庫進行的原子操作,增加、刪除等;
二、DAO(Data Access Object)介紹
DAO應用在資料層那塊,用於訪問資料庫,對資料庫進行操作的類。
三、DAO設計模式的結構
DAO設計模式一般分為幾個類:
1.VO(Value Object):一個用於存放網頁的一行資料即一條記錄的類,比如網頁要顯示一個使用者的資訊,則這個類就是使用者的類。
2.DatabaseConnection:用於開啟和關閉資料庫。
3.DAO介面:用於宣告對於資料庫的操作。
4.DAOImpl:必須實現DAO介面,真實實現DAO介面的函式,但是不包括資料庫的開啟和關閉。
5.DAOProxy:也是實現DAO介面,但是隻需要藉助DAOImpl即可,但是包括資料庫的開啟和關閉。
6.DAOFactory:工廠類,含有getInstance()建立一個Proxy類。
四、DAO的好處
DAO的好處就是提供給使用者的介面只有DAO的介面,所以如果使用者想新增資料,只需要呼叫create函式即可,不需要資料庫的操作。
五、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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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只負責顯示的效果。