zoukankan      html  css  js  c++  java
  • 10.25JDBC之Apache-DBUtils实现CRUD操作

    10.25JDBC之Apache-DBUtils实现CRUD操作

    Apache-DBUtils简介

    什么是Apache-DBUtils?

    commons-dbutilsApache组织提供的一个开源的JDBC工具类库

    API介绍

    • org.apache.commons.dbutils.QueryRunner

    • org.apache.commons.dbutils.ResultSetHandler

    • org.apache.commons.dbutils.DbUtils工具类

    使用方式

    导入依赖

            <!--dbutils依赖-->
           <dependency>
               <groupId>commons-dbutils</groupId>
               <artifactId>commons-dbutils</artifactId>
               <version>1.7</version>
           </dependency>

    主要使用方法:

    • QueryRunner类下封装的方法

    插入一条数据:

        @Test
       public void testInsert() throws Exception {
           Connection conn = null;
           try {
               //新建对象引用
               QueryRunner runner = new QueryRunner();

               //获取一个连接
               DruidTest dt = new DruidTest();
               conn = dt.getConnection();
               String sql = "insert into customers(name, email, birthday) values(?, ?, ?);";

               //调用方法
               /*
               传参:
               连接
               sql
               object对象
                */
               int insertCount = runner.update(conn, sql, "蔡徐坤", "cai@163.com", "1999-09-09");
               System.out.println("添加了" + insertCount + "记录!");
          }catch (Exception e){
               e.printStackTrace();
          }finally {
               //关闭练级
               JDBCUtils.closeResource(conn, null);
          }
      }

    返回单个结果的封装方法:

        //测试查询操作,使用dbutils
       /*
       使用BeanHandler,是ResultSet接口的实现类。用于封装表中的一条记录
        */
       @Test
       public void testQuery1() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               //调用query当中的结果集处理器方法
               /*
               参数:
               连接
               sql
               结果集处理器--->这是一个接口,需要传接口的具体实现类的实例。结果集返回数据这一块通过接口进行处理。因为返回的情况是多样的。为了应对不同的结果所以定义一个接口作为标准
               object对象
                */
               conn = JDBCUtils.getConnection();
               String sql = "select id, name, birthday from customers where id = ?;";
               /*BeanHandler是结果集处理器的接口实现类--->没有空参构造器*/
               BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);

               Customer customer = runner.query(conn, sql, handler, 23);

               System.out.println(customer);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    使用List封装返回的多个结果对象:

        //测试查询,使用dbutils封装多条返回记录
       /*
       BeanListHandler,是一个DBUtils的实现类。用于封装多条记录的返回结果
        */
       @Test
       public void testQuery2() throws SQLException {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();

               conn = JDBCUtils.getConnection();
               String sql = "select id, name, birthday from customers where id < ?;";
               /*BeanListHandler是结果集处理器的接口实现类--->封装返回的多条记录*/
               BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);

               List<Customer> list = runner.query(conn, sql, handler, 23);

               //打印list
               list.forEach(System.out::println);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    使用Map封装返回的单个结果对象:

        //返回一个Map
       /*
       MapHandler,封装返回的也是一条纪律
       返回的对象是以一个map的方式来呈现
       将字段与值作为map中的key和value
        */
       @Test
       public void testQuery3() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               //调用方法传入参数
               /*
               连接
               sql
               结果集处理器
               object对象
                */
               conn = JDBCUtils.getConnection();
               String sql = "select id, name, email, birthday from customers where id = ?;";
               /*使用maphandler处理结果集*/
               MapHandler handler = new MapHandler();
               Map<String, Object> map = runner.query(conn, sql, handler, 23);
               System.out.println(map);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    使用MapList封装返回的多个对象:

        //MapListHandler
       /*
       以map德形式返回字段和值
       返回多个结果集
        */
       @Test
       public void testQuery4() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               conn = JDBCUtils.getConnection();
               String sql = "select id, name, email, birthday from customers where id < ?;";
               /*使用MapListHandler作为结果集处理器*/
               MapListHandler handler = new MapListHandler();
               List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);

               //循环打印list
               list.forEach(System.out::println);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    使用MapListHandler对返回的多个结果集对象进行封装:

        //MapListHandler
       /*
       以map德形式返回字段和值
       返回多个结果集
       每一条记录对应map中的key和value
        */
       @Test
       public void testQuery4() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               conn = JDBCUtils.getConnection();
               String sql = "select id, name, email, birthday from customers where id < ?;";
               /*使用MapListHandler作为结果集处理器*/
               MapListHandler handler = new MapListHandler();
               List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);

               //循环打印list
               list.forEach(System.out::println);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    使用sql的内置函数进行查询操作:

        //使用sql函数进行查询操作返回封装的结果集
       @Test
       public void testQuery5() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               //获取连接
               conn = JDBCUtils.getConnection();
               //书写sql
               String sql = "select count(*) from customers;";
               //选择结果处理器
               /*使用salarhandler*/
               ScalarHandler handler = new ScalarHandler();
               //调用方法传入指定参数
               Long count = (Long) runner.query(conn, sql, handler);
               System.out.println(count);
          }catch (Exception e){
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    data类型:

        //使用sql函数进行查询data类型的操作
       @Test
       public void testQuery6() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               //获取连接
               conn = JDBCUtils.getConnection();
               //书写sql
               String sql = "select max(birthday) from customers;";
               //选择结果处理器--->该类有空参构造器
               ScalarHandler handler = new ScalarHandler();
               //调用runner下的方法
               Data maxBirth = (Data) runner.query(conn, sql, handler);
               System.out.println(maxBirth);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    自定义DBUtils实现类进行查询操作

    因为上诉的一些方法都是再Bean类下实现的方法。这些类统一实现了接口:Interface ResultSetHandler<T>这个泛型接口。

    所以可以通过实现该接口的方式自定义查询的实现类和方法

    具体实现类:

        /*
       自定义一个ResultSetHandler的实现类
        */
       @Test
       public void testQuery7() {
           Connection conn = null;
           try {
               QueryRunner runner = new QueryRunner();
               //获取连接
               conn = JDBCUtils.getConnection();
               //书写sql
               String sql = "select max(birthday) from customers;";
               //自定义一个匿名的结果集实现类--->在new的对象引用提供接口重写的方法
               /*
               提供匿名实现类的时候右边的泛型不能省略
                */
               ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>(){
                   //该方法返回的对象作为下面runner.query的返回值
                   @Override
                   public Customer handle(ResultSet resultSet) throws SQLException {
                       System.out.println("啥也不是!");
    //                   return null;
                       //返回一个固定的结果集
    //                   return new Customer(18, "帅气逼人", "Lucifer@163.com", new Date(655354523L));
                       //BeanHandler实际的结果集执行的逻辑是
                       if (resultSet.next()){
                           int id = resultSet.getInt("id");
                           String name = resultSet.getString("name");
                           String email = resultSet.getString("email");
                           Date birth = resultSet.getDate("birthday");
                           Customer customer = new Customer(id, name, email, birth);
                           return customer;
                      }
                       return null;
                  }
              };
               //使用自定义的查询语句进行查询
               /*
               上述handle方法的返回值就是query的返回值
                */
               Customer customer = runner.query(conn, sql, handler, 23);
               System.out.println(customer);
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               //关闭资源
               JDBCUtils.closeResource(conn, null);
          }
      }

    调用第三方工具类提供的关闭资源的方法

    关闭资源:

        /*调用第三方sdk提供的工具类下的方法实现资源的关闭*/
       public static void closeResource2(Connection conn, PreparedStatement ps, ResultSet rs) {
           try {
               DbUtils.close(conn);
          }catch (SQLException e) {
               e.printStackTrace();
          }
           try {
               DbUtils.close(ps);
          }catch (SQLException e) {
               e.printStackTrace();
          }
           try {
               DbUtils.close(rs);
          }catch (SQLException e) {
               e.printStackTrace();
          }
      }

       /*调用第三方sdk提供的工具类,方法中处理异常*/
       public static void closeResource3(Connection conn, PreparedStatement ps, ResultSet rs) {
           DbUtils.closeQuietly(conn);
           DbUtils.closeQuietly(ps);
           DbUtils.closeQuietly(rs);
      }

     

    It's a lonely road!!!
  • 相关阅读:
    93. Restore IP Addresses
    mysql复制那点事(2)-binlog组提交源码分析和实现
    49. Group Anagrams
    43. Multiply Strings
    66. Plus One
    100. Same Tree
    MySQL 加锁处理分析
    mysql死锁问题分析
    数据库事务的四大特性以及事务的隔离级别
    MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15497458.html
Copyright © 2011-2022 走看看