通用 Mapper 中,默认情况下是将实体类字段按照驼峰转下划线形式的表名列名进行转换。
例如
实体类的 userName
可以映射到表的 user_name
上。
@Table` 注解
@Table
注解可以配置 name
,catalog
和 schema
三个属性,配置 name
属性后,直接使用提供的表名,不再根据实体类名进行转换。其他两个属性中,同时配置时,catalog
优先级高于 schema
,也就是只有 catalog
会生效。
配置示例如下:
@Table(name = "sys_user")
public class User
@Column
注解
@Column
注解支持 name
, insertable
和 updateable
三个属性。
name
配置映射的列名。
insertable
对提供的 insert
方法有效,如果设置 false
就不会出现在 SQL 中。
updateable
对提供的 update
方法有效,设置为 false
后不会出现在 SQL 中。
配置示例如:
@Column(name = "user_name")
private String name;
除了直接映射 name
到 user_name
这种用法外,在使用关键字的情况,还会有下面的用法:
@Column(name = "`order`")
private String order;
对于关键字这种情况,通用 Mapper 支持自动转换
@Transient
注解
一般情况下,实体中的字段和数据库表中的字段是一一对应的,但是也有很多情况我们会在实体中增加一些额外的属性,这种情况下,就需要使用 @Transient
注解来告诉通用 Mapper 这不是表中的字段。
默认情况下,只有简单类型会被自动认为是表中的字段(可以通过配置中的 useSimpleType 控制)。
这里的简单类型不包含 Java 中的8种基本类型:
byte,short,int,long,float,double,char,boolean
这是因为在类中,基本类型会有默认值,而 MyBatis 中经常会需要判断属性值是否为空,所以不要在类中使用基本类型,否则会遇到莫名其妙的错误。
对于类中的复杂对象,以及 Map
,List
等属性不需要配置这个注解。
配置示例:
@Transient
private String otherThings; //非数据库表中字段
主键策略和数据库关系很大,有些数据库支持主键自增,而有些数据库只能通过序列来获得
getGeneratedKeys
方法取回主键的情况这种情况首先需要数据库支持自增,其次数据库提供的 JDBC 支持 getGeneratedKeys
方法。
常见的如 MySql,SqlServer 支持这种模式。
这种情况下,配置主键策略最简单。
用法如下:
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
对应生成的 XML 代码:
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into country (id, countryname, countrycode)
values (#{id},#{countryname},#{countrycode})
</insert>