前言:
刚昨天分离了dao层代码:
自定义工具类分离Dao层
今天又学习了dbutils
这个工具组件:
我以为之前的分离dao层已经算是”极致”分离了,结果这个工具come out
让之前我写的那些冗余代码缩得只剩几行,真的是进步啊。
其实它的这个dbutils这个工具组件也算是封装了我的dao层,只是暴露了接口给我们调用而已。
工具是方便了操作 不过工具会让人变傻,让代码更像是粘贴复制的搬砖,
所以底层的实现还是得一清二楚。
主要需要的实体类:不过一般都是前两个就行了。
BeanHandler: 查询返回单个对象
BeanListHandler: 查询返回list集合,集合元素是指定的对象
ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用)
MapHandler 查询返回结果的第一条记录封装为map
class dbutils {
//处理单个更新
@Test
void updateTest() throws Exception {
Connection conn = jdbcUtil.getConnection();
QueryRunner queryRunner = new QueryRunner();
String sql = "INSERT INTO student values(?,?)";
queryRunner.update(conn, sql, 1, "聪聪");
DbUtils.close(conn);
}
//批量处理修改操作
@Test
void batchTest() throws Exception {
Connection conn = jdbcUtil.getConnection();
QueryRunner queryRunner = new QueryRunner();
String sql = "INSERT INTO student(id,name) values(?,?)";
queryRunner.batch(conn, sql, new Object[][] { { 3, "丽萨" }, { 4, "凯莉" } });
DbUtils.close(conn);
}
// 自定义方法
@Test
public void testquery() throws Exception {
ResultSetHandler<Student> resultSetHandler = new ResultSetHandler<Student>() {
@Override
public Student handle(ResultSet arg0) throws SQLException {
if (!arg0.next()) {
return null;
}
ResultSetMetaData resultSetMetaData = arg0.getMetaData();
int count = resultSetMetaData.getColumnCount();
Student student = new Student();
for (int i = 0; i < count; i++) {
String name = resultSetMetaData.getColumnName(i+1);
Object value = arg0.getObject(name);
try {
BeanUtils.setProperty(student, name, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return student;
}
};
String sql = "SELECT *FROM student where id=?";
Connection conn = jdbcUtil.getConnection();
QueryRunner queryRunner = new QueryRunner();
Student student = queryRunner.query(conn, sql, resultSetHandler, 11);
System.out.println(student);
DbUtils.close(conn);
}
//处理单个查询
@Test
void QueryOneTest() throws Exception {
Connection conn = jdbcUtil.getConnection();
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT *FROM student where id=?";
Student student = queryRunner.query(conn, sql, new BeanHandler<Student>(Student.class), 11);
System.out.println(student);
DbUtils.close(conn);
}
//处理多个查询
@Test
void QueryManyTest() throws Exception {
Connection conn = jdbcUtil.getConnection();
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT *FROM student";
List<Student> students = queryRunner.query(conn, sql, new BeanListHandler<Student>(Student.class));
System.out.println(students);
DbUtils.close(conn);
}
}