DBUtils
1. DBUtils简介
DBUtils是Apache Commons组件中的一员,开源免费!
DBUtils是对JDBC的简单封装,但是它还是被很多公司使用!
DBUtils的Jar包:dbutils.jar
2. DBUtils主要类
DbUtils:都是静态方法,一系列的close()
方法;
QueryRunner:
update()
:执行insert、update、delete;query()
:执行select语句;batch()
:执行批处理。
3. QueryRunner之更新
QueryRunner的update()
方法可以用来执行insert、update、delete语句。
- 创建QueryRunner
构造器:QueryRunner()
- update()方法
int update(Connection con, String sql, Object… params)
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了。public void fun2() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "insert into user values(?,?,?)"; qr.update(sql, "u1", "zhangSan", "123"); }
4. ResultSetHandler
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
- MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
- MapListHandler:多行处理器!把结果集转换成
List<Map<String,Object>>
; - BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
- BeanListHandler:多行处理器!把结果集转换成
List<Bean>
; - ColumnListHandler:多行单列处理器!把结果集转换成
List<Object>
,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler("name")
表示把name列的数据放到List中。 - ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如
select count(*) from tab_student
。
Map处理器:
Bean处理器 :
Column处理器:
Scalar处理器:
5. QueryRunner之查询
QueryRunner的查询方法是:public <T> T query(String sql, ResultSetHandler<T> rh, Object… params)
public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params)
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<String,Object> map = qr.query(sql, new MapHandler(), "S_2000"); 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<Map>,其中每个Map对应一行记录 List<Map<String,Object>> list = qr.query(sql, new MapListHandler()); for(Map<String,Object> map : list) { System.out.println(map); } } @Test public void fun3() throws SQLException { DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select * from tab_student where number=?"; // 把结果集转换成一个Bean对象,在使用BeanHandler时需要指定Class,即Bean的类型 Student stu = qr.query(sql, new BeanHandler<Student>(Student.class), "S_2000"); System.out.println(stu); } @Test public void fun4() throws SQLException { DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select * from tab_student"; // 把结果集转换成List<Bean>,其中每个Bean对应一行记录 List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class)); for(Student stu : list) { System.out.println(stu); } } @Test public void fun5() throws SQLException { DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select * from tab_student"; // 多行单例处理器,即获取name列数据 List<Object> list = qr.query(sql, new ColumnListHandler("name")); for(Object s : list) { System.out.println(s); } } @Test public void fun6() throws SQLException { DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select count(*) from tab_student"; // 单行单列处理器,一般用于聚合查询,在使用ScalarHandler时可以指定列名,如果不指定,默认为第1列。 Number number = (Number)qr.query(sql, new ScalarHandler()); // 对聚合函数的查询结果,有的驱动返回的是Long,有的返回的是BigInteger, // 所以这里我们把它转换成Number,Number是Long和BigInteger的父类! // 然后我们再调用Number的intValue()或longValue()方法就OK了。 int cnt = number.intValue(); System.out.println(cnt); }
5. QueryRunner之批处理
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(?,?,?,?)"; // 注意,这里是二维数组,这个二维数组有10个一维数组。 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); }
END.
来源:51CTO
作者:veejaLiu
链接:https://blog.csdn.net/u014565127/article/details/102775984