您的位置:首页 > 数据库 > Oracle

DAO设计模式之数据层的构造

2017-06-04 00:00 323 查看

DAO设计模式之数据层的构造

1.0 框架图



1.1 需求分析

使用雇员数据的添加,但是需要保证被添加的雇员编号不会重复;

实现雇员数据的修改操作

实现多个雇员数据的删除操作

可以查询所有雇员的信息

可以实现数据的分布显示,同时又可以返回所有的雇员数量。

1.2 数据库的连接类 dbc

取得数据库的连接

DataBaseConnection();

getConnection();

close();

1.3 开发valueObjectvo

简单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);

}

}

使用工厂的特征就是不知道外层有什么子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息