jdbc不提供自动映射,需手动从resultset读取字段赋值给实体类;可基于反射封装通用工具类,或使用dbutils、mybatis、jdbctemplate等框架简化映射。

Java 中 JDBC 本身不提供自动映射功能,需要手动从 ResultSet 中读取字段并赋值给实体类对象。核心思路是:遍历结果集,逐行调用 getXXX() 方法获取列值,再通过构造器或 setter 方法封装为实体类实例。
手动映射(最基础、最可控)
适用于字段少、逻辑简单或对性能/控制力要求高的场景。关键点是列名与字段名的对应、类型匹配、空值处理。
- 使用
rs.getString("name")、rs.getInt("id")等方法按列名或下标取值(推荐列名,更可读) - 注意
ResultSet的游标初始在第 0 行,需先调用rs.next()才能读取第一行 - 对可能为 NULL 的字段,应检查
rs.wasNull()或使用包装类型(如Integer而非int) - 示例:
List<user> users = new ArrayList();
while (rs.next()) {
User u = new User();
u.setId(rs.getLong("id"));
u.setName(rs.getString("name"));
u.setEmail(rs.getString("email"));
u.setCreatedAt(rs.getTimestamp("created_at"));
users.add(u);
}
</user>
反射 + 通用映射工具类(提升复用性)
通过反射读取实体类的 setter 方法,根据 ResultSet 列名自动匹配并调用对应方法。适合多表、多实体且结构较规整的项目。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 获取
ResultSetMetaData得到列名列表(注意大小写敏感,建议统一转小写或按数据库实际命名) - 遍历所有 setter 方法,提取属性名(如
setName→name),与列名比对 - 使用
PropertyDescriptor和Method.invoke()安全设值,配合类型转换(如String→LocalDateTime) - 可封装为静态方法:
BeanUtil.mapToBean(rs, User.class)
借助轻量框架简化(推荐日常开发)
避免重复造轮子,选用成熟、无侵入的工具库:
-
Apache Commons DbUtils:提供
BeanHandler(单条)、BeanListHandler(多条),自动完成字段映射,支持驼峰命名(需开启BasicRowProcessor驼峰转换) -
MyBatis(原生模式):即使不用 XML 或注解 SQL,也可用
ResultHandler或RowMapper接口自定义映射逻辑,比纯 JDBC 更简洁 -
JdbcTemplate(Spring JDBC):配合
RowMapper实现一行一对象,代码清晰,异常处理和资源管理已内置
注意事项与避坑点
映射过程容易忽略但影响稳定性的细节:
- 列别名要与实体字段名一致(SQL 中用
AS user_name对应setUserName()) - 数据库字段类型和 Java 类型需兼容(如 PostgreSQL 的
jsonb需额外解析为 String 或对象) - 时间类型注意时区:
rs.getTimestamp()返回的是 JVM 默认时区的时间,必要时用rs.getObject("col", LocalDateTime.class) - 不要在循环外创建实体对象并反复 set —— 每次都要新建实例,否则列表里全是同一个对象的引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










