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