2020-03-03-MyBatis插入记录id增长同时获得方法SQL insert Statement的常用办法

MyBatis insert 声明使用

1、一般的insert

//一般的insert,会返回成功插入的条数

<insert id="insertEntity" parameterType="Entity">

insert into.....

</insert>

2、使用生成的键值之 useGeneratedKeys=”true”

<insert id="insertEntity" useGeneratedKeys="true"

    keyProperty="id" parameterType="Entity">

  insert into.....

</insert>

class Entity{

  private Long id;

  //other fields

}

keyProperty指定了需要生成的目标字段, jdbc生成键值的getGenereatedKeys方法会用keyProperty的值。

一般来说,都是主键ID自增, insert后会赋值Entity中的id字段。

mapper生成器常命名这种方式的id 为 "insertSelective"

3、自助生成键值之 selectKey

对于不支持自动生成类型的数据库或可能不支持自动生成主键的JDBC,2中的getGenereatedKeys方法肯定不可用,自然 useGeneratedKeys=”true”就不起作用了

\\官网提供的一个说是很傻的生成id的方式

<insert id="insertEntity">

  <selectKey keyProperty="id" resultType="int" order="BEFORE">

    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1

  </selectKey>

  insert into...

</insert>

keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。

order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。

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

4、 不属于mybatis范畴, 全局一致性递增,并获得当前所递增的值

//业务场景, 按访问序号抽奖

4.1 记录插入递增

如果是自增的字段,插入记录后返回的id值就是当前操作的全局id值。 这是借助了数据库的自增,实现全局同步递增。

4.2 单记录,值++ ,值递增

多线程,多点的状况下,递增操作肯定要保证同步的。

简单的业务,不需借助redis,zookeeper等服务实现锁时,就尽量借用DB支持的方式实现同步。

mysql的Innodb是行锁的, 所以update一条记录是同步的。

当update之后,紧接着进行select操作,却不能保证获取到的是刚递增后的值(两条语句不是业务块, 非原子)。有解决办法吗?

4.3 LAST_INSERT_ID()

LAST_INSERT_ID() 能够很好的保留当前操作的现场数据。

LAST_INSERT_ID()是存在于连接对象里的,可以对其进行存取。

update gobal_table set value=LAST_INSERT_ID(value+1) where name='keyName';select LAST_INSERT_ID();

只要保证这两条语句是同一个连接连续执行的即可。使用的连接池是没有问题的。

mybatis里就可以写到mapper文件中的一个<select></select>中

再者,加入初始化的value

insert into global (name, value) values (#{keyName}, LAST_INSERT_ID(1)) ON DUPLICATE KEY UPDATE value=LAST_INSERT_ID(value+1) ; select LAST_INSERT_ID();

虽然两条语句不会保证是原子的,但是select返回的是是前一条插入的value的值,这是由同一个连接保证的,不会被其他线程的其他数据库连接的操作所污染。

验证: 可以借助java.util.concurrent.CountDownLatch 创建几百个线程进行测试。

4.4 mysql 连接会话变量

其实上边的LAST_INSERT_ID(),对应的就是一个连接的变量last_insert_id,可以通过SHOW VARIABLES看到

上边的语句也可以替换成用用户变量定义的形式

insert into global (name, value) values (#{keyName}, (@InsertedId:=1)) ON DUPLICATE KEY UPDATE value=@InsertedId:=value+1 ; select @InsertedId

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容