DAO 设计模式

14 篇文章 0 订阅
14 篇文章 0 订阅

1. mysql语句如下所示;

在mysql中创建数据库,密码设置为sqladmin;

drop database if exists mldn; 
create database mldn;
use mldn;
drop table if exists emp;
create table emp(
empno   int(4)   primary key,
ename   varchar(10)  not null,
job      varchar(10)  not null, 
hiredate  date       not null,
sal     float(7,2)  not null
);
desc emp; //查询表的结构
insert into emp (empno,ename,job,hiredate ,sal) values(1,'石也强','学生','2014-10-10','10000');
insert into emp (empno,ename,job,hiredate ,sal) values(2,'罗谨','工程师','2012-5-5','10000');
select *from emp;

 

2.  根据数据库中的字段定义对应的VO类,Emp.java

package shiyeqiang.vo; //value object 

import java.util.Date;

public class Emp {
 //本程序定义了雇员类,以及一序列的setter、getter方法,
	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;
	}
}

3. 定义数据库的连接及关闭资源类:DatabaseConnection.java

package shiyeqiang.dbc;

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

public class DatabaseConnection {
	// 该类主要是用于完成数据库的打开以及关闭操作
	// 在构造方法完成打开,close()方法完成关闭,所有异常直接抛出,交给调用处 处理
	public static void main(String[] args) {

	}

	private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; // 定义mysql中的数据库驱动程序
	private static final String DBURL = "jdbc:mysql://localhost:3306/mldn"; // 定义数据库的连接地址,其中mldn为数据库的名称
	private static final String DBUSER = "root"; // 定义数据库的连接用户名
	private static final String DBPASS = "sqladmin"; // 定义数据库的连接密码
	private Connection conn = null; // 数据库连接

	public DatabaseConnection() throws Exception {
		// 在构造方法内,进行数据库的连接操作
		try {
			Class.forName(DBDRIVER); // 加载驱动
			conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);// 试图建立到给定数据库
		} catch (Exception e) { // 为了方便,直接抛出Exception异常
			throw e;
		}

	}

	public Connection getConnection() { // 取得数据库的连接
		return this.conn;
	}

	public void close() throws SQLException {
		if (this.conn != null) {
			try {
				this.conn.close();
			} catch (SQLException e) {
				throw e;
			}
		}
	}
}
  

4:   定义DAO操作的标准,IEmpDAO接口内部定义一序列的操作接口


package shiyeqiang.dao;

import java.util.List;

import shiyeqiang.vo.Emp; //导入雇员类所在的VO包

public interface IEmpDAO { // 定义DAO操作的标准;

	// doXXX:表示数据的增加操作
	public boolean doCreate(Emp emp) throws Exception;

	// findAll:表示数据的查询操作,返回的是Emp的list集合
	public List<Emp> findAll(String keyWord) throws Exception;

	// findById:表示根据员工编号查询,返回的是Emp对象
	public Emp findById(int empno) throws Exception;

}


5:   定义真实主题实现类:实现具体的操作 EmpDAOImpl

package shiyeqiang.dao.impl;

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

import shiyeqiang.dao.IEmpDAO;
import shiyeqiang.vo.Emp;

public class EmpDAOImpl implements IEmpDAO { // 真实主题实现类
	// 真实主题没有进行数据库的打开和关闭操作,只是通过构造方法取得了数据库的连接
	// 真正负责数据库的打开和关闭操作交给代理类完成
	
	private Connection conn = null; // 数据库连接对象
	private PreparedStatement psmt = null;// 数据操作对象

	public EmpDAOImpl(Connection conn) { // 通过构造方法完成数据库的连接
		this.conn = conn;

	}

	@Override
	// 数据更新操作,将emp对象插入到数据库中,
	public boolean doCreate(Emp emp) throws Exception {
		boolean flag = false;
		String sql = "insert into emp (empno,ename,job,hiredate ,sal) values(?,?,?,?,?)"; // 插入语句
		this.psmt = this.conn.prepareStatement(sql);
		this.psmt.setInt(1, emp.getEmpno()); // 下面为依次给?号赋值的操作
		this.psmt.setString(2, emp.getEname());
		this.psmt.setString(3, emp.getJob());
		this.psmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));
		this.psmt.setFloat(5, emp.getSal());
		int num = this.psmt.executeUpdate(); // 数据更新的操作,返回记录的条数
		if (num > 0) {
			flag = true;
		}
		this.psmt.close(); // 数据操作对象关闭
		return flag;
	}

	@Override
	// findAll:表示数据的查询操作,返回的是Emp的list集合
	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.psmt = this.conn.prepareStatement(sql); // 准备数据操作
		this.psmt.setString(1, "%" + keyWord + "%");
		this.psmt.setString(2, "%" + keyWord + "%");
		ResultSet rs = this.psmt.executeQuery();
		Emp emp = null;
		while (rs.next()) {
			emp = new Emp();
			int empno = rs.getInt(1);
			String ename = rs.getString(2);
			String job = rs.getString(3);
			Date hiredate = rs.getDate(4);
			float sal = rs.getFloat(5);
			emp.setEmpno(empno);
			emp.setEname(ename);
			emp.setJob(job);
			emp.setHiredate(hiredate);
			emp.setSal(sal);
			all.add(emp);
		}
		this.psmt.close();
		return all;
	}

	@Override
	// findById:表示根据员工编号查询,返回的是Emp对象
	public Emp findById(int empno) throws Exception {

		String sql = "select empno,ename,job,hiredate ,sal from emp where empno=?"; // 将雇员的姓名和职位定义成模糊查询
		this.psmt = this.conn.prepareStatement(sql); // 准备数据操作
		this.psmt.setInt(1, empno);
		ResultSet rs = this.psmt.executeQuery();
		Emp emp = null;
		while (rs.next()) {
			emp = new Emp();
			int no = rs.getInt(1);
			String ename = rs.getString(2);
			String job = rs.getString(3);
			Date hiredate = rs.getDate(4);
			float sal = rs.getFloat(5);
			emp.setEmpno(no);
			emp.setEname(ename);
			emp.setJob(job);
			emp.setHiredate(hiredate);
			emp.setSal(sal);

		}
		this.psmt.close();
		return emp;
	}

}

6: 代理主题实现类:EmpDAOProxy

 代理类的作用:连接数据库,调用真实的主题类来完成操作,资源的关闭在每一个方法内部

package shiyeqiang.dao.proxy;

import java.util.List;

import shiyeqiang.dao.IEmpDAO;
import shiyeqiang.dao.impl.EmpDAOImpl;
import shiyeqiang.dbc.DatabaseConnection;
import shiyeqiang.vo.Emp;

public class EmpDAOProxy implements IEmpDAO { // 代理类的作用:连接数据库,调用真实的主题类来完成操作,资源的关闭在每一个方法内部
	public static void main(String[] args) {

	}

	private DatabaseConnection dbc = null; // 定义连接数据库的操作
	private EmpDAOImpl 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 {
		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 {

		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 {
		Emp emp = null;
		try {
			emp = this.dao.findById(empno);

		} catch (Exception e) {
		} finally {
			this.dbc.close();
		}
		return emp;
	}

}

7:工厂类:取得代理类的实例

package shiyeqiang.factory;

import shiyeqiang.dao.proxy.EmpDAOProxy;

public class DAOFactory { // 取得DAO接口的实例化对象

	public static EmpDAOProxy getIEmpDAOInstance() throws Exception {

		return new EmpDAOProxy(); // 取得代理类的实例
	}

}

8:测试代码:

package text;

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

import shiyeqiang.factory.DAOFactory;
import shiyeqiang.vo.Emp;

public class TetsInsect {

	public static void main(String[] args) throws Exception {

		List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll("");
		Iterator<Emp> iterator = all.iterator();
		while (iterator.hasNext()) {
			Emp emp = iterator.next();
			System.out
					.println("编号:" + emp.getEmpno() + " 姓名:" + emp.getEname());
		}
	}

}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值