java可通过反射+自定义映射规则将mysql下划线命名(如user_name)自动转驼峰命名(如username)并赋值到对象属性,核心是resultset取值时转换列名再反射匹配字段。

Java 中可以通过反射 + 自定义映射规则,将 MySQL 表的下划线命名(如 user_name、create_time)自动转为驼峰命名(如 userName、createTime)并赋值到 Java 对象属性上。核心思路是:在从 ResultSet 取值时,把列名转驼峰,再通过反射找到对应字段(或 getter/setter)完成赋值。
1. 实现列名到驼峰属性名的转换
这是基础工具方法,用于将 user_id → userId、order_status → orderStatus:
public static String underscoreToCamelCase(String underscoreName) {
if (underscoreName == null || underscoreName.isEmpty()) return underscoreName;
StringBuilder result = new StringBuilder();
boolean nextUpperCase = false;
for (int i = 0; i
2. 使用反射根据驼峰名查找并设置字段值
假设你有一个实体类(如 User),字段均为驼峰命名且为 public 或有 public setter:
public class User {
private Long id;
private String userName;
private String createTime;
// getter / setter 省略
}
可封装一个通用方法,用反射将 ResultSet 每一行映射为对象:
public static <t> T mapToEntity(ResultSet rs, Class<t> clazz) throws SQLException, IllegalAccessException, InstantiationException {
T instance = clazz.getDeclaredConstructor().newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i
</t></t>
3. 在 JDBC 查询中调用映射逻辑
使用示例(简化版,不依赖 ORM):
String sql = "SELECT id, user_name, create_time FROM user";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
List<user> users = new ArrayList();
while (rs.next()) {
User user = mapToEntity(rs, User.class);
users.add(user);
}
}
</user>
4. 进阶建议(提升健壮性)
-
缓存字段/方法引用:避免每次反射查字段或方法,可用
ConcurrentHashMap<class map field>></class>缓存已解析的映射关系,提升性能 -
类型兼容处理:MySQL 的
TIMESTAMP映射为java.time.LocalDateTime,需在mapToEntity中做类型适配(如判断字段类型后强转或使用rs.getTimestamp()) -
忽略大小写或别名支持:SQL 中用
AS别名(如user_name AS userName)可绕过转换,也可在转换前统一转小写增强容错 -
使用注解控制映射:为字段加
@Column(name = "user_name"),优先读注解值,再回落到自动转换,更灵活可控
不复杂但容易忽略细节:列名转驼峰要严格处理连续下划线、开头下划线、全大写缩写(如 API_KEY → apiKey)等边界情况;反射设值前务必检查访问权限和空值类型匹配。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











