Mybatis獲取新增記錄(insert)的主鍵值

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

 

發佈了124 篇原創文章 · 獲贊 15 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章