Java Web笔记:DAO设计模式

DAO简介

DAO的全称是Data Access Object ,数据访问对象,主要功能是数据操作,在程序的标准开发中属于数据层的操作,开发框架如图:

其中业务层全称是Business Object ,业务对象,可以将多个原子性的DAO操作进行组合,形成一个完整的业务逻辑。

数据层:提供多个原子性的DAO操作,例如增加、删除、修改等,都是原子性的操作。对于一些小型的系统,一般只使用DAO模式就足够,而对于大型数据系统,业务关联较多时,则要使用BO进行操作。

在整个的DAO设计模式中,使用的是接口进行操作,客户端使用接口,服务端也使用接口实现业务逻辑。DAO主要由以下几个部分组成:

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

VO:主要由属性、setter、getter等构成,VO中的属性与表中的字段相对应,每一个VO类的对象都表示表中的一条记录;

DAO:主要定义操作的接口,定义数据库的原子性,增删改查等都是原子性的体现;

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

Proxy:代理实现,负责数据库的打开和关闭,调用真实实现类对象的操作;

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

数据库创建

创建名为emp的表,列名有:empno、ename、job、hiredate、sal。

定义对应的VO类

Emp.java

package com.zzh.test;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;}}

数据库连接类

DatabaseConnection.java

package com.zzh.test;import java.sql.Connection;import java.sql.DriverManager;public class DatabaseConnection {public static final String DBDRIVER = "com.mysql.jdbc.Driver";public static final String DBURL = "jdbc:mysql://localhost:3306/test";public static final String DBUSER = "用户名";public static final String DBPASS = "密码";private Connection conn = null;public DatabaseConnection() throws Exception {try {Class.forName(DBDRIVER);this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);} 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;}}}}定义DAO操作标准

IEmpDAO.java

package com.zzh.test;import java.util.List;public interface IEmpDAO { //定义DAO操作标准/** 数据库的增加操作,,一般用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

package com.zzh.test;import java.sql.Connection;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.mysql.jdbc.PreparedStatement;public class EmpDAOImpl implements IEmpDAO {private Connection conn = null;private PreparedStatement pstmt = null;public EmpDAOImpl(Connection conn) {this.conn = conn;}@Overridepublic boolean doCreate(Emp emp) throws Exception {// TODO Auto-generated method stubboolean flag = false;String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal)VALUES(?,?,?,?,?)";this.pstmt = (PreparedStatement) 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;}@Overridepublic List<Emp> findAll(String keyWord) throws Exception {// TODO Auto-generated method stubList<Emp> all = new ArrayList<Emp>();String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?";this.pstmt = (PreparedStatement) 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;}@Overridepublic Emp findById(int empno) throws Exception {// TODO Auto-generated method stubEmp emp = null;String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno = ?";this.pstmt = (PreparedStatement) 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

爱人,却不一定能够听懂。他们听见的,多是抱怨不休,心烦意乱。

Java Web笔记:DAO设计模式

相关文章:

你感兴趣的文章:

标签云: