DAO: Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO
作用: 为了实现功能的模块化,更有利于代码的维护和升级。
下面是相关的体现
/**
DAO:data(base) access object (数据库访问对象)
封装了针对于数据表的通用操作(即通用的增删改查操作)
*/
public abstract class BaseDAO {
//BaseDAO只用于提供数据库操作的方法,不用于实例化对象,
//通用增删改
public int update(Connection conn, String sql, Object ...args){
//外部传入连接
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(null,ps);//注意:不要关闭外部传入的连接
}
return 0;
}
//通用查询单条语句
public <T> T getInstance(Connection conn,Class<T> class1,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 rsmd = rs.getMetaData();//获取结果集的元数据:ResultSetMetaData
int columnCount = rsmd.getColumnCount();//通过ResultSetMetaData获取结果集的列数
if (rs.next()){
T t = class1.newInstance();//创建类的对象
for (int i = 0; i < columnCount; i++) {
//处理一行结果集数据中的每一个列
Object columnValue = rs.getObject(i + 1);//获取列的列值
String columnName = rsmd.getColumnName(i + 1);//获取梅格列的列名
Field field = class1.getDeclaredField(columnName);//给cust对象指定的某个属性赋值为columnValue:通过反射
field.setAccessible(true);
field.set(t,columnValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(null,ps,rs);//关闭资源
}
return null;
}
//通用查询多语句
public <T> List<T> getForList(Connection conn,Class<T> class1, 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 rsmd = rs.getMetaData();//获取结果集的元数据:ResultSetMetaData
int columnCount = rsmd.getColumnCount();//通过ResultSetMetaData获取结果集的列数
ArrayList<T> list = new ArrayList<>();//创建集合对象
while (rs.next()){
T t = class1.newInstance();//创建类的对象
for (int i = 0; i < columnCount; i++) {
//处理一行结果集数据中的每一个列:给t对象指定的属性赋值
Object columnValue = rs.getObject(i + 1);//获取列的列值
String columnLabel = rsmd.getColumnLabel(i + 1);//获取梅格列的列名
Field field = class1.getDeclaredField(columnLabel);//给cust对象指定的某个属性赋值为columnValue:通过反射
field.setAccessible(true);
field.set(t,columnValue);
}
list.add(t);//将每条数据添加到集合中
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(null,ps,rs);//关闭资源
}
return null;
}
//用于查询特殊值的通用查询方法(组函数)
public <E> E getValue(Connection conn,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+1]);
}
rs = ps.executeQuery();
if (rs.next())