iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis insert语句返回主键和selectKey标签方式
  • 201
分享到

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

2024-04-02 19:04:59 201人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录insert语句返回主键和selectKey标签1.主键自增的情况2.oracle中用Sequence获取主键mybatis insert语句key的生成和返回1.使用

insert语句返回主键和selectKey标签

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

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

1.主键自增的情况

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


<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标签使用。


<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,主要是执行:


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有代码:


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

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

MyBatis insert语句key的生成和返回

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


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

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

2.使用selectKey


<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="AFTER"  keyProperty="userId">
            SELECT LAST_INSERT_ID()        
        </selectKey>
    </insert>

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


<insert id="insertOne"    >
        insert into user (user_name) values(#{userName})
        <selectKey order="BEFORE"  keyProperty="userId">
            SELECT LAST_INSERT_ID()        
        </selectKey>
    </insert>

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MyBatis insert语句返回主键和selectKey标签方式

本文链接: https://www.lsjlt.com/news/136564.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作