一、DbUtils组件
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简
单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会
影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
二、DbUtils组件的使用
DbUtils组件,
1.简化jdbc操作
2.引入jar文件 : commons-dbutils-1.6.jar
三、DbUtils组件的API
DbUtils组件的核心类是QueryRunner 对象。
该对象有两个方法update()和query()。这两个方法对应了多个方法重载,来适应不同的场景。
update(),执行增、删、改sql。
query(),执行查询方法。
+++ DbUtils组件的API
|-- DbUtils 关闭资源、加载驱动
DbUtils.loadDriver(driverClassName)
加载驱动,相当于 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
DbUtils.close(conn);
DbUtils.close(stmt);
DbUtils.close(rs);
关闭资源对象。
|-- QueryRunner 组件的核心工具类:
定义了所有的与数据库操作的方法(查询、更新)
|-- 更新
执行更新带一个占位符的sql
Int update(Connection conn, String sql, Object param);
执行更新带多个占位符的sql
Int update(Connection conn, String sql, Object… param);
批处理
Int[] batch(Connection conn, String sql, Object[][] params)
|-- 查询
T query(Connection conn ,String sql, ResultSetHandler<T> rsh, Object... params) 查询方法
注意: 如果调用DbUtils组件的操作数据库方法,没有传入连接对象,
那么在实例化QueryRunner对象的时候需要传入数据源对象:
QueryRunner qr = new QueryRunner(ds);
+++ DbUtils提供的封装结果的一些对象:
1) BeanHandler: 查询返回单个对象
2) BeanListHandler: 查询返回list集合,集合元素是指定的对象
3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
5) ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用)
6) MapHandler 查询返回结果的第一条记录封装为map
项目优化
对之前的注册功能,优化,引入dbutils组件!
要求:
BaseDao.java
查询、更新的通用的方法!
其他的dao就继承baseDao即可!
3.1 update更新操作(增、删、改)
3.1.1 执行更新,不带有参数
@Test
public void demo1() throws SQLException {
String sql="update student set id=12";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
int row = qr.update(conn, sql);
DbUtils.close(conn);
System.out.println(row==0?"插入失败":"插入成功");
}
3.1.2 执行更新,带有参数
@Test
public void demo() throws SQLException {
String sql="insert into student(name,chinese) values(?,?)";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
int row = qr.update(conn, sql, "小白",2);
DbUtils.close(conn);
System.out.println(row==0?"插入失败":"插入成功");
}
3.1.3 执行更新,批处理
@Test
public void testBatch() throws Exception {
String sql="insert into student(name,chinese) values(?,?)";
Connection conn = JdbcUtil.getConn();
QueryRunner qr = new QueryRunner();
qr.batch(conn, sql, new Object[][]{ {"jack1",12},{"jack2",11} });
conn.close();
}
3.2 query查询操作(查)
3.2.1 自定义结果集处理器
public class DbUtilsDemo {
@Test
public void demo1() throws SQLException {
String sql="select * from student where id=12";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
Student stu = qr.query(conn, sql, new ResultSetHandler<Student>() {
@Override
public Student handle(ResultSet rs) throws SQLException {
Student s=null;
while(rs.next()) {
s=new Student();
s.setId(rs.getInt(1));
s.setName(rs.getString(2));
s.setChinese(rs.getInt(3));
}
return s;
}
});
DbUtils.close(conn);
System.out.println(stu);
}
3.2.2 结果集处理器 - BeanHandler (返回单个对象,取结果集中的第一条数据封装)
@Test
public void demo2() throws SQLException{
String sql="select * from student where id = ?";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
Student stu = qr.query(conn, sql, new BeanHandler<Student>(Student.class), 12);
DbUtils.close(conn);
System.out.println(stu);
}
BeanHandler 获取结果集的第一条数据,将其封装为对应的对象。
控制台打印:
Student [id=12, name=xx, chinese=12]
3.2.3 结果集处理器 - BeanListHandler(返回多个对象,封装结果集)
@Test
public void demo3() throws SQLException{
String sql="select * from student";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
List<Student> list = qr.query(conn, sql, new BeanListHandler<Student>(Student.class));
DbUtils.close(conn);
System.out.println(list);
}
BeanListHandler:将结果集的每一行数据封装为对象,然后放在list集合中,并返回。
控制台打印:
[Student [id=12, name=xx, chinese=12],
Student [id=12, name=xx, chinese=12],
Student [id=12, name=xx, chinese=12],
Student [id=12, name=小白, chinese=2],
Student [id=0, name=jack1, chinese=12],
Student [id=0, name=jack2, chinese=11]]
3.2.4 结果集处理器 - ArrayHandler(查询返回结果记录的第一行,封装对对象数组, 即返回:Object[])
@Test
public void demo4() throws SQLException{
String sql="select * from student where id =?";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
Object[] arrs = qr.query(conn, sql, new ArrayHandler(),12);
DbUtils.close(conn);
System.out.println(Arrays.toString(arrs));
}
ArrayHandler:取结果集中的第一条数据,封装为数组对象。
控制台打印:
[12, xx, 12.0, 23.0, null, null, null]
3.2.5 结果集处理器 - ArrayListHandler(把查询的每一行都封装为数组对象,再添加到list集合中)
@Test
public void demo5() throws SQLException{
String sql="select * from student ";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
List<Object[]> query = qr.query(conn, sql, new ArrayListHandler());
DbUtils.close(conn);
System.out.println(query);
}
3.2.6 结果集处理器 - ScalarHandler(查询返回结果记录的第一行的第一列)
@Test
public void demo6() throws SQLException{
String sql="select count(*) from student ";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
Long num = qr.query(conn, sql, new ScalarHandler<Long>());
DbUtils.close(conn);
System.out.println(num);
}
3.2.7 结果集处理器 - MapHandler(查询返回结果的第一条记录封装为map)
@Test
public void demo7() throws SQLException{
String sql="select * from student where id=? ";
Connection conn = JdbcUtil.getConn();
QueryRunner qr=new QueryRunner();
Map<String, Object> map = qr.query(conn, sql, new MapHandler(),12);
DbUtils.close(conn);
System.out.println(map);
}
}