DBUtils是Apache Commons组件中的一员,DBUtils的Jar包是dbutils.jar,开源免费,DBUtils是对JDBC的简单封装,可以把结果集转化成我们想要得到的形式,当前应用很广泛。
● DbUtils:DbUtils是一个为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,里面都是静态方法 ;
● QueryRunner:这个类使执行SQL查询简单化。提供了两个构造器:一个空构造器,一个 javax.sql.DataSource 作为参数的构造器。方法主要有:
update():执行insert、update、delete;
query():执行select语句;
batch():执行批处理。
QueryRunner的update()方法可以用来执行insert、update、delete语句。
● 使用QueryRunner
创建QueryRunner
构造器:QueryRunner();
update()方法
int update(Connection con, String sql, Object… params)
使用实例:
@Test
public void fun1() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into user values(?,?,?)";
qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
}
● 第二种方式使用QueryRunner
创建QueryRunner构造器:QueryRunner(DataSource)
update()方法
int update(String sql, Object… params)
这种方式在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。
@Test
public void fun2() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into user values(?,?,?)";
qr.update(sql, "u1", "zhangSan", "123");
}
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不需要自己去实现ResultSet接口了:
● MapHandler:单行处理器!把结果集转换成Map
● MapListHandler:多行处理器!把结果集转换成List
● BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
● BeanListHandler:多行处理器!把结果集转换成List
● ColumnListHandler:多行单列处理器!把结果集转换成List
● ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
Map处理器:
Column处理器:
Scalar处理器:
QueryRunner的查询方法是:
● public
● public
query()方法会通过sql语句和params查询出ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。
@Test
public void fun1() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student where number=?";
Map map = qr.query(sql, new MapHandler(), "S_2000"); //map
System.out.println(map);
}
@Test
public void fun2() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List
QueryRunner还提供了批处理方法:batch()。
我们更新一行记录时需要指定一个Object[]为参数,如果是批处理,那么就要指定Object[][]为参数了。即多个Object[]就是Object[][]了,其中每个Object[]对应一行记录:
@Test
public void fun10() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "insert into tab_student values(?,?,?,?)";
Object[][] params = new Object[10][];//表示 要插入10行记录
for(int i = 0; i < params.length; i++) {
params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
}
qr.batch(sql, params);
}