common-dbutils用法总结

绝地灬酷狼 2021-06-15 20:36 509阅读 0赞

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语句。

  1. 创建QueryRunner
    构造器:QueryRunner()
  2. update()方法
    int update(Connection con, String sql, Object… params)

    1. public void fun1() throws SQLException {
    2. QueryRunner qr = new QueryRunner();
    3. String sql = "insert into user values(?,?,?)";
    4. qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
    5. }

还有另一种方式来使用QueryRunner

  1. 创建QueryRunner
    构造器:QueryRunner(DataSource)
  2. update()方法
    int update(String sql, Object… params)
    这种方式在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。

    1. public void fun2() throws SQLException {
    2. QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    3. String sql = "insert into user values(?,?,?)";
    4. qr.update(sql, "u1", "zhangSan", "123");
    5. }

4. ResultSetHandler

我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。

  • MapHandler:单行处理器!把结果集转换成Map,其中列名为键!
  • 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转换成对应的类型再返回。

  1. @Test
  2. public void fun1() throws SQLException {
  3. DataSource ds = JdbcUtils.getDataSource();
  4. QueryRunner qr = new QueryRunner(ds);
  5. String sql = "select * from tab_student where number=?";
  6. // 把一行记录转换成一个Map,其中键为列名称,值为列值
  7. Map<String,Object> map = qr.query(sql, new MapHandler(), "S_2000");
  8. System.out.println(map);
  9. }
  10. @Test
  11. public void fun2() throws SQLException {
  12. DataSource ds = JdbcUtils.getDataSource();
  13. QueryRunner qr = new QueryRunner(ds);
  14. String sql = "select * from tab_student";
  15. // 把转换集转换成List<Map>,其中每个Map对应一行记录
  16. List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
  17. for(Map<String,Object> map : list) {
  18. System.out.println(map);
  19. }
  20. }
  21. @Test
  22. public void fun3() throws SQLException {
  23. DataSource ds = JdbcUtils.getDataSource();
  24. QueryRunner qr = new QueryRunner(ds);
  25. String sql = "select * from tab_student where number=?";
  26. // 把结果集转换成一个Bean对象,在使用BeanHandler时需要指定Class,即Bean的类型
  27. Student stu = qr.query(sql, new BeanHandler<Student>(Student.class), "S_2000");
  28. System.out.println(stu);
  29. }
  30. @Test
  31. public void fun4() throws SQLException {
  32. DataSource ds = JdbcUtils.getDataSource();
  33. QueryRunner qr = new QueryRunner(ds);
  34. String sql = "select * from tab_student";
  35. // 把结果集转换成List<Bean>,其中每个Bean对应一行记录
  36. List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));
  37. for(Student stu : list) {
  38. System.out.println(stu);
  39. }
  40. }
  41. @Test
  42. public void fun5() throws SQLException {
  43. DataSource ds = JdbcUtils.getDataSource();
  44. QueryRunner qr = new QueryRunner(ds);
  45. String sql = "select * from tab_student";
  46. // 多行单例处理器,即获取name列数据
  47. List<Object> list = qr.query(sql, new ColumnListHandler("name"));
  48. for(Object s : list) {
  49. System.out.println(s);
  50. }
  51. }
  52. @Test
  53. public void fun6() throws SQLException {
  54. DataSource ds = JdbcUtils.getDataSource();
  55. QueryRunner qr = new QueryRunner(ds);
  56. String sql = "select count(*) from tab_student";
  57. // 单行单列处理器,一般用于聚合查询,在使用ScalarHandler时可以指定列名,如果不指定,默认为第1列。
  58. Number number = (Number)qr.query(sql, new ScalarHandler());
  59. // 对聚合函数的查询结果,有的驱动返回的是Long,有的返回的是BigInteger,
  60. // 所以这里我们把它转换成Number,Number是Long和BigInteger的父类!
  61. // 然后我们再调用Number的intValue()或longValue()方法就OK了。
  62. int cnt = number.intValue();
  63. System.out.println(cnt);
  64. }

5. QueryRunner之批处理

QueryRunner还提供了批处理方法:batch()
我们更新一行记录时需要指定一个Object[]为参数,如果是批处理,那么就要指定Object[][]为参数了。即多个Object[]就是Object[][]了,其中每个Object[]对应一行记录:

  1. @Test
  2. public void fun10() throws SQLException {
  3. DataSource ds = JdbcUtils.getDataSource();
  4. QueryRunner qr = new QueryRunner(ds);
  5. String sql = "insert into tab_student values(?,?,?,?)";
  6. // 注意,这里是二维数组,这个二维数组有10个一维数组。
  7. Object[][] params = new Object[10][];//表示 要插入10行记录
  8. for(int i = 0; i < params.length; i++) {
  9. params[i] = new Object[]{ "S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
  10. }
  11. // 执行批处理
  12. qr.batch(sql, params);
  13. }

END.

发表评论

表情:
评论列表 (有 0 条评论,509人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vim 用法总结

    vim 共分三种模式:一般模式、编辑模式、命令行模式。 几乎所有操作都可以加入数字,表示重复操作若干次。“\[n\]”表示在相应位置输入数字可达到重复操作的目的。

    相关 typedef 用法总结

     不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与\define有些相似,但更多的是不同,特别是在一些复杂的用法上,

    相关 git用法总结

    <一>如何把自己的代码上传到代码仓库中(ubuntu操作系统) 1.sudo apt-get install git 安装git,确保git在ubuntu本地已经安装 2