1.增、删、改的代码类似因此可以使用同一个代码块,提高代码的复用
public static int commonsUpdate(String sql,Object...ob){//传入sql语句以及可变长参数代表多个属性
//增删改DAO的代码类似因此封装在同一个方法中
Connection conn=null;
PreparedStatement ps=null;
try {
conn= DruidDBUtils.getConnection();
ps=conn.prepareStatement(sql);
//这里采用for循环将每一个属性挨个赋值
for (int i=0;i<ob.length;i++){
//这里一会测试以下i能否为1;测试完毕i可以为1
ps.setObject(i+1,ob[i]);
}
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DruidDBUtils.closeAll(ps,conn);
}
return 0;
2.查询的代码块封装,因为不知实体属性与表字段的对应关系所以采用映射的方式解决这个问题
public static <T> List<T> commonsQuery(String sql,Class<T> cla,Object...ob){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
List<T> list=new ArrayList<>();
try {
conn= DruidDBUtils.getConnection();
ps=conn.prepareStatement(sql);
for (int i=0;i<ob.length;i++){
//这里一会测试以下i能否为1
ps.setObject(i+1,ob[i]);
}
rs=ps.executeQuery();
//
while (rs.next()){
Field[] fields=cla.getDeclaredFields();
T t=cla.newInstance();//实例化对象
for (Field f:fields){//因为要使得表字段与实体属性一一对应所以采用映射的方式
Object value= rs.getObject(f.getName());
f.setAccessible(true);//获取准许
f.set(t,value);//给对象赋值
}
list.add(t);//将对象存入集合中
}
return list;//返回集合
} catch (Exception e) {
e.printStackTrace();
}finally {
DruidDBUtils.closeAll(rs,ps,conn);//关闭数据库
}
return null;
}