DAO 设计模式

来源:互联网 发布:网络舆情监控的目的 编辑:程序博客网 时间:2024/06/02 20:11

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());}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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
原创粉丝点击