您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Mybatis 中如何使用 useGeneratedKeys 获取自增主键

时间:2023-01-12 14:55:10  来源:今日头条  作者:java小悠

一、useGeneratedKeys 是什么 ?

关于useGeneratedKeys,官方的说法是,这个参数的作用是:"允许 JDBC 支持自动生成主键,需要驱动兼容",如何理解这句话的含义?

其原意是。对于支持自动生成记录主键的数据库,如 MySQL 和 SQL Server,此时将 useGeneratedKeys 参数的值设置为 true,则进行 INSERT 操作后,数据库自动生成的主键会填充到 JAVA 实体属性中,我们可以从 Java 实体属性中获得数据库自动生成的主键 ID。


二、如何使用?

配置useGeneratedKeys,可以通过以下方式实现:

  • 配置全局配置文件
  • 在 xml 映射器中配置 useGeneratedKeys 参数
  • 在接口映射器中设置 useGeneratedKeys 参数

2.1 在 MyBatis 的全局配置文件中配置

  1. Application.yml 配置文件
  2. 通过 configLocation 指定 mybatis 的配置文件 mybatis-config.xml # MyBatis configuration mybatis: # Search for the specified package alias typeAliasesPackage: com.ruoyi.**.domain # Configure mapper scan to find all mapper.xml mapping files mapperLocations: classpath*:mapper/**/*Mapper.xml # Load the global configuration file configLocation: classpath:mybatis/mybatis-config.xml 复制代码
  3. mybatis-config.xml
  4. 通过<setting name="useGeneratedKeys" value="true" />激活useGeneratedKeys.
  5. <?xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true" /> <!-- global mapper enables caching --> <setting name="useGeneratedKeys" value="true" /> <!-- Allow JDBC to support automatic generation of primary keys --> <setting name="defaultExecutorType" value="REUSE" /> <!-- configure the default executor --> <setting name="logImpl" value="SLF4J" /> <!-- Specify the specific implementation of the log used by MyBatis --> <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> <!– CamelCase naming–>--> </settings> </configuration> 复制代码

注意:在settings元素中设置的全局 useGeneratedKeys 参数对 xml 后缀的 mapper 无效。如果你想在 xml 后缀的 mapper 中添加记录后返回主键 ID,你必须在 xml 后缀的 mapper 中明确设置useGeneratedKeys参数的值为 true。

2.2 在 xml mapper 中配置 useGeneratedKeys 参数。

  1. Mapper.xml
  2. <insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id"> insert into bigdata_group ( group_id, group_name, comment, business_line, create_by, remark, create_time) values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() ); </insert> 复制代码
  • parameterType 传入参数类型
  • keyProperty JAVA 对象中的属性名称
  • keyColumn 数据库字段名称

 

keyProperty与keyColumn的关系图示(来自网络).png

再次说明:在 xml mapper 中配置的 useGeneratedKeys 参数只影响 xml mapper,设置元素中设置的全局 useGeneratedKeys 参数值对 xml mapper 没有影响。

2.3 在 interface mapper 中设置 useGeneratedKeys 参数

设置 useGeneratedKeys 为 true,返回由数据库自动生成的记录主键 id。

@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insert.NETest(Test test);
复制代码

注意:在 interface mapper 中设置的 useGeneratedKeys参数将覆盖 mybatis 配置文件中 setting 元素内所配置的useGeneratedKeys的值。

另外笔者的实践中,keyProperty = "id"并未生效,需要设置为keyProperty = "test.id";即参数的名称 + . + 主键属性名。 读者老师需结合自己的环境试一试。

三、遇到的问题

在配置了获得主键 ID 后,但返回的结果并没有像预期的那样返回新插入数据库行的主键的真实数据。但返回的居然1。

代码示例如下:

  1. Mybatis 侧
import java.util.List;

public interface BigdataMapper {

    List<BigdataGroup> getBigdataGroup();

    int addBigdataGroup(BigdataGroup bigdataGroup);
}
复制代码
  1. service 侧
public int addBigdataGroup(BigdataGroup bigdataGroup) {
    bigdataGroup.setCreateBy(SecurityUtils.getUsername());

    int update = bigdataMapper. addBigdataGroup(bigdataGroup);
    log.info("update: {}", update);
    return update;
}
复制代码
  1. xml file侧
<insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id">
    insert into bigdata_group (
    group_id, group_name, comment, business_line, create_by, remark, create_time)
    values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() );
</insert>
复制代码
  1. 打印结果

按理说,返回的结果应该是插入后主键中的真实数据,但返回结果是1。

注意:真实的 id 已经被注入到参数传递对象的主键的相应属性中,方法的返回值实际表示的是插入的行数,因为插入了 1 条记录,所以返回值是 1;如果要获得新添加数据的自增ID,那么只需要读取对象中对应的自增ID属性的值。

修改获取主键值的方式:

public int addBigdataGroup(BigdataGroup bigdataGroup) {
    bigdataGroup.setCreateBy(SecurityUtils.getUsername());

    int update = bigdataMapper. addBigdataGroup(bigdataGroup);
    log.info("update: {}", update);
    // Add the following code
    int group_id = bigdataGroup. getGroupId();
    log.info("group_id: {}", group_id);
    // stop here
    return update;
}
复制代码


原文链接:
https://juejin.cn/post/7187567574522167355



Tags:Mybatis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、useGeneratedKeys 是什么 ?关于useGeneratedKeys,官方的说法是,这个参数的作用是:"允许 JDBC 支持自动生成主键,需要驱动兼容",如何理解这句话的含义?其原意是。对于支持自动生...【详细内容】
2023-01-12  Tags: Mybatis  点击:(0)  评论:(0)  加入收藏
本篇文章我们首先解析 SqlSessionFactory 的创建过程。1、实例代码在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步。第一步:...【详细内容】
2022-12-26  Tags: Mybatis  点击:(24)  评论:(0)  加入收藏
1.mybatis简介MyBatis是一个ORM工具,封装了JDBC的操作,简化业务编程;Mybatis在web工程中,与Spring集成,提供业务读写数据库的能力。2.使用步骤 1.引入依赖采用Maven包依赖管理,myb...【详细内容】
2022-12-20  Tags: Mybatis  点击:(10)  评论:(0)  加入收藏
前言今天本篇主要介绍一下MyBatis的全局配置文件的使用。configurationmybatis-config.xml文件的头部格式我们就不说了,直接从属性开始介绍,configuration为最顶层节点,其余所...【详细内容】
2022-11-24  Tags: Mybatis  点击:(47)  评论:(0)  加入收藏
最近研究了一下Mybatis,给大家磕叨磕叨,MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码。本文完成的Mybatis功能比...【详细内容】
2022-11-19  Tags: Mybatis  点击:(56)  评论:(0)  加入收藏
表结构和初始数据 新建表结构CREATE TABLE `json_test` ( `id` int NOT NULL AUTO_INCREMENT, `roles` json DEFAULT NULL COMMENT &#39;角色&#39;, `project` json DEFA...【详细内容】
2022-11-18  Tags: Mybatis  点击:(175)  评论:(0)  加入收藏
深度自定义mybatis回顾mybatis的操作的核心步骤 编写核心类SqlSessionFacotryBuild进行解析配置文件 深度分析解析SqlSessionFacotryBuild干的核心工作 编写核心类SqlSessio...【详细内容】
2022-11-13  Tags: Mybatis  点击:(48)  评论:(0)  加入收藏
本文主要讲解如何在Springboot中逐步实现对mybatis的集成应用。1、引入依赖在pom.xml文件中引入mybatis依赖。// pom.xml <dependency> <groupId>org.mybatis.spring.boo...【详细内容】
2022-11-02  Tags: Mybatis  点击:(50)  评论:(0)  加入收藏
最近发现之前使用的MyBatis插件很久都没更新了,就想换个其他插件来用用。偶然发现MyBatis-Plus团队也开发了一款插件MyBatisX,体验了一把确实非常好用,提示很全,而且还能通过GUI...【详细内容】
2022-11-01  Tags: Mybatis  点击:(60)  评论:(0)  加入收藏
收获当遇到项目启动失败,却没有错误日志打印出来的时候,试试在run方法上加个try-catch,即可捕获到异常Mybatis的别名扫描路径不要指定的太宽泛,有可能会出现Bean名冲突,导致初始...【详细内容】
2022-10-30  Tags: Mybatis  点击:(44)  评论:(0)  加入收藏
▌简易百科推荐
一、useGeneratedKeys 是什么 ?关于useGeneratedKeys,官方的说法是,这个参数的作用是:"允许 JDBC 支持自动生成主键,需要驱动兼容",如何理解这句话的含义?其原意是。对于支持自动生...【详细内容】
2023-01-12  java小悠  今日头条  Tags:Mybatis   点击:(0)  评论:(0)  加入收藏
玩过 Dubbo 的小伙伴应该都有听说过一个概念叫做 SOA,每当我们说起微服务的时候,很多人就会去纠结这和 SOA 有啥关系呀?感觉换汤不换药呀。今天松哥来稍微和小伙伴们讨论下这个...【详细内容】
2023-01-10  Java技术栈  今日头条  Tags:微服务   点击:(7)  评论:(0)  加入收藏
更新和更专业的软件框架不断涌现。 虽然开发人员经常难以跟踪这么多不同的选项,但每个选项都针对特定的受众,并且需要非常具体的技能组合。 这就是为什么市场上充斥着如此多...【详细内容】
2023-01-09  启辰8  今日头条  Tags:框架   点击:(8)  评论:(0)  加入收藏
《开源精选》是我们分享Github、gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个入门简单、跨平台、企业级桌面软件开发框架。 ...【详细内容】
2023-01-09  GitHub精选    Tags:框架   点击:(9)  评论:(0)  加入收藏
环境:Springboot2.5.13概述Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步...【详细内容】
2023-01-09  Spring全家桶实战案例    Tags:Springboot   点击:(9)  评论:(0)  加入收藏
大家好,我是不才陈某~最近读者朋友针对Spring Security oauth2.0 想要陈某补充一些知识,如下: 今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?问题描述Spring Se...【详细内容】
2023-01-07  Java架构嘻嘻嘻  今日头条  Tags:Spring   点击:(11)  评论:(0)  加入收藏
在一些场景下,您的kubernetes集群已经搭建完成了,但是还需要修改一些核心组件的参数,如etcd、kube-apiserver、kube-scheduler、kube-controller-manager等。通过kubectl get p...【详细内容】
2023-01-04  shoothzj  今日头条  Tags:kubernetes   点击:(18)  评论:(0)  加入收藏
Pod 资源配置 实际上上面几个步骤就是影响一个 Pod 生命周期的大的部分,但是还有一些细节也会在 Pod 的启动过程进行设置,比如在容器启动之前还会为当前的容器设置分配的 CPU...【详细内容】
2022-12-26  kamactor  今日头条  Tags:K8S   点击:(16)  评论:(0)  加入收藏
本篇文章我们首先解析 SqlSessionFactory 的创建过程。1、实例代码在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步。第一步:...【详细内容】
2022-12-26  二哥学Java  今日头条  Tags:Mybatis   点击:(24)  评论:(0)  加入收藏
大家好,很高兴又见面了,我是"web 前端分享",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!女士们先生们,Qwik 作为新的 JS 框...【详细内容】
2022-12-25  web 前端分享  今日头条  Tags:JS 框架   点击:(47)  评论:(0)  加入收藏
站内最新
站内热门
站内头条