告别 ResultSet 的烦恼:使用 Apache DBUtils 和 ArrayList 优化数据管理

在 Java 数据库编程中,ResultSet 是处理 SQL 查询结果的常用工具。然而,ResultSet 存在一些明显的弊端,如与 Connection 的强关联、数据管理不便等。本文将探讨这些问题,并介绍如何使用 Apache DBUtils 和 ArrayList 优化数据管理,提升代码的可读性和可维护性。


目录

[1. ResultSet 的弊端](#1. ResultSet 的弊端)

[1.1 与 Connection 的强关联](#1.1 与 Connection 的强关联)

[1.2 数据管理不便](#1.2 数据管理不便)

[1.3 返回信息不便](#1.3 返回信息不便)

[2. 解决方案:使用 ArrayList 封装 ResultSet](#2. 解决方案:使用 ArrayList 封装 ResultSet)

[2.1 封装思路](#2.1 封装思路)

[2.2 代码实现](#2.2 代码实现)

[3. 使用 Apache DBUtils 进一步优化](#3. 使用 Apache DBUtils 进一步优化)

[3.1 Apache DBUtils 简介](#3.1 Apache DBUtils 简介)

[3.2 使用 QueryRunner 封装 ResultSet](#3.2 使用 QueryRunner 封装 ResultSet)

[4. 封装的优势](#4. 封装的优势)

[4.1 解耦 Connection 和 ResultSet](#4.1 解耦 Connection 和 ResultSet)

[4.2 提升数据管理灵活性](#4.2 提升数据管理灵活性)

[4.3 提高代码可读性](#4.3 提高代码可读性)

[5. 总结](#5. 总结)



1. ResultSet 的弊端

1.1 与 Connection 的强关联

  • 问题 :ResultSet 依赖于 Connection,当 Connection 关闭后,ResultSet 将无法使用。

  • 影响 :在复杂的业务逻辑中,可能需要保持 Connection 的打开状态,增加了资源管理的复杂性。

1.2 数据管理不便

  • 问题 :ResultSet 是一个游标,只能逐行访问数据,无法直接进行集合操作。

  • 影响:数据处理的灵活性受限,难以进行批量操作或复杂的数据转换。

1.3 返回信息不便

  • 问题 :ResultSet 的数据结构较为底层,直接使用不便。

  • 影响:需要手动解析和封装数据,增加了代码的复杂性。


2. 解决方案:使用 ArrayList 封装 ResultSet

2.1 封装思路

将 ResultSet 中的数据逐行提取,封装到 ArrayList 中。每个对象对应数据库中的一条记录,便于后续的数据管理和操作。

2.2 代码实现

以下是一个完整的示例,展示如何使用 ArrayList 封装 ResultSet:

java 复制代码
package JDBD_resource;

import org.junit.Test;
import untils.DruidUtils_;
import untils.JDBCutils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class Apache_ {
    @Test
    public void Test(){
        System.out.println("使用arraylist封装resultSet");
        Connection connection = null;
        PreparedStatement preparedStatement = null;
//        组织一个sql语句
        String sql = "select * from sql_injection";
        ResultSet resultSet = null;
//        初始化一个list对象实现转存
        ArrayList<Person_> arrayList = new ArrayList<>();
//        创建一个对象
        try {
            connection = DruidUtils_.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                String name = resultSet.getString(1);
                String pwd = resultSet.getString(2);
                arrayList.add(new Person_(name,pwd));
            }
//            利用重写的Tostring方法,打印成员变量
            System.out.println("集合成员:\n"+ arrayList);

//            增强for循环
            for (Person_ person : arrayList){
                System.out.println(person.getName()+"\t"+person.getPwd());

            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JDBCutils.close(connection,preparedStatement,resultSet);
//            关闭连接

        }
    }
}

Person_类:

java 复制代码
package JDBD_resource;

public class Person_ {
    private String name;
    private String pwd;

    public Person_() {} //这里使用无参构造器,用于反射

    public Person_(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "Person_{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

数据库简单建立:

3. 使用 Apache DBUtils 进一步优化

3.1 Apache DBUtils 简介

Apache DBUtils 是一个轻量级的 JDBC 工具库,提供了对 ResultSet 的封装和简化操作。它的核心类是 QueryRunner,可以方便地将查询结果映射到 Java 对象。

这里需要使用到Apache 的jar包:

先找到这开源网站:Apache Commons -- Apache Commons

再到release:

也可以找历史版本Archive:


解压得到:

添加到项目当中作为项目文件:

3.2 使用 QueryRunner 封装 ResultSet

以下是一个使用 QueryRunner 的示例:

java 复制代码
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.util.List;

public class DBUtilsExample {
    public static void main(String[] args) {
        Connection connection = DruidUtils_.getConnection();
        QueryRunner queryRunner = new QueryRunner();
        String sql = "SELECT * FROM sql_injection";

        try {
            List<Person_> persons = queryRunner.query(connection, sql, new BeanListHandler<>(Person_.class));
            for (Person_ person : persons) {
                System.out.println(person.getName() + "\t" + person.getPwd());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DruidUtils_.close(connection);
        }
    }
}

4. 封装的优势

4.1 解耦 Connection 和 ResultSet

  • 优势 :通过将数据封装到 ArrayList 或 JavaBean 中,解除了 ResultSet 对 Connection 的依赖。

  • 效果 :可以在关闭 Connection 后继续使用数据,简化资源管理。

4.2 提升数据管理灵活性

  • 优势 :ArrayList 提供了丰富的集合操作 API,便于数据处理。

  • 效果:可以轻松实现数据过滤、排序、分组等操作。

4.3 提高代码可读性

  • 优势:通过封装,代码结构更加清晰,易于理解和维护。

  • 效果 :减少了直接操作 ResultSet 的复杂性。

5. 总结

通过使用 ArrayList 封装 ResultSet,可以有效解决 ResultSet 的弊端,提升数据管理的灵活性和代码的可读性。结合 Apache DBUtils,可以进一步简化 JDBC 操作,提高开发效率。希望本文的内容能帮助您更好地优化 Java 数据库编程。

相关推荐
wangbing112510 小时前
使用jps jstack排查系统问题
java
于指尖飞舞10 小时前
java面试题总结
java·开发语言
ZealSinger10 小时前
LangChain4j用AiServices拼Tool
java·rag·ai智能体·langchain4j
vx_Biye_Design10 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
Sweet锦12 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
如意猴12 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_12 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
写后端的胖头鱼13 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
专业程序开发源13 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户0942485680313 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm