Java 中Apache-DBUtils类的使用详解

简介: Java 中Apache-DBUtils类的使用详解

前言:

问题引出:关闭Connection后,ResultSet结果集无法使用,ResultSet结果集不利于数据的管理。

具体看下面的示意图

一、首先用自己的方法把ResultSet结果集封装到ArrayList集合中

代码如下

public class JDBCUtilsByDruid_Use {
  //自己封装解决将ResultSet 封装到ArrayList中
    @Test
    public ArrayList<Actor> testSelectToArrayList() {
        Connection connection = null;
        String sql = "SELECT id,name,borndate,sex,phone FROM ACTOR WHERE id >= ?";
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<Actor> list = new ArrayList<>();//创建ArrayList对象,存放Actor对象
        try {
            //1.得到连接
            connection = JDBCUtilsByDruid.getConnection();
            System.out.println(connection.getClass());//class com.alibaba.druid.pool.DruidPooledConnection
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 2);
            //执行得到结果集
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                String name = resultSet.getString("name");
                String phone = resultSet.getString("phone");
                int id = resultSet.getInt("id");
                Date borndate = resultSet.getDate("borndate");
                String sex = resultSet.getString("sex");
                //把得到的resultSet的记录,封装到Actor对象,放入到List集合
                list.add(new Actor(id, name, sex, borndate, phone));
            }
            System.out.println("list集合数据=" + list);
            for (Actor actor : list) {
                System.out.println(actor.getSex());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtilsByDruid.close(resultSet, preparedStatement, connection);
        }
        //因为ArrayList和Connection没有任何关联,所以该集合可以复用
        return list;
    }
}

二、使用Apache组织提供的一个开源JDBC工具库,它是对JDBC的封装,使用DBUtils能极大简化jdbc编码的工作量。

1、Apache-DBUtils的基本介绍

commons-dbutils-1.7.jar包的下载

下载jar包地址

下载对应的jar包即可

2、演示apache-DBUtils 工具类的使用

public class DBUtils_USE {
    //使用apache-DBUtils 工具类 + druid 完成对表的crud操作
    @Test
    public void testQueryMany() throws SQLException {//返回结果是多行的情况
        Connection connection = JDBCUtilsByDruid.getConnection();
        //使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
        //1.创建QueryRunner
        QueryRunner queryRunner = new QueryRunner();
        //2.就可以执行相关的方法,返回ArrayList结果集
//        String sql = "SELECT * FROM ACTOR WHERE id >= ?";
        //注意:sql语句 也可以查询部分列
        String sql = "SELECT id,name FROM ACTOR WHERE id >= ?";
        //解读:
        //1.query方法就是执行sql语句,得到resultSet --封装到-->ArrayList集合中
        //2.返回集合
        //3.connection:连接
        //4.sql:执行sql语句
        //5.new BeanListHandler<>(Actor.class):在将resultSet ->Actor对象->封装到ArrayList中
        //底层使用反射机制,去获取Actor类的属性,进行封装
        //6. 1 就是给sql语句中的?号赋值的,可以有多个值,因为是可变参数 Object... params
        //7.底层得到的resultSet,会在query()方法关闭,prepareStatement关闭
        /**
         * 分析:queryRunner.query方法
         * private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
         *         if (conn == null) {
         *             throw new SQLException("Null connection");
         *         } else if (sql == null) {
         *             if (closeConn) {
         *                 this.close(conn);
         *             }
         *
         *             throw new SQLException("Null SQL statement");
         *         } else if (rsh == null) {
         *             if (closeConn) {
         *                 this.close(conn);
         *             }
         *
         *             throw new SQLException("Null ResultSetHandler");
         *         } else {
         *             PreparedStatement stmt = null; //定义PreparedStatement
         *             ResultSet rs = null; //接收返回的ResultSet
         *             Object result = null; //返回ArrayList
         *
         *             try {
         *                 stmt = this.prepareStatement(conn, sql); //创建PreparedStatement
         *                 this.fillStatement(stmt, params); //对SQL 进行? 赋值
         *                 rs = this.wrap(stmt.executeQuery());//执行sql,返回resultSet
         *                 result = rsh.handle(rs); //返回的resultSet-->arrayList[resultSet][使用反射,对传入的class对象处理]
         *             } catch (SQLException var33) {
         *                 this.rethrow(var33, sql, params);
         *             } finally {
         *                 try {
         *                     this.close(rs);//关闭resultSet
         *                 } finally {
         *                     this.close(stmt); //关闭PrepareStatement
         *                     if (closeConn) {
         *                         this.close(conn);
         *                     }
         *
         *                 }
         *             }
         *
         *             return result;
         *         }
         *     }
         */
        List<Actor> list = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);
        System.out.println("输出集合的信息");
        for (Actor actor : list) {
            System.out.println(actor);
        }
        //释放资源
        JDBCUtilsByDruid.close(null, null, connection);
    }
    //使用apache-DBUtils 工具类 + druid 完成 返回的结果是单行记录(单个对象)
    @Test
    public void testQuerySingle() throws Exception {
        Connection connection = JDBCUtilsByDruid.getConnection();
        //使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
        //1.创建QueryRunner
        QueryRunner queryRunner = new QueryRunner();
        //2.就可以执行相关的方法,返回单个对象
        String sql = "SELECT * FROM ACTOR WHERE id = ?";
        //解读:
        //因为我们返回的单行记录<-->单个对象,使用的Handler是BeanHandler
        Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 3);
        System.out.println(actor);
        //释放资源
        JDBCUtilsByDruid.close(null, null, connection);
    }
    //使用apache-DBUtils 工具类 + druid 完成查询结果是单行单列-返回的就是object
    @Test
    public void testScaler() throws Exception {
        Connection connection = JDBCUtilsByDruid.getConnection();
        //使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
        //1.创建QueryRunner
        QueryRunner queryRunner = new QueryRunner();
        //2.就可以执行相关的方法,返回单行单列,返回的就是Object
        String sql = "SELECT name FROM ACTOR WHERE id = ?";
        //解读:
        //因为我们返回的单行记录<-->单个对象,使用的Handler是BeanHandler
        //解读:因为返回的是一个对象,使用的handler就是ScalarHandler
        Object object = queryRunner.query(connection, sql, new ScalarHandler(), 3);
        System.out.println(object);//周润发
        //释放资源
        JDBCUtilsByDruid.close(null, null, connection);
    }
    //使用apache-DBUtils 工具类 + druid 完成DML操作(insert,delete,update)
    @Test
    public void testDML() throws Exception {
        //1.得到连接(druid)
        Connection connection = JDBCUtilsByDruid.getConnection();
        //2使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
        //3.创建QueryRunner
        QueryRunner queryRunner = new QueryRunner();
        //4.这里组织sql完成update,insert,delete
//        String sql = "UPDATE ACTOR SET NAME=? WHERE id = ?";
//        String sql = "INSERT INTO ACTOR VALUES(NULL,?,?,?,?)";
        String sql = "DELETE FROM ACTOR WHERE id = ?";
        //解读:
        //1.执行DML 操作是queryRunner.update()
        //2.返回的值是受影响的行数
//        int affectedRow = queryRunner.update(connection, sql, "张无忌", "男", "1979-01-01", "123456");
        int affectedRow = queryRunner.update(connection, sql, 4);
        System.out.println(affectedRow > 0 ? "执行成功" : "执行没有影响到表");//执行成功
        //释放资源
        JDBCUtilsByDruid.close(null, null, connection);
    }
}


目录
相关文章
|
6天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
6天前
|
存储 Java 编译器
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
7天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
28 5
|
6天前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box&lt;T&gt;`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box&lt;T&gt;` 编译后变为 `Box&lt;Object&gt;`,从而实现无缝交互和减少内存开销。
|
4月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
223 58
|
3月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
4月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
127 8
|
4月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
126 17

推荐镜像

更多