跳到主要内容

映射表

例1:默认情况下类名即为表名
@Table
public class Users { // 映射为 Users 表
private Integer id; // 映射为 id 列
private String name; // 映射为 name 列
private Integer age; // 映射为 age 列

// getters and setters omitted
}
例2:使用特定名称
@Table("admin_users")
public class AdminUsers { // 表名映射为 admin_users 表
private Integer id; // 映射为 id 列
private String name; // 映射为 name 列
private Integer age; // 映射为 age 列
@Column("create_time")
private Date createTime; // 映射为 create_time 列

// getters and setters omitted
}
例3:指定 catalog/schema 信息
@Table(catalog = "co", 
schema = "example",
table = "admin_users")
public class AdminUsers { // 表名映射为 co.example.admin_users
private Integer id; // 映射为 id 列
private String name; // 映射为 name 列
private Integer age; // 映射为 age 列

// getters and setters omitted
}
例4:按照注解进行精确映射
@Table(table = "admin_users", autoMapping = false)
public class AdminUsers { // 表名映射为 admin_users
private Integer id; // 不映射
private String name; // 不映射
@Column
private Integer age; // 映射为 age 列
@Column("create_time")
private Date createTime; // 映射为 create_time 列

// getters and setters omitted
}
例5:忽略某个属性的列映射
@Table(table = "admin_users")
public class AdminUsers { // 表名映射为 admin_users
private Integer id; // 映射为 id 列
private String name; // 映射为 name 列
private Integer age; // 映射为 age 列
@Ignore
private Date modifyTime; // 忽略到列的映射
}

@Table 注解属性

属性名描述
catalog可选 映射的 catalog 名,默认值为:空。
schema可选 映射的 schema 名,默认值为:空。
table可选 映射的 table,为空的话表示采用类名为表名,默认为:空。
- 提示:value 属性和 table 具有同等效力,当所有属性都采用默认值时候可以利用 例2 方式省略属性名。
value可选 映射的 table,为空的话表示采用类名为表名,默认为:空。
- 提示:value 属性和 table 具有同等效力,当所有属性都采用默认值时候可以利用 例2 方式省略属性名。
autoMapping可选 自动映射,默认为 true 表示使用自动映射。当设置为 false 后所有列的映射必须通过 @Column 注解声明。
useDelimited可选 会在生成的 SQL 语句中使用限定符将表或列的名称包裹起来,用于处理关键字为名称的情况。默认为 false 表示不使用限定符。
caseInsensitive可选 是否对表名列名敏感,默认 true 不敏感。该属性作用于获取查询结果时。
mapUnderscoreToCamelCase可选 表名和属性名,根据驼峰规则转换为带有下划线的表名和列名,默认不启用。
ddlAuto可选 自动建表方式,可选值范围:none、create、add、update、create-drop(目前还不支持自动建表)

继承中的 @Table 行为

在实体继承结构中,父类字段上的 @Column@Ignore 等注解会被子类正确继承,但 @Table 是类级注解,不会从父类继承。 因此 autoMapping 等属性只以实际注册的实体类(叶子类)自身的 @Table 声明为准。

父类 autoMapping=false 不影响子类
@Table(value = "user_info", autoMapping = false)
public class ParentEntity {
@Column(primary = true)
private Integer id; // 有 @Column → 子类也会映射
private Integer age; // 无 @Column → 是否映射取决于子类的 autoMapping
}

@Table(value = "user_info", autoMapping = true)
public class ChildEntity extends ParentEntity {
private String email; // 无 @Column → 自动映射(子类 autoMapping=true 生效)
}
// ChildEntity 注册后:id、age、email 三个字段全部映射
// ParentEntity 的 autoMapping=false 对 ChildEntity 没有任何影响
反之:父类 autoMapping=true 也不影响子类
@Table(value = "user_info", autoMapping = true)
public class ParentEntity {
@Column(primary = true)
private Integer id; // 有 @Column → 始终映射
private Integer age; // 无 @Column → 是否映射取决于子类的 autoMapping
}

@Table(value = "user_info", autoMapping = false)
public class ChildEntity extends ParentEntity {
private String email; // 无 @Column → 不映射(子类 autoMapping=false 生效)
}
// ChildEntity 注册后:仅 id 被映射(唯一有 @Column 的字段)
// age 和 email 因子类 autoMapping=false 而未映射

@Column 注解属性

属性名描述
name可选 列名,为空的话表示采用属性名为列名。
value可选 列名,为空的话表示采用属性名为列名。
jdbcType可选 指定使用的 jdbcType,默认值为:Types.JAVA_OBJECT
specialJavaType可选 如果属性是一个抽象类型,那么可以通过 specialJavaType 来指定具体的实现类。
typeHandler可选 指定使用的 typeHandler 处理类型的读写
keyType可选 仅对 构造器 API 有效。表示当属性值为 null 时所采用的数据生成算法。详细请了解 主键生成器
primary可选 是否为主键,默认为 false,表示不是主键
insert可选 仅对 构造器 API 有效。表示当在 insert 操作时是否参与新增。详细请了解 写入策略
update可选 仅对 构造器 API 有效。表示当在 update 操作时是否参与更新。详细请了解 写入策略
selectTemplate可选 仅对 构造器 API 有效。当用作 select 语句时列名的写法。默认是空,表示列名本身。详细请了解 语句模版
insertTemplate可选 仅对 构造器 API 有效。当用作 insert 语句时参数写法,默认是 ?。详细请了解 语句模版
setValueTemplate可选 仅对 构造器 API 有效。当用作 update set 语句时参数写法,默认是 ?。详细请了解 语句模版
whereColTemplate可选 仅对 构造器 API 有效。当用作 update/delete 的 where 语句时列名的写法。默认是空,表示列名本身。详细请了解 语句模版
whereValueTemplate可选 仅对 构造器 API 有效。当用作 update/delete 的 where 语句时参数写法,默认是 ?。详细请了解 语句模版
orderByColTemplate可选 仅对 构造器 API 有效。当用作 order by 语句时列名的写法。默认是空,表示列名本身。详细请了解 语句模版

@Primary 注解

注意区分 @Column(primary=true)@Primary

这两个概念名称相近但含义完全不同,请注意区分。

@Column(primary = true) —— 表示该属性对应的列是数据库主键。用于 INSERT/UPDATE/DELETE 操作时确定 WHERE 条件。

@Table("user_info")
public class UserInfo {
@Column(primary = true)
private Integer id; // 标记 id 列为数据库主键
private String name;
}

@Primary —— 当同一列映射到多个属性时,标记哪个属性是首选属性。 通过 getPrimaryPropertyByColumn 方法可以获取该首选属性。

@Table("user_info")
public class UserInfo {
@Column(primary = true)
private Integer id;

@Column("name")
private String aliasName; // 属性 aliasName 映射到 name 列

@Primary
@Column("name")
private String primaryName; // 属性 primaryName 也映射到 name 列,且为首选
}

上例中 aliasNameprimaryName 都映射到数据库的 name 列。 通过 getPropertyByColumn("name") 会返回两个属性,而 getPrimaryPropertyByColumn("name") 只返回标注了 @PrimaryprimaryName

使用注意事项:

  • 同一列的多个属性中,最多只能有一个标注 @Primary,否则会抛出 IllegalStateException 异常。
  • 如果同一列的多个属性都没有标注 @Primary,则 getPrimaryPropertyByColumn 返回 null
  • @Primary 可标注在字段或 getter/setter 方法上。
  • @Primary@Column(primary=true) 可以同时使用且互不影响:前者解决"多属性选哪个"的问题,后者声明"这是主键列"。