3.3 database mapping - xphsc/EasyJdbc GitHub Wiki

2.3 数据库映射 通用 easyjdbc 中,默认情况下是将实体类字段按照驼峰转下划线形式的表名列名进行转换。

例如:

实体类的 userName 可以映射到表的 user_name 上。

数据库映射主要涉及到一些注解和全局配置,这一节中会介绍所有注解,后面章节会有配置的介绍。

通用 easyjdbc 默认使用了几个简单的注解,其他 JPA 的注解默认并不支持,但是如果你开发自己的通用方法,你可以使用 JPA 注解或者引入自己的注解。

3.3.1 @Table @Entity注解(JPA)

@Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名 @Table 注解可以配置 name,catalog 和 schema 三个属性,配置 name 属性后,直接使用提供的表名,不再根据实体类名进行转换。其他两个属性中,同时配置时,catalog 优先级高于 schema,也就是只有 catalog 会生效。

配置示例如下:

@Entity
@Table(name = "t_user")
public class User

将 User 实体映射到 t_user 表。

3.3.2 @Column 注解(JPA)

@Column 注解支持 name, insertable 和 updateable 三个属性。

name 配置映射的列名。

insertable 对提供的 insert 方法有效,如果设置 false 就不会出现在 SQL 中。

updateable 对提供的 update 方法有效,设置为 false 后不会出现在 SQL 中。

配置示例如:

@Column(name = "user_name")
private String userName;

除了直接映射 name 到 user_name 这种用法外,在使用关键字的情况,还会有下面的用法:

@Column(name = "`order`")
private String order;

3.3.3 @Transient 注解(JPA)

一般情况下,实体中的字段和数据库表中的字段是一一对应的,但是也有很多情况我们会在实体中增加一些额外的属性,这种情况下,就需要使用 @Transient 注解来告诉通用 Mapper 这不是表中的字段。

默认情况下,只有简单类型会被自动认为是表中的字段(可以通过配置中的 useSimpleType 控制)。

这里的简单类型不包含 Java 中的8种基本类型:

byte,short,int,long,float,double,char,boolean

这是因为在类中,基本类型会有默认值,而 MyBatis 中经常会需要判断属性值是否为空,所以不要在类中使用基本类型,否则会遇到莫名其妙的错误。 对于类中的复杂对象,以及 Map,List 等属性不需要配置这个注解。

对于枚举类型作为数据库字段的情况,需要看配置中的 enumAsSimpleType 参数。

配置示例:

@Transient
private String otherThings; //非数据库表中字段

3.3.4 @Id 注解(JPA)

上面几个注解都涉及到映射。 @Id 注解和映射无关,它是一个特殊的标记,用于标识数据库中的主键字段。

正常情况下,一个实体类中至少需要一个标记 @Id 注解的字段,存在联合主键时可以标记多个。

如果表中没有主键,类中就可以不标记。

当类中没有存在标记 @Id 注解的字段时,你可以理解为类中的所有字段是联合主键。使用所有的 ByPrimaryKey 相关的方法时,有 where 条件的地方,会将所有列作为条件。

配置示例:

@Id
private Integer id;

3.4.5 @GeneratedValue 注解(JPA)

主键策略注解,用于配置如何生成主键。

由于不同类型数据库的配置不同,所以后面有一节专门介绍该注解的文档。