Model1方式实现DAO设计模式

来源:互联网 发布:陈妍希表情包淘宝 编辑:程序博客网 时间:2024/05/16 15:31
DAO由以下几个部分组成:
DatabaseConnection:专门负责数据库的打开和关闭操作的类,仅此而已,不参与数据库的其他操作。
VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类对象都表示表中的每一条记录。
DAO:主要定义操作的接口,定义一系列数据库的原子性操作,如增加、修改、删除、按ID查询等。
Impl:DAO接口的真是实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭(因为已经由DatabaseConnection完成了)。
Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。
Factory:工程类,通过工厂类取得一个DAO的实例化对象。

下面通过一个简单的例子说明这一点,客户端负责对数据的显示、插入等操作。相关类图如下所示:

emp.java

package wml.vo ;import java.util.Date ;public class Emp {private int empno ;private String ename ;private String job ;private Date hiredate ;private float sal ;public void setEmpno(int empno){this.empno = empno ;}public void setEname(String ename){this.ename = ename ;}public void setJob(String job){this.job = job ;}public void setHiredate(Date hiredate){this.hiredate = hiredate ;}public void setSal(float sal){this.sal = sal ;}public int getEmpno(){return this.empno ;}public String getEname(){return this.ename ;}public String getJob(){return this.job ;}public Date getHiredate(){return this.hiredate ;}public float getSal(){return this.sal ;}}

DatabaseConnection.java
package wml.dbc ;import java.sql.Connection ;import java.sql.DriverManager ;public class DatabaseConnection {private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; private static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ;private static final String DBUSER = "root" ;private static final String DBPASSWORD = "mysqladmin" ;private Connection conn ;public DatabaseConnection() throws Exception {Class.forName(DBDRIVER) ;this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;}public Connection getConnection(){return this.conn ;}public void close() throws Exception {if(this.conn != null){try{this.conn.close() ;}catch(Exception e){throw e ;}}}}

IEmpDAO.java
package wml.dao ;import java.util.* ;import wml.vo.* ;public interface IEmpDAO {public boolean doCreate(Emp emp) throws Exception ;public List<Emp> findAll(String keyWord) throws Exception ;public Emp findById(int empno) throws Exception ;}

EmpDAOImpl.java
package wml.impl ;import java.util.* ;import java.sql.* ;import wml.dao.* ;import wml.vo.* ;public class EmpDAOImpl implements IEmpDAO {private Connection conn = null ;private PreparedStatement pstmt = null ;public EmpDAOImpl(Connection conn){this.conn = conn ;}public boolean doCreate(Emp emp) throws Exception{boolean flag = false ;String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES (?,?,?,?,?)" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setInt(1,emp.getEmpno()) ;this.pstmt.setString(2,emp.getEname()) ;this.pstmt.setString(3,emp.getJob()) ;this.pstmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime())) ;this.pstmt.setFloat(5,emp.getSal()) ;if(this.pstmt.executeUpdate() > 0){flag = true ;}this.pstmt.close() ;return flag ;}public List<Emp> findAll(String keyWord) throws Exception{List<Emp> all = new ArrayList<Emp>() ;String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setString(1,"%"+keyWord+"%") ;this.pstmt.setString(2,"%"+keyWord+"%") ;ResultSet rs = this.pstmt.executeQuery() ;Emp emp = null ;while(rs.next()){emp = new Emp() ;emp.setEmpno(rs.getInt(1)) ;emp.setEname(rs.getString(2)) ;emp.setJob(rs.getString(3)) ;emp.setHiredate(rs.getDate(4)) ;emp.setSal(rs.getFloat(5)) ;all.add(emp) ;}this.pstmt.close() ;return all ;}public Emp findById(int empno) throws Exception{Emp emp = null ;String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setInt(1,empno) ;ResultSet rs = this.pstmt.executeQuery() ;if(rs.next()){emp = new Emp() ;emp.setEmpno(rs.getInt(1)) ;emp.setEname(rs.getString(2)) ;emp.setJob(rs.getString(3)) ;emp.setHiredate(rs.getDate(4)) ;emp.setSal(rs.getFloat(5)) ;}this.pstmt.close() ;return emp ;}}

EmpDAOProxy.java

package wml.proxy ;import java.util.* ;import java.sql.* ;import wml.dao.* ;import wml.dbc.* ;import wml.dao.impl.* ;import wml.vo.* ;public class EmpDAOProxy implements IEmpDAO {private DatabaseConnection dbc = null ;private IEmpDAO dao = null ;//真实主题public EmpDAOProxy() throws Exception {this.dbc = new DatabaseConnection() ;//负责数据库的打开和关闭this.dao = new EmpDAOImpl(this.dbc.getConnection()) ;}public boolean doCreate(Emp emp) throws Exception{boolean flag = false ;try{if(this.dao.findById(emp.getEmpno()) == null){//增加了“添加”前的判断flag = this.dao.doCreate(emp) ;}}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return flag ;}public List<Emp> findAll(String keyWord) throws Exception{List<Emp> all = null ;try{all = this.dao.findAll(keyWord) ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return all ;}public Emp findById(int empno) throws Exception{Emp emp = null ;try{emp = this.dao.findById(empno) ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return emp ;}}

DAOFactory.java
package wml.factory ;import wml.dao.IEmpDAO ;import wml.dao.proxy.EmpDAOProxy ;public class DAOFactory {public static IEmpDAO getIEmpDAOInstance() throws Exception{return new EmpDAOProxy() ;}}

客户端中的测试类如下:
(1)
TestDAOSelect.java
package cn.mldn.lxh.dao.test ;import java.util.* ;import wml.factory.DAOFactory ;import wml.vo.* ;public class TestDAOSelect{public static void main(String args[]) throws Exception{List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll("") ;Iterator<Emp> iter = all.iterator() ;while(iter.hasNext()){Emp emp = iter.next() ;System.out.println(emp.getEmpno() + "、" + emp.getEname() + " --> " + emp.getJob()) ;}}}

(2)
TestDAOInsert.java
package wml.dao.test ;import wml.factory.DAOFactory ;import wml.vo.* ;public class TestDAOInsert{public static void main(String args[]) throws Exception{Emp emp = null ;for(int x=0;x<5;x++){emp = new Emp() ;emp.setEmpno(1000 + x) ;emp.setEname("Jefferson- " + x) ;emp.setJob("程序员 - " + x) ;emp.setHiredate(new java.util.Date()) ;emp.setSal(500 * x) ;DAOFactory.getIEmpDAOInstance().doCreate(emp) ;}}}


JSP页面如下:
查询页:
<%@ page contentType="text/html" pageEncoding="GBK"%><%@ page import="wml.factory.*,wml.vo.*"%><%@ page import="java.util.*"%><html><head><title>这是标题</title></head><%request.setCharacterEncoding("GBK") ;%><body><%String keyWord = request.getParameter("kw") ;if(keyWord == null){keyWord = "" ;// 如果没有查询关键字,则查询全部}List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll(keyWord) ;Iterator<Emp> iter = all.iterator() ;%><center><form action="emp_list.jsp" method="post">请输入查询关键字:<input type="text" name="kw"><input type="submit" value="查询"></form><table border="1" width="80%"> <tr><td>雇员编号</td><td>雇员姓名</td><td>雇员工作</td><td>雇佣日期</td><td>基本工资</td></tr><%while(iter.hasNext()){Emp emp = iter.next() ;%><tr><td><%=emp.getEmpno()%></td><td><%=emp.getEname()%></td><td><%=emp.getJob()%></td><td><%=emp.getHiredate()%></td><td><%=emp.getSal()%></td></tr><%}%></table></center></body></html>

插入页:
<%@ page contentType="text/html" pageEncoding="GBK"%><html><head><title>这是标题</title></head><body><form action="emp_insert_do.jsp" method="post">雇员编号:<input type="text" name="empno"><br>雇员姓名:<input type="text" name="ename"><br>雇员职位:<input type="text" name="job"><br>雇佣日期:<input type="text" name="hiredate"><br>基本工资:<input type="text" name="sal"><br><input type="submit" value="注册"><input type="reset" value="重置"></form></body></html>

<%@ page contentType="text/html" pageEncoding="GBK"%><%@ page import="cn.mldn.lxh.factory.*,cn.mldn.lxh.vo.*"%><%@ page import="java.text.*"%><html><head><title>这是标题</title></head><%request.setCharacterEncoding("GBK");%><body><%Emp emp = new Emp() ;emp.setEmpno(Integer.parseInt(request.getParameter("empno"))) ;emp.setEname(request.getParameter("ename")) ;emp.setJob(request.getParameter("job")) ;emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate"))) ;emp.setSal(Float.parseFloat(request.getParameter("sal"))) ;try{if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){%><h3>雇员信息添加成功!</h3><%} else {%><h3>雇员信息添加失败!</h3><%}%><%}catch(Exception e){e.printStackTrace() ;}%></body></html>