DAO设计模式之数据层的构造
2017-06-04 00:00
323 查看
DAO设计模式之数据层的构造
1.0 框架图
1.1 需求分析
使用雇员数据的添加,但是需要保证被添加的雇员编号不会重复;实现雇员数据的修改操作
实现多个雇员数据的删除操作
可以查询所有雇员的信息
可以实现数据的分布显示,同时又可以返回所有的雇员数量。
1.2 数据库的连接类 dbc包
取得数据库的连接DataBaseConnection();
getConnection();
close();
1.3 开发valueObject:vo包
简单java类实现java.io.Serializable接口
与表名称一致
类中属性不允许基本类型,必须包装类型。
属性必须封装
类中可以定义多个构造参数,但必须保留一个无参构造方法。
1.4 开发数据层
数据层最终是交给业务层调用的,所以业务层不需要知道如何实现的过程。两个独立的层之间需要一个标准。
数据层与数据库之间是JDBC
所以业务层与数据层之间也需要相应的标准。
1.4.1 开发数据层标准。定义接口IEmpDAO
对于数据层的接口的要求数据层既然是进行数据操作的,那么就将其保存在DAO包中。
不同的数据表的操作有可能使用不同的数据层开发,那么就针对于数据表命名。
-emp表,那么数据层的接口就应该宝库为IEmpDAO
对于整个数据层的开发严格来讲就两类功能
-数据更新:建议以doXxx()的形式命名,例如:doCreate(),doUpdate()
-数据查询:分为两种形式。
-查询表中数据:以findXxx()形式命名,例如:findByld()、findByName(),findAll()
-统计表中数据:getAll()
public interface IEmpDAO { /*实现数据的增加操作*/ public boolean doCreate(Emp vo) throws Exception; /*实现数据的修改操作,本次修改是根据id进行全部字段数据的修改*/ public boolean doUpdate(Emp vo) throws Exception; /** * 执行数据的批量删除操作,所要删除的数据以Set集合的形式保存 * @param ids 包含了所有要删除的数据ID,不包含有重复的内容。 * @return 删除成功返回true (删除的数据个数与要删除的数据个数相同),否则返回false. * @throws Exception SQL执行异常。 */ public boolean doRemoveBatch(Set<Integer> ids) throws Exception ; /** * 根据雇佣编号查询指定的雇员信息 * @param id 要查询的雇员编号 * @return 如果雇员信息存在,则将数据以VO类对象的形式返回,如果雇员数据不存在,则返回null * @throws Exception SQL 执行异常 */ public Emp findById(Integer id) throws Exception; /** * 查询指定数据表的全部记录,并且以集合的形式返回 * @return 如果表中有数据,则所有 的数据会封装为VO对象而后利用List集合返回,<br> * 如果没有数据,那么集合的长度为0(size() == 0,不是null) * @throws Exception SQL执行异常 */ public List<Emp> findAll() throws Exception; /** * 分页进行数据的模糊查询,查询结果以集合形式返回 * @param currentPage 当前所在的页 * @param lineSize 每有显示数据行数 * @param collum 要进行模糊查询的关键列 * @param keyWord 模糊查询的关键字 * @return 如果表中有数据,则所有的数据会封装为VO对象后利用List集合,<br> * 如果没有数据,那么集合的长度为0(size() == 0,不是null) * @throws Exception */ public List<Emp> findAllSplit(Integer current Page, Integer line Size, String column, String keyword) throws Exception; public Integer getAllCount(String colum,String keyword) throws Exception; }
1.4.2 数据层实现类。EmpDAOImpl
由于在开发中,业务层需要执行多个数据层的调用。数据库的打开与关闭操作应该由业务层控制会比较合理。所有的数据层实现类要求保存在dao.impl子包下。
范例:EmpDAOImpl
public class EmpDAOImpl implements IEmpDAO { private Connection conn; //需要利用Connection对象操作 private PreparedStatement pstmt; /** * 如果要想使用数据层进行原子性的功能操作实现,必须要提供有Connection接口对象<br> * 另外由于开发之中业务层要调用数据层,所以数据库的打开与关闭交由业务层处理 * * @param conn */ public EmpDAOImpl(Connection conn) { this.conn = conn; } @Override public boolean doCreate(Emp vo) throws Exception { String sql = "insert into emp(empno,ename,job,hiredate,sal,comm) values(?,?,?,?,?,?)"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, vo.getEmpno()); this.pstmt.setString(2, vo.getEname()); this.pstmt.setString(3, vo.getJob()); this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime())); this.pstmt.setDouble(5, vo.getSal()); this.pstmt.setDouble(6, vo.getComm()); /*判断是否插入成功*/ return this.pstmt.executeUpdate() > 0; } @Override public boolean doUpdate(Emp vo) throws Exception { String sql = "update emp set ename=?,job=?,hiredate=?,sal=?,comm=? where empno=? "; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(2, vo.getEname()); this.pstmt.setString(3, vo.getJob()); this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime())); this.pstmt.setDouble(5, vo.getSal()); this.pstmt.setDouble(6, vo.getComm()); this.pstmt.setInt(1, vo.getEmpno()); /*判断是否插入成功*/ return this.pstmt.executeUpdate() > 0; } @Override public boolean doRemoveBatch(Set<Integer> ids) throws Exception { if (ids == null || ids.size() == 0) { return false; } StringBuffer sql = new StringBuffer(); sql.append("delete from emp where empno in("); Iterator<Integer> iter = ids.iterator(); while (iter.hasNext()) { sql.append(iter.next()).append(","); } sql.delete(sql.length() - 1, sql.length()).append(")"); this.pstmt = this.conn.prepareStatement(sql.toString()); return this.pstmt.executeUpdate() == ids.size(); } @Override public Emp findById(Integer id) throws Exception { Emp vo = null; String sql = "select empno,ename,job,hiredate,sal,comm fom emp where empno = ?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); ResultSet rs = this.pstmt.executeQuery(); if (rs.next()) { vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); } return vo; } @Override public List<Emp> findAll() throws Exception { List<Emp> all = new ArrayList<Emp>(); String sql = "select empno,ename,job,hiredate,sal,comm fom emp"; this.pstmt = this.conn.prepareStatement(sql); ResultSet rs = this.pstmt.executeQuery(); while (rs.next()) { Emp vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); all.add(vo); } return all; }
1.4.3 定义数据层工厂类—DAOFactory
业务层想要进行数据层的调用,那么必须要取得IEmpDAO接口对象,但是不同层之间如果要想取得实例,需要使用工厂设计模式。这个工厂类将其保存在factory子包下。public class DAOFactory { public static IEmpDAO getIEmpDAOInstance(Connection connection) { return new EmpDAOImpl(connection); } }
使用工厂的特征就是不知道外层有什么子类。
相关文章推荐
- DAO设计模式之数据层的构造
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- 设计模式知识连载(39)---数据访问对象模式---本地存储DAO
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- [设计模式]DAO的实现方式探讨_Part II
- 设计模式实战:在WinForm中用Command模式实现可以撤销的数据操作
- J2EE之DAO设计模式
- 实现DAO 设计模式
- Struts+Hibernate模板开发笔记---设计模式:DAO
- 实现DAO 设计模式
- 本人初学设计模式时写的一个支持多数据库的数据访问接口
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(3)
- J2EE之DAO设计模式-----邵京国
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)
- J2EE之DAO设计模式
- 实现DAO 设计模式
- j2ee中DAO设计模式
- 设计模式--DAO
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)