zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记(十八)—— DBUtils的使用

    一、DBUtils概述

    1.1 什么是DBUtils

      commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

      DBUtils最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

      使用DBUtils需要导包:commons-dbutils-1.4.jar

    1.2 为什么要用DBUtils

       在使用Dbutils 之前,我们Dao层使用的技术是JDBC,那么分析一下JDBC的弊端:

    • 数据库连接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义
    • 封装数据的代码重复,而且操作复杂,代码量大
    • 释放资源的代码重复
        结果:程序员在开发的时候,有大量的重复劳动;开发的周期长,效率低

      而使用dbutils可以极大程度的简化代码书写,使得开发进度更快,效率更高。

    二、QueryRunner类

      该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

      QueryRunner类提供了两个构造方法:

    • QueryRunner():创建一个与数据库无关的QueryRunner对象,后期在操作数据库的时候,需要手动给一个Connection对象,它可以手动控制事务。
      • Connection.setAutoCommit(false);     设置手动管理事务
      • Connection.commit();    提交事务
    • QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接。后期在操作数据库的时候,不需要Connection对象,自动管理事务。

    2.1 QueryRunner类的主要方法

    【更新操作】——可执行增删改语句

    • int update(Connection con, String sql, Object… params):需要调用者提供Connection,这说明本方法不再管理Connection了。支持事务!调用的是同一个Connection
    • int update(String sql, Object… params):此方法在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。若多次调用,返回的Connection不能保证为同一个,不支持事务。

    【查询操作】

    • public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params):它会先得到ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。支持事务
    • public <T> T query(String sql, ResultSetHandler<T> rh, Object… params):几乎与第一种方法一样,只是不支持事务

    2.2 使用QueryRunner类实现CRUD

    public class DBUtilsTest {
        @Test
        public void add() throws SQLException {
            //将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
            QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "insert into t_user values(?,?)";
            qr.update(sql, "1", "张三");
        }
    
        @Test
        public void delete() throws SQLException {
            QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "delete from t_user where id=?";
            qr.update(sql, 1);
        }
    
        @Test
        public void update() throws SQLException {
            QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "update t_user set name=? where id=?";
            qr.update(sql, "李四", "1");
        }
    
        @Test
        public void find() throws SQLException {
            QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "select * from t_user where id=?";
            User user = qr.query(sql, new BeanHandler<User>(User.class),1);
            System.out.println(user.getName());
        }
    }

    三、ResultSetHandler接口

      我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。

      DBUtils提供了一个接口ResultSetHandler,它就是用来把ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。

      DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。

    3.1 ResultSetHandler接口的实现类

    • BeanHandler:单行处理器,构造器需要一个Class类型的参数,用来把一行结果转换成指定类型的javaBean对象
      @Test
      public void fun1() throws SQLException {
          QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
          String sql = "select * from t_user where id=?";
      
          // 执行query()方法,需要给出结果集处理器,即ResultSetHandler的实现类对象
          // 我们给的是BeanHandler,它实现了ResultSetHandler
          // 它需要一个类型,然后它会把rs中的数据封装到指定类型的JavaBean对象中,然后返回JavaBean
          User user = qr.query(sql, new BeanHandler<User>(User.class), 1);
          System.out.println(user);
      }
    • BeanListHandler:多行处理器,构造器也是需要一个Class类型的参数,用来把一行结果集转换成一个javabean,那么多行就是转换成List对象,一堆javabean

      /**
       * BeanListHandler的应用,它是多行处理器
       * 每行对象一个User对象
       */
      @Test
      public void fun2() throws SQLException {
          QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
          String sql = "select * from t_user";
          List<User> userList = qr.query(sql, new BeanListHandler<User>(User.class));
          System.out.println(userList);
      }
    • MapHandler:单行处理器,把一行结果集转换Map<String,Object>,其中列名为键。依赖的是HashMap

      @Test
      public void fun3() throws SQLException {
          QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
          String sql = "select * from t_user where id=?";
          Map<String, Object> map = qr.query(sql, new MapHandler(), 1);
          System.out.println(map);
      }
    • MapListHandler:多行处理器,把一行记录转换成一个Map<String,Object>,多行就是多个Map,即List<Map<String,Object>>

      @Test
      public void fun4() throws SQLException {
          QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
          String sql = "select * from t_user";
          List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
          System.out.println(mapList);
      }
    • ScalarHandler:单行单列处理器,把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student

      @Test
      public void fun5() throws SQLException {
          QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
          String sql = "select count(*) from t_user";
          Number cnt = (Number) qr.query(sql, new ScalarHandler());
          long c = cnt.longValue();
          System.out.println(c);
      }
  • 相关阅读:
    day01--计算机硬件基础笔记
    22 Jun 18 Django,ORM
    21 Jun 18 Django,ORM
    20 Jun 18 复习, mysql
    20 Jun 18 Django,ORM
    19 Jun 18 复习, 正则表达式
    19 Jun 18 Django
    15 Jun 18 复习, shutil模块
    15 Jun 18 Django
    14 Jun 18 复习, form表单
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10513150.html
Copyright © 2011-2022 走看看