服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - MyBatis insert语句返回主键和selectKey标签方式

MyBatis insert语句返回主键和selectKey标签方式

2022-01-17 11:26liaosilzu2007 Java教程

这篇文章主要介绍了MyBatis insert语句返回主键和selectKey标签方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

insert语句返回主键和selectKey标签

往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作。

如果在插入后再去查一次数据库,显然不够优雅和效率,MyBatis中已经有了insert后返回主键的功能,下面就主要讲几种不同情况的具体做法。

1.主键自增的情况

对于MySQL和Sql Server这种支持主键自增的数据库,可以设置useGeneratedKeys="true"和keyProperty。例如现在有一个表 tbl_employee,表有id,name,age,create_time四个字段,MyBatis映射文件中可以写成如下:

?
1
2
3
4
5
<insert id="insertRecord" parameterType="com.lzumetal.mybatis.entity.Employee"
    useGeneratedKeys="true"  keyProperty="id">
        INSERT INTO tbl_employee(name, age, create_time)
        VALUES(#{name}, #{age}, #{createTime})
</insert>
  • useGeneratedKeys="true":使用自动生成的主键
  • keyProperty:指定主键是(javaBean的)哪个属性。

useGeneratedKeys:
(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false

keyProperty:
(insert and update only) Identifies a property into which MyBatis will set the key value returned by getGeneratedKeys , or by a selectKey child element of the insert statement. Default: unset .
Can be a comma separated list of property names if multiple generated columns are expected.

2.Oracle中用Sequence获取主键

对于Oracle数据库,当要用到自增字段时,需要用到Sequence,假设我们现在已经创建了一个名字为SEQ_ADMIN的 Sequence,在MyBatis中的映射文件中可以结合selectKey标签使用。

?
1
2
3
4
5
6
7
<insert id="insert"  parameterType="com.lzumetal.mybatis.entity.Employee">
    <selectKey keyProperty="id" resultType="long" order="BEFORE">
    SELECT SEQ_ADMIN.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO tbl_employee(id, name, age, create_time)
    VALUES(#{id}, #{name}, #{age}, #{createTime})
</insert>

order="BEFORE"表示SELECT SEQ_ADMIN.NEXTVAL FROM DUAL在 INSERT 语句执行之前先对id进行赋值。相反的,order还可以设置成AFTER,表示在INSERT语句执行完后,再查询一次slectKey标签中的语句,并赋值到Javabean的keyProperty的那个属性上。

源码分析

从源码上来分析,在BaseStatementHandler里面有生成generateKeys,主要是执行:

?
1
2
3
4
5
6
protected void generateKeys(Object parameter) { 
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); 
    ErrorContext.instance().store(); 
    keyGenerator.processBefore(executor, mappedStatement, null, parameter); 
    ErrorContext.instance().recall(); 
}

processBefore,表示执行前处理,对应mapper里面的selectKey中的order="BEFORE"属性,先执行查询key,并设置到参数对象中。

在各个声明处理器中,update有代码:

?
1
2
KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); 
keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);

processAfter,表示执行后处理,对应mapper里面的selectKey中的order="AFTER"属性,表示执行后,再查一遍key,设置到参数对象中。

MyBatis insert语句key的生成和返回

1.使用数据库自带的生成器

?
1
2
3
<insert id="insertOne" keyProperty="userId"  useGeneratedKeys="true" >
        insert into user (user_name) values(#{userName})       
    </insert>

mybatis会获取数据库自动生成的列,并把值赋值给传入参数的userId属性。

2.使用selectKey

?
1
2
3
4
5
6
<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="AFTER"  keyProperty="userId">
            SELECT LAST_INSERT_ID()       
        </selectKey>
    </insert>

插入语句执行后selectKey语句,并把返回值塞进传入参数的userId属性。

?
1
2
3
4
5
6
<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="BEFORE"  keyProperty="userId">
            SELECT LAST_INSERT_ID()       
        </selectKey>
    </insert>

先执行selectKey,并把返回值赋值给传入参数的userId属性,然后执行insert语句。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000014699207

延伸 · 阅读

精彩推荐
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30