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);
  }

 

上一篇:32_Go基础(TCP通信)


下一篇:2021.11.01python实现三个数相加为0 + 单词顺序反转字符串