告别 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 中,解除了 ResultSetConnection 的依赖。

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

4.2 提升数据管理灵活性

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

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

4.3 提高代码可读性

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

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

5. 总结

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

相关推荐
某不知名網友24 分钟前
C/C++动态内存管理,智能指针及RAlI思想。
java·c语言·c++
吠品1 小时前
PG_GBK 与 PG_UTF8 编码冲突:一次数据导入踩坑复盘
数据库
lld9510271 小时前
我做了一个 AI Agent Skill 云:用 MCP 在 Claude Code、Codex、OpenCode 之间同步技能
数据库·人工智能
沫离痕2 小时前
Cassandra 4.0.11 Docker 安装与配置手册
java·spring boot
plainGeekDev2 小时前
libs 目录 → Gradle 依赖管理
android·java·kotlin
CodeStride2 小时前
就像长跑配速一样,我是如何平衡代码性能与可读性的
java
弹简特2 小时前
【Java项目-企悦抽】07-用户与认证模块-实现用户注册01
java·开发语言
L歪歪君2 小时前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法
ttwuai2 小时前
GoFrame 连接 MySQL 报错排查:parseTime、时区和 utf8mb4 怎么配
数据库·mysql·adb
辉灰笔记2 小时前
MySQL8 意外关机/误移data目录导致服务启动失败 PID报错/权限报错 修复文档
linux·数据库·mysql·centos