DAO设计模式

DAO由以下几个部分组成:

DatabaseConnection:专门负责数据库的打开与关闭操作的类。

VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的没一条记录。

DAO:主要定义操作的接口,定义一系列数据库的原子性操作标准,如增加、修改、删除、按ID查询等。

Impl:DAO接口的真是实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭。

Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。

Factory:工厂类,通过工厂类取得一个DAO的实例化对象。


数据库连接类----DatabaseConnection.java

import java.sql.Connection;
import java.sql.DriverManager;


public class DatabaseConnection {

	private static final String DBDRIVER = "com.mysql.jdbc.Driver";
	private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/ihubdb";
	private static final String DBUSER ="root";
	private static final String DBPASSWORD="password";
	private Connection conn = null;
	public DatabaseConnection() throws Exception{
		try{
			Class.forName(DBDRIVER);
			this.conn = DriverManager.getConnection(DBURL, DBUSER,DBPASSWORD);
		}catch (Exception e){
			throw e;
		}
	}
	public Connection getConnection(){
		return this.conn;
	}
	public void close() throws Exception{
		if (this.conn!=null){
			try{
				this.conn.close();
			}catch(Exception e){
				throw e;
			}
		}
	}
}
定义对应的VO类----Emp.java

import java.util.Date;

public class Emp {

	private int empno;
	private String ename;
	private String job;
	private Date hiredate;
	private float sal;
	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 String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	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;
	}
	
	
}

定义DAO操作标准----IEmpDAO.java

import java.util.List;


public interface IEmpDAO {

	//数据的增加操作,一般以doXxx的方式命名
	public  boolean doCreate(Emp emp) throws Exception;
	//查询全部的数据,一般以findXxx的方式命名
	public List<Emp> findAll(String keyWord) throws Exception;
	//根据雇员编号查询雇员信息
	public Emp findById(int empno) throws Exception;
}

真实主题实现类----EmpDAOImpl.java

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;


public class EmpDAOImpl implements IEmpDAO{
	
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	public EmpDAOImpl(Connection conn){
		this.conn=conn;
	}

	@Override
	public boolean doCreate(Emp emp) throws Exception {
		// TODO Auto-generated method stub
		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;
	}

	@Override
	public List<Emp> findAll(String keyWord) throws Exception {
		// TODO Auto-generated method stub
		List<Emp> all = new ArrayList<Emp>();
		String sql = "select empno,ename,job,hiedate,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;
	}

	@Override
	public Emp findById(int empno) throws Exception {
		// TODO Auto-generated method stub 
		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;
	}

	
}

代理主题实现类----IEmpDAOProxy.java

import java.util.List;


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());
	}
	@Override
	public boolean doCreate(Emp emp) throws Exception {
		// TODO Auto-generated method stub
		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;
	}

	@Override
	public List<Emp> findAll(String keyWord) throws Exception {
		// TODO Auto-generated method stub
		List<Emp> all = null;
		try{
			all = this.dao.findAll(keyWord);
		}catch (Exception e){
			throw e;
		}finally{
			this.dbc.close();
		}
		return all;
	}

	@Override
	public Emp findById(int empno) throws Exception {
		// TODO Auto-generated method stub
		Emp emp = null;
		try{
			emp = this.dao.findById(empno);
		}catch (Exception e ){
		throw e;
		}finally{
			this.dbc.close();
		}
		return emp;
	}

	
}
DAO工厂类----DAOFactory



public class DAOFactory {

public class DAOFactory {

	public static IEmpDAO getIEmpDAOInstance() throws Exception{//取得DAO接口实例
		return new EmpDAOProxy();//取得代理类的实例
	}
}
测试查询操作----TestDAOFactory.java

import java.util.Iterator;
import java.util.List;


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.getEname());
			}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值