注解需设为runtime保留策略,@table标类、@column标字段,lombok需加@noargsconstructor;反射获取元数据时须设field.setaccessible(true);按类型映射sql类型并用stringbuilder安全拼接create table语句,主键需识别iskey或@id,生成前校验表与字段是否存在。

明确注解定义与保留策略
必须确保 @Table 和 @Column 是 @Retention(RetentionPolicy.RUNTIME),否则运行时反射无法获取。@Table 标在类上,@Column 标在字段上,两者的 @Target 分别为 ElementType.TYPE 和 ElementType.FIELD。若用 Lombok,注意 @Data 不自动提供无参构造器,需显式加 @NoArgsConstructor。
通过反射提取表名与字段元数据
用 Class.getAnnotation(Table.class) 获取表名;遍历 Class.getDeclaredFields(),对每个字段调用 field.getAnnotation(Column.class) 提取列名、类型、长度等信息。字段若为 private,需先执行 field.setAccessible(true) 才能读取值或后续赋值。
按字段类型映射 SQL 数据类型
不能硬编码字段名到类型,要建立类型映射规则:
- String → VARCHAR(255),可结合 @Column.length 动态调整
- Long / Integer → BIGINT / INT
- Boolean → TINYINT(1) 或 BOOLEAN(依数据库支持)
- LocalDateTime → TIMESTAMP(需 JDBC 4.2+,否则转为 java.sql.Timestamp)
- byte[] → BLOB
组装 CREATE TABLE 语句并校验结构
拼接 SQL 时避免字符串拼接风险,用 StringBuilder 安全组装。主键字段需识别 @Column(isKey = true) 或单独 @Id 注解,并附加 PRIMARY KEY 约束。生成前建议检查目标库中是否已存在同名表——可通过 DatabaseMetaData.getTables() 查询;若需严格校验字段一致性,还可调用 getColumns() 对比预期字段是否存在、类型是否兼容。











