在Java开发中,将数据库中的数据添加到List集合是一个常见的需求,通常用于数据缓存、批量处理或前端展示等场景,实现这一过程的核心思路是:通过JDBC(Java Database Connectivity)或其他数据访问技术连接数据库,执行查询语句获取结果集,然后将结果集中的每条记录转换为Java对象,最终将这些对象逐个添加到List集合中,以下是详细的实现步骤、代码示例及注意事项。
准备工作
在开始之前,需确保以下环境已配置完成:
- 数据库驱动:根据使用的数据库(如MySQL、Oracle、PostgreSQL等),添加对应的JDBC驱动依赖,MySQL驱动的Maven依赖为:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> - 数据库连接信息:包括URL、用户名、密码,例如MySQL的连接字符串格式为
jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC。 - 实体类:创建与数据库表结构对应的Java类,用于封装每条记录的数据,若数据库中有
user表(包含id、name、age字段),则实体类可定义为:public class User { private int id; private String name; private int age; // 构造方法、getter和setter省略 }
实现步骤
加载数据库驱动并建立连接
使用Class.forName()加载驱动类(新版JDBC可省略此步骤),并通过DriverManager.getConnection()获取数据库连接对象,建议使用try-with-resources语句自动关闭资源,避免内存泄漏。

String url = "jdbc:mysql://localhost:3306/testdb";
String username = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
// 后续操作
} catch (SQLException e) {
e.printStackTrace();
}
创建Statement对象并执行查询
通过连接对象创建Statement或PreparedStatement(推荐使用,可防止SQL注入),然后执行查询语句(如SELECT * FROM user),返回ResultSet结果集。
String sql = "SELECT id, name, age FROM user";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// 处理结果集
}
遍历结果集并转换为对象
逐行读取ResultSet中的数据,通过ResultSet的getXXX()方法(如getInt()、getString())获取字段值,并创建实体类对象,需注意字段类型与Java类型的匹配(如数据库的DATETIME可对应java.util.Date)。
List<User> userList = new ArrayList<>();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
userList.add(user); // 将对象添加到List
}
关闭资源
ResultSet、Statement和Connection均需在操作完成后关闭,try-with-resources会自动处理这一过程。

完整代码示例
以下是一个完整的示例,展示如何从数据库查询用户数据并添加到List<User>中:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class DatabaseToListExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String username = "root";
String password = "123456";
String sql = "SELECT id, name, age FROM user";
List<User> userList = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
userList.add(user);
}
// 打印结果验证
userList.forEach(user -> System.out.println("ID: " + user.getId() + ", Name: " + user.getName()));
} catch (SQLException e) {
System.err.println("数据库操作失败: " + e.getMessage());
}
}
}
class User {
private int id;
private String name;
private int age;
// 构造方法、getter和setter
public User() {}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
优化与注意事项
- 使用连接池:频繁创建和关闭连接会影响性能,推荐使用HikariCP、Druid等连接池管理数据库连接。
- 批量处理:若数据量较大,可通过
Statement的addBatch()和executeBatch()方法批量执行查询,减少网络开销。 - ORM框架:对于复杂场景,可使用MyBatis、Hibernate等ORM框架,简化数据库操作与对象映射。
- 异常处理:需捕获并处理
SQLException,避免程序因数据库错误中断。 - 字段映射:确保数据库字段名与实体类属性名一致,或通过
ResultSetMetaData动态映射。
常见问题与解决方案
问题1:如何处理数据库字段与实体类属性名不一致的情况?
解答:可通过以下两种方式解决:
- 使用别名:在SQL查询中使用
AS关键字为字段指定别名,如SELECT user_id AS id FROM user。 - ORM框架:使用MyBatis的
@ResultMap或Hibernate的@Column注解手动映射字段与属性的关系。
问题2:当数据量很大时,如何避免内存溢出?
解答:

- 分页查询:通过
LIMIT offset, size分页获取数据,减少单次查询的数据量。 - 流式处理:使用JDBC的
TYPE_FORWARD_ONLY和FETCH_SIZE属性,结合ResultSet的游标逐行处理,避免一次性加载所有数据到内存。 - 缓存策略:若需多次访问,可考虑使用Redis等缓存中间件存储数据,而非全部加载到List中。
通过以上步骤和注意事项,可以高效、安全地将数据库数据添加到List集合中,满足不同业务场景的需求。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/246779.html