
本文介绍在 java jdbc 应用中,如何将 mysql 表中的所有用户数据读取并封装为对象列表(如 `arraylist` 或 `linkedlist`),再统一打印,替代逐行直接输出的原始方式。
在实际开发中,仅将查询结果即时打印(如 while(rs.next()) { System.out.println(...); })虽简单,但缺乏灵活性:无法复用数据、难以做后续处理(如排序、过滤、导出)、也不符合面向对象设计原则。更专业的做法是——先将每条记录映射为一个 Java 对象,再批量存入集合容器(如 List
✅ 推荐实践:使用 record 封装数据(Java 14+)
Java 14 引入的 record 是专为不可变数据载体设计的轻量级类,自动提供构造器、equals()、hashCode() 和 toString(),非常适合表示数据库中的一行记录。以下是一个完整、可运行的示例:
import java.sql.*;
import java.util.LinkedList;
import java.util.List;
public class JDBC {
// 使用 record 定义学生实体(字段名需与数据库列名一致)
record Student(String name, int contact, int age) {
// 可选:自定义 toString() 提升可读性
@Override
public String toString() {
return String.format("Student{name='%s', contact=%d, age=%d}", name, contact, age);
}
}
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
try (Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC", "root", "root");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM student")) {
List students = new LinkedList<>(); // 频繁 add() 时 LinkedList 性能略优
while (rs.next()) {
students.add(new Student(
rs.getString("name"),
rs.getInt("contact"),
rs.getInt("age")
));
}
// 统一打印全部学生信息(调用 record 的 toString())
students.forEach(System.out::println);
}
}
} ? 关键改进说明:使用 try-with-resources 自动关闭 Connection、Statement 和 ResultSet,避免资源泄漏(比手动 close() 更安全可靠);LinkedList 在频繁尾部插入场景下比 ArrayList 略高效;若需随机访问或后续频繁 get(i),可改用 new ArrayList();record 自动生成 toString(),但建议显式重写以控制输出格式,提升调试和日志可读性;添加 ?serverTimezone=UTC 参数防止 MySQL 时区警告(推荐在连接 URL 中配置)。
⚠️ 注意事项与最佳实践
-
SQL 字段空值处理:rs.getString() 和 rs.getInt() 对 NULL 值返回 null 和 0,可能引发误判。生产环境应使用 rs.wasNull() 判断,或改用 Optional
包装; - 异常处理:示例中抛出 Exception 便于教学,实际项目应捕获 SQLException 并记录日志,避免程序崩溃;
- SQL 注入防护:当前使用静态 SQL,若涉及用户输入,请务必改用 PreparedStatement;
- 依赖版本兼容性:确保 mysql-connector-j(8.0.33+)与 JDK 版本匹配,并在 pom.xml 或构建路径中正确引入。
通过将数据库结果转化为强类型的集合对象,你不仅实现了需求中的“存入数组/列表再打印”,更奠定了可维护、可扩展的数据访问基础——后续添加搜索、分页、JSON 序列化等功能都将变得自然而简洁。











