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
发布了129 篇原创文章 · 获赞 20 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Bof_jangle/article/details/103702782
今日推荐