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);
      }
  • 相关阅读:
    jmeter之ServerAgent监控资源
    jmeter之线程组循环次数
    mysql增删查改、存储过程
    [剑指Offer] 37.数字在排序数组中出现的次数
    [剑指Offer] 36.两个链表的第一个公共结点
    [剑指Offer] 35.数组中的逆序对
    [剑指Offer] 34.第一个只出现一次的数
    [剑指Offer] 33.丑数
    [OS] 进程相关知识点
    [C/C++] C/C++中数字与字符串之间的转换
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10513150.html
Copyright © 2011-2022 走看看