dao:data access object 数据库访问对象
1.针对所有表的查询抽象类
这个类不具体实现,都由其他类继承并实现相应的表的具体操作
抽象类中也可以没有抽象方法
定义了所有数据库事务增删改查操作的基本实现方法
public abstract class BaseDao {
// 1.事务的增删改操作通用模板
// 主要是为了防止关闭连接后自动提交
public void update(Connection conn, String sql, Object...vals){
// 可变形参vals的数量就是占位符的数量
PreparedStatement ps=null;
try {
// 2,实例化PreparedStatement对象
ps=conn.prepareStatement(sql);
// 3.填充占位符
for(int i=0;i<vals.length;i++){
ps.setObject(i+1,vals[i]);
}
// 4.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
// 5.关闭资源
// conn在方法外打开,也需要在方法外关闭
JDBCUtils.closeResource(null,ps);
}
}
// 2.返回一个查询对象的方法
// <T>表示这是一个泛型方法,返回类型为T,T类型由实参传入
public <T> T getInstance(Connection conn,Class<T> clazz,String sql,Object...vals){
PreparedStatement ps= null;
ResultSet rs= null;
try {
// 2.预编译sql语句,占位符赋值
ps = conn.prepareStatement(sql);
for(int i=0;i<vals.length;i++){
ps.setObject(i+1,vals[i]);
}
// 3.获取结果集
rs = ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
// 4,生成返回的结果集对象
if(rs.next()){
// 通过声明的构造器,new一个T类型的对象
T t=clazz.getDeclaredConstructor().newInstance();
for(int i=0;i<columnCount;i++){
Object columnVal=rs.getObject(i+1);
String columnLabel=rsmd.getColumnLabel(i+1);
// 反射为对象属性赋值
Field field=t.getClass().getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t,columnVal);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 5.关闭资源连接
JDBCUtils.closeResource(null,ps,rs);
}
return null;
}
// 3.返回多个查询对象的方法
// 返回多条记录
public <T> List<T> getForList(Connection conn,Class<T> clazz, String sql, Object...vals){
PreparedStateme