mybatis主键自增

x33g5p2x  于2022-02-17 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(170)

mybatis主键自增

一、selectKey标签(注解)

1.1 selectKey标签

<!-- 新增用户 -->
<insert id="insertUser" parameterType="com.mybatis.po.User">
    <selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO tb_user(user_name,blog_url,remark)
    VALUES(#{userName},#{blogUrl},#{remark})
</insert>

1.2 selectKey注解

@Insert(" insert into table(c1,c2) values (#{c1},#{c2}) ")
@SelectKey(resultType = long.class,keyColumn = "id",before = false,statement = "SELECT LAST_INSERT_ID() AS id",keyProperty = "id")
  • before=false:由于mysql支持自增长主键,所以先执行插入语句,再获取自增长主键值
  • keyColumn:自增长主键的字段名
  • keyProperty: 实体类对应存放字段,注意数据类型和resultType一致
  • tatement:实际执行的sql语句

SelectKey返回的值存在实体类中,线程安全,所以不论插入成功与否id都会安全自增

二、useGeneratedKeys属性、keyProperty属性

2.1 xml文件方式

<!-- 新增用户 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" parameterType="com.mybatis.po.User">
    INSERT INTO tb_user(user_name,blog_url,remark)
    VALUES(#{userName},#{blogUrl},#{remark})
</insert>
  • useGeneratedKeys属性表示使用自增主键
  • keyProperty属性是Java包装类对象的属性名

2.2 注解方式

@Insert("INSERT INTO tb_user(user_name,blog_url,remark)  VALUES(#{userName},#{blogUrl},#{remark}")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
  • useGeneratedKeys属性表示使用自增主键
  • keyProperty属性是Java包装类对象的属性名
  • keyColumn属性是mysql表中的字段名

三、非自增主键

uuid类型和Oracle的序列主键nextval,它们都是在insert之前生成的,其实就是执行了SQL的uuid()方法及nextval()方法,所以SQL映射文件的配置与上面的配置类似,依然使用< selectKey>标签对,但是order属性被设置为before(因为是在insert之前执行),resultType根据主键实际类型设定。

3.1 UUID配置

<selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String">
    SELECT uuid()
</selectKey>

3.2 Oracle序列配置

<selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String">
    SELECT 序列名.nextval() FROM DUAL
</selectKey>

相关文章