文章介绍
jdbc链接数据库进行增删改查时,会出现许多冗余比较强,不够美观的代码。对代码进行合理的封装不仅利于查看,更对运行速度有很大的提升。
本片文章以插入操作为例,简单介绍了数据库操作时一些简单的封装,如果大家有更好的意见或建议,欢迎在讨论区交流。
插入封装
题目:我要往员工表里面插入一名员工数据,这名员工有以下属性:
name, idCard, gender, age, birth, profession, telephone, state
Person person = new Person(name, idCard, gender, age, birth, profession, telephone, state);
问题:假如我直接将学生的这些值作为参数去生成sql语句,那么就会造成数据冗余,并且代码看起来特别不整齐。还不利于sql语句的编写。
解决:将这些信息封装成一个数组对象,采取动态传参的形式,生成sql语句,进行数据库操作
//要插入的对象
Person person = new Person(name, idCard, gender, age, birth, profession, telephone, state);
//将对象的信息采用数组存起来。
Object[] obj = { person.getName(), person.getIdcard(), person.getGender(), person.getAge(), person.getBirth(),
person.getProfession(), person.getTelephone(), person.getState() };
//调用生成sql语句的方法
boolean complete =serviceImpl.insertPerson(obj);
//sql语句生成方法 这里采用了动态传参
public boolean insertPerson(Object...obj) {
String sql="insert into person values(null,?,?,?,?,?,?,?,?)";
//进行数据库操作
return daoImp.insertPerson(sql, obj);
}
//进行数据库操作
public boolean insertPerson(String sql, Object... obj) {
Connection con = null;
PreparedStatement pstmt = null;
con = UtilityC3P0.getConnection();
try {
pstmt = con.prepareStatement(sql);
//通过使用for循环的方式,将sql的每一个未知属性值(就是?)赋值
//注意:为sql属性值赋值时,从下表1开始
for (int a = 0; a < obj.length; a++) {
pstmt.setObject(a + 1, obj[a]);
}
int result = pstmt.executeUpdate();
if (result > 0) {
return true;
} else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭数据库,此处也是采用了动态传参的方式
//原因:有时候需要获取结果值,有时候不需要,如果不采用动态传参,就得分别写不同的关闭数据库访问的方法,会非常的麻烦
UtilityC3P0.closeAll(con,pstmt);
}
return false;
}
//关闭数据库访问方法的封装
UtilityC3P0类
public static void closeAll(AutoCloseable...closeables) {
for(AutoCloseable closeable:closeables) {
if(closeable!=null) {
try {
closeable.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
AutoCloseable接口是一个释放数据库资源的方法,主要用于资源管理,在数据库释放资源方面可以减少许多代码的复用。