java中通过自定义@column注解+反射+resultset遍历实现jdbc查询结果自动映射,保持原生控制力的同时消除手动setxxx重复代码,支持泛型、类型转换、null安全及不可变对象构造器注入。

Java 中通过注解简化 JDBC 查询结果集映射,核心是用自定义注解 + 反射 + ResultSet 遍历,替代手动逐字段 setXXX()。关键不在于“替代 JDBC”,而是在保持 JDBC 原生控制力的前提下,把重复的赋值逻辑自动化。
定义字段映射注解
先创建一个注解标记 Java Bean 的属性与数据库列的对应关系:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
String value() default ""; // 列名,可省略则默认用字段名
}
例如:
public class User {
@Column("user_id")
private Long id;
@Column // 自动匹配列名 "name"
private String name;
@Column("created_at")
private LocalDateTime createTime;
}
编写通用映射工具类
封装一个静态方法,接收 ResultSet 和目标类型,自动完成映射:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 遍历 ResultSetMetaData 获取列名(注意大小写兼容,建议统一转小写或使用 getColumnName + 数据库驱动行为)
- 获取目标类所有带 @Column 注解的字段,建立列名 → 字段的映射表
- 对每一行 ResultSet,新建实例,按列名查字段,用反射设置值(需处理基本类型包装、时间类型转换、null 安全等)
示例片段:
public static <t> List<t> mapToList(ResultSet rs, Class<t> clazz) throws SQLException {
List<t> list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();
Map<string field> columnToField = buildColumnFieldMap(clazz);
while (rs.next()) {
T obj = clazz.getDeclaredConstructor().newInstance();
for (int i = 1; i
</string></t></t></t></t>
配合 PreparedStatement 使用(无框架依赖)
完全基于 JDK,不引入 MyBatis 或 JDBI,但享受类似便利:
- 写 SQL 仍用 PreparedStatement,保障安全和性能
- 查询后直接调用工具方法:
List<user> users = ResultSetMapper.mapToList(rs, User.class);</user> - 支持泛型、支持嵌套对象(需扩展,比如加 @Join 或递归映射)
进阶:支持构造器注入与只读字段
如果类用 final 字段 + 构造器初始化,可扩展注解支持 @ConstructorProperties 或自定义 @Param(标注参数顺序/列名),再结合 Constructor.newInstance() 实例化。此时字段无需 setter,更符合不可变设计。
也可增加 @Ignore 注解跳过某些列,或 @Default 处理空值默认值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










