1. 生成方式
对于主键生成,MyBatis提供了多种生成方式。
1.1 数据库自增
如果数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),插入数据时,不需要设置主键,数据库会自己生成,但是要想获取到主键则需要使用useGeneratedKeys属性(仅适用于 insert 和 update),这会让MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。
案例演示:
Insert标签添加属性getGeneratedKeys,并指定keyColumn及keyProperty:
<!--插入用户-->
<insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
INSERT INTO base_user (user_id,user_name,login_name)
VALUES (#{user.userId},#{user.userName},#{user.loginName})
</insert>
执行SQL,并获取数据库自动生成的主键:
1.2 不支持自增的数据库
对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动,可以使用selectKey标签来生成主键。
selectKey 元素描述如下:
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
selectKey 元素的属性:
| 属性 | 描述 |
|---|---|
keyProperty | selectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
keyColumn | 返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
resultType | 结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。 |
order | 可以设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。 |
statementType | 和前面一样,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 类型的映射语句,分别代表 Statement, PreparedStatement 和 CallableStatement 类型。 |
案例演示:
添加selectKey 标签,设置生成ID算法:
<insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
<selectKey keyProperty="user.userId" keyColumn="user_id" resultType="long" order="BEFORE" >
select max(user_id)+1 as user_id from base_user
</selectKey>
INSERT INTO base_user (user_id,user_name,login_name)
VALUES (#{user.userId},#{user.userName},#{user.loginName})
</insert>
执行语句测试,可以看出是先生成了ID,然后设置到实体类中: