JDBC结合反射将ResultSet转为对象的核心是通过ResultSetMetaData获取列名,经下划线转驼峰匹配Java字段,调用setAccessible(true)设值,并按字段类型安全赋值;推荐使用@Column注解精确控制映射,批量转换时需逐行创建新实例。

Java 中 JDBC 结合反射将 ResultSet 转为对象,核心是利用 ResultSetMetaData 获取列名,再通过反射匹配类字段并设值。关键不在“能不能”,而在“怎么配得准、设得稳”。
字段名匹配:驼峰与下划线自动对齐
数据库字段如 user_name、create_time,Java 实体属性通常用驼峰命名(userName、createTime)。反射转换时需做名称转换:
- 调用工具方法(如
RegexUtils.underlineToHump("user_name"))转成userName - 再用
Class.getDeclaredField(fieldName)查找对应私有字段 - 必须调用
field.setAccessible(true)才能给 private 字段赋值
类型安全赋值:避免 argument type mismatch
常见报错 java.lang.IllegalArgumentException: argument type mismatch 多因数据库类型与 Java 字段类型不一致,例如:
- MySQL 的
BIGINT对应 Java 的Long,不是int -
DECIMAL建议映射为BigDecimal,而非Double(精度丢失风险) - 日期字段优先用
LocalDateTime,配合rs.getTimestamp()+.toLocalDateTime()
建议在设值前判断字段类型:if (field.getType() == Long.class) value = rs.getLong(colName);
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
推荐用注解控制映射逻辑
纯靠字段名匹配容易出错(比如表里有 id 和 ID),更可靠的方式是加自定义注解:
- 定义
@Column(value = "user_name", ignore = false) - 转换时先检查字段是否有该注解,有则优先按
value匹配列名 - 支持
ignore = true跳过某些字段(如密码、状态码等非查询字段)
批量转换:一行一对象,封装进 List
单个对象转换后,只需在外层加循环即可批量处理:
- 调用
rs.next()遍历每一行 - 每行创建一个新实例:
T obj = clazz.getDeclaredConstructor().newInstance() - 对当前行所有列执行字段查找 + 类型设值
- 将完成赋值的对象 add 进
List<t></t>
注意:不要复用同一个对象实例,否则 List 里全是最后一条数据的引用。

















