Model1方式实现DAO设计模式

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>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值