9.4 深入Mapper XML映射文件 9.4.2 insert,update和delete

9.4 深入Mapper XML映射文件 9.4.2 insert,update和delete

insert,updatedelete元素用来映射DML语句,是MyBatis中最常用的元素之一。

insert update delete元素的属性

insert,updatedelete元素配置和select非常接近。例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<insert
id="insertUser"
parameterType="domain.User"
flushCacher="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateUser"
parameterType="domain.User"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteUser"
parameterType="domain.User"
flushCache="true"
statementType="PREPARED"
timeout="20">

insert和update特有的属性描述

insertupdatedelete元素的属性大多和select的一致,它们特有的属性描述如下:

useGeneratedKeys

useGeneratedKeys,(仅对insertupdate有用)这会令MyBatis使用的JDBCgetGeneratedKeys方法来获取由数据库内部生成的主键(比如,像MySQLSQLServer这样的关系数据库管理系统的自动递增字段),默认值为false

keyProperty

keyProperty,(仅对insertupdate有用)唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的selectKey子元素设置它的键值,默认为unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表.

keyColumn

keyColumn,(仅对insertupdate有用)通过生成的键值设置表中的列名,这个设置仅对某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列时需要设置如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表.

示例

下面是insertupdatedelete语句的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<insert id="insertUser">
insert into tb_user(id,username,password,email,address)
values(#{id},#{username},#{password},#{email},#{address})
</insert>
<update id="updateUser">
update tb_user set
username=#{username},
password=#{password},
email=#{email},
address=#{id}
where id=#{id}
</update>
<delete id="deleteUser">
delete from tb_user where id=#{id}
</delete>

自动生成列

而插入语句的配置规则更加丰富,因为在插入语句执行时很多时候是需要返回插入成功的数据生成的主键值的,所以insert元素里面有一些额外的属性和子元素用来处理主键的生成,而且根据数据库的主键生成策略不同,配置也有多种方式。
首先,如果数据库支持自动生成主键的字段(比如MySQLSQLServer),那么可以设置useGeneratedKeys="true",然后再把keyProperty设置到目标属性上就可以了(一般会设置到id属性上)。例如,如果上面的TB_USER表已经对id使用了自动生成的列类型,那么语句可以修改为:

1
2
3
4
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into tb_user(username,password,email,address)
value(#{username},#{password},#{email},#{address})
</insert>

不支持自动生成主键的情况

对于不支持自动生成类型的数据库(比如Oracle)或可能不支持自动生成主键的JDBC驱动来说,MyBatis有另外一种方法来生成主键。

insert元素写法

1
2
3
4
5
6
7
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORM">
select SEQUENCE_TB_USER.nextval as id from dual
</selectKey>
insert into tb_user(id,username,password,email,address)
value(#{id},#{username},#{password},#{email},#{address})
</insert>

在上面的示例中,selectKey元素将会首先运行,其通过查询SEQUENCE序列,TB_USERid会被设置,然后插入语句会被调用。

selectKey标签

selectKey元素描述如下:

1
2
3
4
5
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
  • keyProperty,selectKey语句结果应该被设置到目标属性(一般会设置到id属性)上。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
  • keyColumn,匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
  • resultType,结果的类型。MyBatis通常可以推算出来,但是为了更加确定,建议明确写出。MyBatis允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的Object或一个Map
  • order,可以被设置为BEFOREAFTER。如果设置为BEFORE,那么它会首先选择主键设置keyProperty然后执行插入语句。如果设置为AFTER,那么先执行插入语句,然后是selectKey元素。
  • statementType,与前面相同,MyBatis支持STATEMENTPREPAREDCALLABLE语句的映射类型,分别代表StatementPreparedStatementCallableStatement类型。