自定义注解实现orm映射的核心是用@table和@column声明实体与数据库的对应关系,并通过反射在运行时解析生成entitymeta结构。@table标注类并指定表名(支持显式命名和驼峰转下划线默认规则),@column标注字段并支持列名、主键、非空等属性,未标注时按字段名自动转换;entitymapper工具类通过反射提取注解信息,构建包含表名、主键字段及字段映射关系的元数据对象,供后续crud使用。
自定义注解实现 orm 映射,核心在于用 java 注解标记实体类与数据库表、字段的对应关系,再通过反射读取这些注解,在运行时生成 sql 或构造对象。不依赖第三方框架,关键在“声明即契约,反射即桥梁”。
定义表名映射注解 @Table
用于标注实体类,指定其对应的数据库表名。支持显式命名和默认规则(如类名转小写下划线)。
- 注解需声明为 @Retention(RetentionPolicy.RUNTIME),确保运行时可通过反射获取
- 建议提供 value() 属性(如
@Table("user_info")),同时兼容无参写法 - 若未指定 value,可约定默认逻辑:将驼峰类名
UserInfo转为下划线格式user_info
定义字段映射注解 @Column
标注在实体类字段上,声明该字段对应数据库中的列名、是否主键、是否可为空等元信息。
- 至少包含 value()(列名),例如
@Column("user_name") - 可扩展 id() boolean 表示主键字段(一个类中应有且仅有一个 id=true 的字段)
- 可选 nullable() boolean 和 length() int 等,便于后续生成建表语句或校验
- 注意:若字段未加 @Column,默认按字段名转下划线作为列名(如
userName→user_name)
通过反射解析注解并生成映射关系
编写工具类(如 EntityMapper),根据 Class 对象提取 @Table 和所有带 @Column 的字段,构建内存映射结构。
- 调用
clazz.getAnnotation(Table.class)获取表名;若为空,按默认规则推导 - 遍历
clazz.getDeclaredFields(),跳过 static/final 字段,对每个字段调用field.getAnnotation(Column.class) - 将字段名、列名、主键标识等封装为
ColumnMeta对象,存入 Map(key=字段名,value=元数据) - 最终形成
EntityMeta { tableName, primaryKeyField, columnMap }结构,供后续 CRUD 使用
实际使用示例
定义一个用户实体:
@Table("t_user")
public class User {
@Column(value = "id", id = true)
private Long userId;
@Column("user_name")
private String userName;
@Column
private Integer age; // 未显式指定 value,自动转为 "age"
}
调用 EntityMapper.of(User.class) 后,即可得到:
- 表名:
t_user - 主键字段:
userId(对应列id) - 字段映射:
userName → user_name,age → age










