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