首页 > 其他分享 >浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)

浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)

时间:2024-07-04 23:56:32浏览次数:18  
标签:insert 浅谈 keyProperty age 主键 插入 selectKey id name

useGeneratedKeys和selectKey的区别

今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有带你不同.

  • useGenerateKeys

其值为truefalse,表明是否将插入生成的主键返回到参数当中.

  1. useGeneratedKey属性会自动根据驱动生成对应SQL语句
  2. useGeneratedKey只支持“自增主键”类型的数据库,比如MySQL , DB2Oracle

xml配置用法(keyProperty表示生成的主键放回到传入参数的成员变量当中).

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.mapper.StudentMapper">
        <insert id="insertStudent" useGeneratedKeys="true" keyProperty="id">
            insert into s_student (name, age, c_id)
            values (#{name}, #{age}, #{cId});
        </insert>
    </mapper>

注解用法(利用@Options注解):

        @Options(useGeneratedKeys = true, keyProperty = "id")
        @Insert("insert into s_student(name,age,c_id) values(#{name},#{age},#{cId})")
        public void insertStudent(Student student);
  • selectKey
  1. selectKey标签需要明确编写获取最新主键的SQL语句
  2. selectKey适用于所有的关系型数据库,如mysqlsqlserver

xml配置用法

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.mapper.StudentMapper">
        <insert id="insertStudent">
            <selectKey  resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
                select last_insert_id()
            </selectKey>
            insert into s_student (name, age, c_id)
            values (#{name}, #{age}, #{cId});
        </insert>
    </mapper>
    

我们来注意几个参数

这里我们需要关注一下order这个属性:

  • BEFORE(一定得是大写): 就是在插入之前查一下最近插入数据的id.这会出现什么问题呢?

就是想象一个业务场景,主表插入一条记录,比如此时返回id = 1.但由于出了异常导致事务回滚.

而第二次再插入,主表又插入了一条记录,此时应该返回id = 2,由于是先查询再插入,之前由于异常,尽管出现了异常但是我们还是执行了insert语句.所以会判断最近插入的一条数据的id是出了异常的那个id,所以就将1返回了.

  • AFTER(一定得是大写): 插入后再查询,这个就是与before相反,我们配置基本都是这个属性.

注解使用(@SelectKey):

    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = true, resultType = Integer.class)
        @Insert("insert into s_student(name,age,c_id) values(#{name},#{age},#{cId})")
        public void insertStudent(Student student);

@SelectKey参数解析

  • keyProperty 表示查询结果赋值给代码中的哪个对象
  • keyColumn 表示将查询结果赋值给数据库表中哪一列
  • resultType 填入 keyProperty 的 Java 类型
  • before 可以设置为 true 或false。要运行的SQL语句。
    • before=true表示插入之前进行查询,可以将查询结果赋给keyPropertykeyColumn,赋给keyColumn相当于更改数据库。对应xml配置order中的BEFORE
    • before=false表示先插入,再查询,这时只能将结果赋给keyProperty。对应xml配置order中的AFTER

注意:使用MySQL的last_insert_id()函数时,before必为false,也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID

  • statementType 要运行的SQL语句,它的返回值通过resultType来指定

标签:insert,浅谈,keyProperty,age,主键,插入,selectKey,id,name
From: https://blog.csdn.net/m0_65013257/article/details/140112532

相关文章

  • 受不了了,浅谈维护括号序列最长全不匹配段的最长长度的两种方法
    首先我们亲爱的zyr同学在2道几乎一样的括号序列题上面用了2种不同的方式来维护pushup,而这和每道题题解的趋势几乎一致。但是我直接交的他的代码。所以写一下zyr队爷的思路。以下直接设(为\(1\),)为\(-1\)。一、结论法答案为右最大前缀和-左最小后缀和。(跨越......
  • 浅谈前置处理器之取样器超时
    浅谈前置处理器之取样器超时取样器取样器超时设置决定了JMeter等待取样器完成并接收响应的最大时间长度。如果在这个时间内未收到响应,取样器将标记该请求为超时错误。参数说明●在取样器超时的配置界面找到“Sampletimeout(inmilliseconds)进行设置。●超时值以毫秒......
  • 主键Id自增,如何获取Id(Dapper)
    这里用的是Dapper,以前用EF的时候好像有用到过db.savechanges().但是项目中没有这个,所以用以下的方法去获取id背景:涉及到多表入库,需要获取主表的Id,所以用到了这个(timeFields 可以忽略)  ///<summary>///单个添加///</summary>///<typ......
  • 浅谈前置处理器之用户参数
    浅谈前置处理器之用户参数“用户参数”前置处理器是一个非常实用的功能,它可以在每个请求执行前动态地为HTTP请求等添加或替换变量值。本文档将详细介绍“用户参数”前置处理器的使用方法、特点以及与用户定义变量的区别。用户参数前置处理器简介用户参数前置处理器允许你......
  • 浅谈逻辑控制器之模块控制器
    浅谈逻辑控制器之模块控制器模块控制器(ModuleController)是一种高级逻辑控制器,它提供了一个强大的机制来复用和组织测试计划中的组件。本文档将深入介绍模块控制器的功能、配置方法及其应用场景。功能概述模块控制器允许用户在测试计划中引用另一个测试片段(通常是一个简......
  • 万字长文浅谈系统稳定性建设
    1.背景京东的期中考试:618即将到来,各个团队都在进行期中考试前的模拟考试:军演压测,故障演练,系统的梳理以检测系统的稳定性以应对高可用,高性能,高并发。我们知道系统的稳定性建设是贯穿整个研发流程:需求阶段,研发阶段,测试阶段,上线阶段,运维阶段;整个流程中的所有参与人员:产品,研发,测试,......
  • 浅谈 K8s Service 网络机制
    浅谈K8sService网络机制云原生运维圈 2024-07-0112:03 上海 1人听过 以下文章来源于腾讯云原生 ,作者王成腾讯云原生.云原生技术交流阵地,汇聚云原生最新技术资讯、文章、活动,以及云原生产品及用户最佳实践内容。王成,腾讯云研发工程师,Kubernetesmember,从......
  • 浅谈 Selenium 控制浏览器操作
    控制浏览器操作:(1)最大化、最小化浏览器:driver.maximize_window()(2)控制、获取浏览器大小:driver.get_window_size()(3)获取当前标签页title、url:print("标签页title:{}".format(driver.title))print("标签页url:{}".format(driver.current_url))(4)前进、后退、刷新:#前进driver......
  • 【杂记-浅谈FTP文件传输协议】
    FTP文件传输协议一、FTP协议概述二、FTP的安全隐患三、FTP服务器配置问题四、FTP的安全加固方法一、FTP协议概述FTP,FileTransferProtocol,即文件传输协议,是一种用于在网络上进行文件传输的标准协议,它允许用户在客户端和服务器之间传输文件,支持上传、下载、删除和重......
  • 【杂记-浅谈OSI参考模型之应用层】
    OSI参考模型之应用层一、应用层概述二、应用层功能三、应用层协议一、应用层概述应用层是计算机网络体系结构中的最高层,它直接为用户和应用程序提供服务。在OSI模型中,应用层对应于第7层,而在TCP/IP模型中,它包括了OSI模型中的第5、6、7层。应用层的作用是在网络中实现......