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

发布于:2025-03-20 ⋅ 阅读:(26) ⋅ 点赞:(0)

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

---------------------------------------------------------------------------------------------------------------------------------

目录

1. ResultSet 的弊端

1.1 与 Connection 的强关联

1.2 数据管理不便

1.3 返回信息不便

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

2.1 封装思路

2.2 代码实现

3. 使用 Apache DBUtils 进一步优化

3.1 Apache DBUtils 简介

3.2 使用 QueryRunner 封装 ResultSet

4. 封装的优势

4.1 解耦 Connection 和 ResultSet

4.2 提升数据管理灵活性

4.3 提高代码可读性

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

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_类:

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 的示例:

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 数据库编程。