JavaBean中DAO设计模式介绍(转)
一、信息系统的开发架构
客户层-------显示层-------业务层---------数据层---------数据库
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
1 package org.vo; 2 import java.util.*; 3 public class Emp{ 4 private int empno; 5 private String ename; 6 private String job; 7 private Date hireDate; 8 private float sal; 9 public Emp(){ 10 11 } 12 public int getEmpno(){ 13 return empno; 14 } 15 public void setEmpno(int empno){ 16 this.empno = empno; 17 } 18 public String getEname(){ 19 return ename; 20 } 21 public void setEname(String ename){ 22 this.ename = ename; 23 } 24 public Date getHireDate(){ 25 return hireDate; 26 } 27 public void setHireDate(Date hireDate){ 28 this.hireDate = hireDate; 29 } 30 public float getSal(){ 31 return sal; 32 } 33 public void setSal(float sal){ 34 this.sal = sal; 35 } 36 public String getJob(){ 37 return job; 38 } 39 public void setJob(String job){ 40 this.job = job; 41 } 42 }
2.DatabaseConnection.java
1 package org.dbc; 2 import java.sql.*; 3 public class DatabaseConnection{ 4 private Connection con = null; 5 private static final String DRIVER = "com.mysql.jdbc.Driver"; 6 private static final String USER = "root"; 7 private static final String URL = "jdbc:mysql://localhost:3306/mldn"; 8 private static final String PASS = "12345"; 9 public DatabaseConnection()throws Exception{ 10 Class.forName(DRIVER); 11 con = DriverManager.getConnection(URL,USER,PASS); 12 } 13 public Connection getConnection()throws Exception{ 14 return con; 15 } 16 public void close()throws Exception{ 17 if(con!=null){ 18 con.close(); 19 } 20 } 21 }
3.IEmpDAO.java
1 package org.dao; 2 import java.util.List; 3 import org.vo.*; 4 public interface IEmpDAO{ 5 public boolean doCreate(Emp emp)throws Exception; 6 public List<Emp> findAll()throws Exception; 7 public Emp findById(int empno)throws Exception; 8 }
4.EmpDAOImpl.java
1 package org.dao.impl; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 public class EmpDAOImpl implements IEmpDAO{ 7 private Connection con; 8 private PreparedStatement stat = null; 9 public EmpDAOImpl(Connection con){ 10 this.con = con; 11 } 12 public boolean doCreate(Emp emp)throws Exception{ 13 String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)"; 14 stat = con.prepareStatement(sql); 15 stat.setInt(1,emp.getEmpno()); 16 stat.setString(2,emp.getEname()); 17 stat.setString(3,emp.getJob()); 18 stat.setDate(4,new java.sql.Date(emp.getHireDate().getTime())); 19 stat.setFloat(5,emp.getSal()); 20 int update = stat.executeUpdate(); 21 if(update>0){ 22 return true; 23 } 24 else{ 25 return false; 26 } 27 } 28 public List<Emp> findAll()throws Exception{ 29 String sql = "SELECT empno,ename,job,hiredate,sal FROM emp"; 30 stat = con.prepareStatement(sql); 31 ResultSet rs = stat.executeQuery(); 32 Emp emp = null; 33 List<Emp> list = new ArrayList<Emp>(); 34 while(rs.next()){ 35 int empno = rs.getInt(1); 36 String ename = rs.getString(2); 37 String job = rs.getString(3); 38 float sal = rs.getFloat(5); 39 emp = new Emp(); 40 emp.setEmpno(empno); 41 emp.setEname(ename); 42 emp.setJob(job); 43 emp.setHireDate(rs.getDate(4)); 44 emp.setSal(sal); 45 list.add(emp); 46 } 47 return list; 48 } 49 public Emp findById(int empno)throws Exception{ 50 String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?"; 51 stat = con.prepareStatement(sql); 52 stat.setInt(1,empno); 53 ResultSet rs = stat.executeQuery(); 54 Emp emp = null; 55 if(rs.next()){ 56 String ename = rs.getString(2); 57 String job = rs.getString(3); 58 float sal = rs.getFloat(5); 59 emp = new Emp(); 60 emp.setEmpno(empno); 61 emp.setEname(ename); 62 emp.setJob(job); 63 emp.setHireDate(rs.getDate(4)); 64 emp.setSal(sal); 65 } 66 return emp; 67 } 68 }
5.EmpDAOProxy.java
1 package org.dao.impl; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 import org.dbc.*; 7 public class EmpDAOProxy implements IEmpDAO{ 8 private DatabaseConnection dbc; 9 private IEmpDAO dao = null; 10 public EmpDAOProxy()throws Exception{ 11 dbc = new DatabaseConnection(); 12 dao = new EmpDAOImpl(dbc.getConnection()); 13 } 14 public boolean doCreate(Emp emp)throws Exception{ 15 boolean flag = false; 16 if(dao.findById(emp.getEmpno())==null){ 17 flag = dao.doCreate(emp); 18 } 19 dbc.close(); 20 return flag; 21 } 22 public List<Emp> findAll()throws Exception{ 23 List<Emp>list = dao.findAll(); 24 dbc.close(); 25 return list; 26 } 27 public Emp findById(int empno)throws Exception{ 28 Emp emp = dao.findById(empno); 29 dbc.close(); 30 return emp; 31 } 32 }
6.DAOFactory.java
1 package org.dao.factory; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 import org.dbc.*; 7 import org.dao.impl.*; 8 public class DAOFactory{ 9 public static IEmpDAO getInstance(){ 10 IEmpDAO dao = null; 11 try{ 12 dao = new EmpDAOProxy(); 13 } 14 catch(Exception e){ 15 e.printStackTrace(); 16 } 17 return dao; 18 } 19 }
7.TestDAO.java
1 package org.dao.test; 2 import org.dao.factory.*; 3 import org.vo.*; 4 import org.dao.*; 5 public class TestDAO{ 6 public static void main(String args[])throws Exception{ 7 Emp emp = null; 8 for(int i=0;i<5;i++){ 9 emp = new Emp(); 10 emp.setEmpno(i); 11 emp.setEname("xiazdong-"+i); 12 emp.setJob("stu-"+i); 13 emp.setHireDate(new java.util.Date()); 14 emp.setSal(500*i); 15 DAOFactory.getInstance().doCreate(emp); 16 } 17 } 18 }
通过DAO设计模式,可以在JSP中屏蔽了数据库连接的操作,达到JSP只负责显示的效果。