Mysql、SQL Server:
<insert id="insert"
parameterType="xyz.jangle.model.BsTest" useGeneratedKeys="true" keyProperty="id">
insert into bs_test (
uuid,
create_time,
update_time,
status,
dm_desc,
dm_desc2
)
values (
#{uuid,jdbcType=VARCHAR},
now(),
now(),
#{status,jdbcType=INTEGER},
#{dmDesc,jdbcType=VARCHAR},
#{dmDesc2,jdbcType=VARCHAR}
)
</insert>
关键属性:useGeneratedKeys="true" keyProperty="id"
支持:MySQL、SQL Server拥有主键自增的数据库。
原理:useGeneratedKeys是指:使用JDBC的getGeneratedKeys方法获取数据库内部生成的主键,赋值给keyProperty指定的属性。
Oracle、MySQL、SQL Server:
<!-- 自增型的使用order="AFTER" ,获取插入之后的id值。 -->
<insert id="insert"
parameterType="xyz.jangle.model.BsTest" >
insert into bs_test (
uuid,
create_time,
update_time,
status,
dm_desc,
dm_desc2
)
values (
#{uuid,jdbcType=VARCHAR},
now(),
now(),
#{status,jdbcType=INTEGER},
#{dmDesc,jdbcType=VARCHAR},
#{dmDesc2,jdbcType=VARCHAR}
)
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER" >
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<!-- Oracle这种不使用自增,而是使用序列的,则需要使用order="BEFORE" 先将生成的值赋值给对应属性
然后将属性的值插入。即insert语句中需要书写id的列和id的属性 -->
<insert id="insert" parameterType="xyz.jangle.model.BsTest" >
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE" >
SELECT SEQ_ID.nextval from dual
</selectKey>
insert into bs_test (
id,
uuid,
create_time,
update_time,
status,
dm_desc,
dm_desc2
)
values (
#{id},
#{uuid,jdbcType=VARCHAR},
now(),
now(),
#{status,jdbcType=INTEGER},
#{dmDesc,jdbcType=VARCHAR},
#{dmDesc2,jdbcType=VARCHAR}
)
</insert>
原理:MySQL等,在数据库主键自增之后,将其值查询出来赋值给对应的属性。
原理2:Oracle等使用序列生成的主键,在插入记录之前,生成对应属性的值,将其赋值给对应的属性(这样插入的时候既保证属性中有值,也保证数据库记录中有值。)
selectKey的常见数据库写法(获取主键值的写法):
DB2、CLOUDSCAPE、DERBY: VALUES IDENTITY_VAL_LOCAL()
SQLSERVER:SELECT SCOPE_INDENTITY()
HSQLDB:CALL IDENTITY()
SYBASE:SELECT@@IDENTITY
DB2_MF:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
INFORMIX:select dbinfo('sqlca.sqlerrd1') from systables where tabid = 1