9.4 深入Mapper XML映射文件 9.4.2 insert,update和delete
insert
,update
和delete
元素用来映射DML
语句,是MyBatis
中最常用的元素之insert
,update
和delete
元素配置和select
非常接近。例如
1 | <insert |
特有的属性描述
insert
、update
和delete
元素的属性大多和select
的一致,它们特有的属性描述如下:useGeneratedKeys
。(仅对insert
和update
有用)这会令MyBatis
使用的JDBC
的getGeneratedKeys
方法来获取由数据库内部生成的主键(比如,像MySQL
和SQLServer
这样的关系数据库管理系统的自动递增字段),默认值为false
。keyProperty
。(仅对insert
和update
有用)唯一标记一个属性,MyBatis
会通过getGeneratedKeys
的返回值或者通过insert
语句的selectKey
子元素设置它的键值,默认为unset
。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表.keyColumn
,(仅对insert
和update
有用)通过生成的键值设置表中的列名,这个设置仅对某些薮据库(像PostgreSQL)
是必须的,当主键列不是表中的第一列时需要设置如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表.
示例
下面是insert
、update
和delete
语句的示例
1 | <insert id="insertUser" |
自动生成列
而插入语句的配置规则更加丰富,因为在插入语句执行时很多时候是需要返回插入成功的数据生成的主键值的,所以insert
元素里面有一些额外的属性和子元素用来处理主键的生成,而且根据数据库的主键生成策略不同,配置也有多种方式。
首先,如果数据库支持自动生成主键的字段(比如MySQL
和SQLServer)
,那么可以设置useGeneratedKeys="true"
,然后再把keyProperty
设置到目标属性上就可以了(一般会设置到id
属性上)。例如,如果上面的TB_USER
表已经对id
使用了自动生成的列类型,那么语句可以修改为:
1 | <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> |
不支持自动生成主键的情况
对于不支持自动生成类型的数据库(比如Oracle)
或可能不支持自动生成主键的JDBC
驱动来说,MyBatis
有另外一种方法来生成主键。
1 | <insert id="insertUser"> |
在上面的示例中,selectKey
元素将会首先运行,其通过查询SEQUENCE
序列,TB_USER
的id
会被设置,然后插入语句会被调用。
selectKey标签
selectKey
元素描述如下:
1 | <selectKey |
keyProperty
,selectKey
语句结果应该被设置到目标属性(一般会设置到id
属性)上。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。keyColumn
,匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。resultType
,结果的类型。MyBatis
通常可以推算出来,但是为了更加确定,建议明确写出。MyBatis
允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的Object
或一个Map
order
,可以被设置为BEFORE
或AFTER
。如果设置为BEFORE
,那么它会首先选择主键设置keyProperty
然后执行插入语句。如果设置为AFTER
,那么先执行插入语句,然后是selectKey
元素。statementType
,与前面相同,MyBatis
支持STATEMENT
、PREPARED
和CALLABLE
语句的映射类型,分别代表Statement
、PreparedStatement
和CallableStatement
类型。