DAO设计模式及其实现类
DAO(Data Access Object ,数据访问对象)设计模式。设计访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO。
作用:为了实现功能的模块化,更有利于代码的维护和升级。
DAO由以下6部分组成
在整个DAO中实际上都是以接口为操作标准的,即:客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现。DAO由以下几个部分组成。
1)、DatabaseConnection数据库连接类: 专门负责数据库打开与关闭的类,即连接数据库并获取连接对象。
2)、VO实体类:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录,即包含属性和表中字段完全对应的类。
3)、DAO接口:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等,即提供了用户所有的操作方法(就如老师给学生提供一些学习方法)。
4)、Impl(DAO实现类): DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭,即实现DAO中所有的方法(就如老师给提供的方法看你如何去完成);
5)、Proxy :代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作
6)、Factory(DAO工厂类):通过工厂类取得一个DAO的实例化对象,为程序提供方法,如果要替换DAO实现类,只需要修改该Dao工厂类中的方法代码,而不必邀修改所有的操作数据库代码(如代理人专门为需要的公司提供人才,也叫做服务层)。
1.BaseDAO抽象类
设计一个抽象类BaseDAO,这个类中封装了通用的方法,而不是针对某个具体类。
public abstract class BaseDAO {
//通用的增删改方法---version 2.0(考虑上事务)
public int testGeneralMethod(Connection conn, String sql, Object...args){
//sql中占位符的个数与可变形参的个数相同
PreparedStatement ps = null;
try {
//1.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//2.填充占位符
for(int i = 0 ; i<args.length ; i++){
ps.setObject(i + 1 ,args[i]);
}
//3.执行,返回影响了几条记录
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally{
// //4.恢复每次DML操作的自动提交功能
// try {
// conn.setAutoCommit(true);
// } catch (SQLException e) {
// e.printStackTrace();
// }
//5.关闭资源,Connection定义在外面就外面关,里面别关
JDBCUtils.closeResource(null, ps);
}
return 0;
}
//通用的查询操作,用于返回表中的一条记录(version 2.0,考虑上事务)
public <T> T getInstance(Connection conn, Class<T> clazz, String sql, Object...args){
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
//填充占位符
for(int i=0 ; i < args.length ; i++){
ps.setObject(i+1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.