Mybatis - SelectKey

一、背景:

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

属性 -描述:

① keyProperty : selectKey 语句结果应该被设置的目标属性。

② resultType:结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。

③ order: 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

④ statementType:和前面的相同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表PreparedStatement 和CallableStatement 类型。

二、应用场景

使用SELECT LAST_INSERT_ID() 这个sql语句来获取插入记录后返回的自增id

<insert id="insert" parameterClass="UserDO">

INSERT INTO user( user_id,user_nick,tel_phone,address,status, user_type,remark, gmt_create, gmt_modified)
VALUES ( #userId#, #userNick#, #telPhone#, #address#, #status#,
#userType#, #remark#, now(), now())
<selectKey keyProperty="id" resultClass="java.lang.Long">
SELECT LAST_INSERT_ID() AS value
</selectKey>
</insert>
其中user表的主键是自增的id.

三、存在的问题

【1-1】<selectKey keyProperty="id" resultClass="java.lang.Long">
SELECT LAST_INSERT_ID() AS value
</selectKey>
在高并发多个数据表都有写入的情况,下,这个语句返回的就有可能是另外一张表刚刚写入的记录id,这样根据这个id去查询就返回没有这个记录了。
【1-2】解决方案:用这个user表的唯一索引user_id去重新查一次user表来获取这个id,这种重新去查的方法基本可以满足大部分场景需求

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,850评论 0 4
  • 我站在大足石刻最著名的宝顶山石刻长廊前,仿佛是打开了一扇中国古代石刻历史之门。让我惊叹的是,我们的前人怎么会有这种...
    新月如水阅读 1,811评论 14 15
  • 1,一个普通的春节 我们一家都不是特别注重节日的人,不会有特别的庆祝。即便是过年,仍和往常一样吃吃喝喝,各做各的事...
    九州宅男儿阅读 186评论 0 0
  • 不 说 故 事 , 只 讲 道 理 提问 挽姐,我最近因为一些事情把自己弄得很不开心,但是我朋友却说这都是小事不值...
    爱晚睡阅读 1,722评论 0 5
  • 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧...
    ny5168阅读 815评论 0 0