MyBatis之insert主键自增和自定义主键详解

 更新时间:2024年12月25日 15:12:15   作者:千叶重楼  
本文介绍了如何使用MyBatis解决插入数据时因主键唯一性约束导致的错误问题,以及如何自定义主键生成规则,文中详细解释了如何在MyBatis中配置自增主键,并提供了测试示例

一、实现描述

我们在写程序时,时常会遇到这样的问题:

插入一条数据,但因有主键的存在,而有时候会报“违反唯一性约束”的错误,

下面呢,我们就来利用MyBatis来解决这个问题。

二、此文使用的数据库为MySQL

如需要使用其他数据库,请做适当更改即可。

三、根据主键的自增

在MyBatis中进行配置实现,实现如下:

<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
   insert into t_role(role_name,note) values (#{roleName},#{note})
</insert>

解析:

1、我们使用keyProperty属性指定id为主键字段,同时使用useGeneratedKeys属性告诉MyBatis这个主键是否使用数据库的内置规则生成。

2、其中,在数据库中设置id的自增规则,如下所示:

mysql>alter table t_role change id id int primary key auto_increment;

3、在上面配置中,我们指定了id列为自增字段,因此我们建立POJO,这样的话,使用MyBatis的主键回填功能,实现正确的插入操作(无需设置id的值,MyBatis会用数据库的设置进行处理)。

4、测试:

sqlSession = SqlSessionFactoryUtil.openSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();
role.setRoleName("test4");
role.setNote("test4Note");
roleMapper.insertRole(role);
System.err.println(role.getId());

四、自定义主键生成规则实现

实例如下:

<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
    <selectKey keyProperty="id" resultTyle="int" order="BEFORE">
             select if(max(id) is null, 1, max(id) + 2) as newId from t_role
     </selectKey>
     insert into t_role(id,role_name,note) values(#{id},#{roleName},#{note});
</insert>

解析:

上面显示的为MyBatis定义自增规则的配置,其实上面的selectKey配置类似于数据库中的触发器,order=“BEFORE”规定了在执行语句之前执行newId的查找,然后在执行插入语句。

这样我们就利用自定义的主键规则实现了数据的新增。

总结

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

相关文章

  • Spring Boot使用模板freemarker的示例代码

    Spring Boot使用模板freemarker的示例代码

    本篇文章主要介绍了Spring Boot使用模板freemarker的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java实现屏幕截图工具的代码分享

    Java实现屏幕截图工具的代码分享

    这篇文章主要为大家介绍了如何利用Java语言编写一个电脑屏幕截图工具,文中的示例代码讲解详细,对我们学习有一定的帮助,需要的可以参考一下
    2022-05-05
  • Java中的SimpleDateFormat的线程安全问题详解

    Java中的SimpleDateFormat的线程安全问题详解

    这篇文章主要介绍了Java中的SimpleDateFormat的线程安全问题详解,sonar 是一个代码质量管理工具,SonarQube是一个用于代码质量管理的开放平台,为项目提供可视化报告, 连续追踪项目质量演化过程,需要的朋友可以参考下
    2024-01-01
  • Java拼接字符串时如何去掉最后一个多余的逗号

    Java拼接字符串时如何去掉最后一个多余的逗号

    当我们遍历拼接字符串的时候,最后会多出一个我们添加的字符(比如逗号),下面通过实例代码给大家介绍Java拼接字符串时去掉最后一个多余的逗号,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 详解Java利用ExecutorService实现同步执行大量线程

    详解Java利用ExecutorService实现同步执行大量线程

    这篇文章主要介绍了Java利用ExecutorService实现同步执行大量线程,ExecutorService可以维护我们的大量线程在操作临界资源时的稳定性。
    2017-03-03
  • 被遗忘的Java关键字transient的使用详解

    被遗忘的Java关键字transient的使用详解

    在 Java 中,transient 是一个关键字,用于指定一个类的字段(成员变量)在序列化时应该被忽略。本文将通过示例为大家简单讲讲transient的使用,需要的可以参考一下
    2023-04-04
  • Java字符串原理分析之String是否可变

    Java字符串原理分析之String是否可变

    当我们在求职时,面试官很喜欢问我们关于String的一些原理性知识,比如String的不可变性、字符串的内存分配等,为了让大家更好地应对面试,并理解String的底层设计,接下来会给大家聊聊String的一些原理,比如String为什么具有不可变性,需要的朋友可以参考下
    2023-05-05
  • Java执行JavaScript代码

    Java执行JavaScript代码

    这篇文章主要为大家详细介绍了Java执行JavaScript代码的具体操作方法,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Spring Data Redis对象缓存序列化问题解决

    Spring Data Redis对象缓存序列化问题解决

    相信在项目中,你一定是经常使用Redis,在使用时,有没有遇到同我一样,对象缓存序列化问题的呢,本文主要介绍了Spring Data Redis对象缓存序列化问题解决,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot在项目中访问静态资源步骤分析

    SpringBoot在项目中访问静态资源步骤分析

    今天在玩SpringBoot的demo的时候,放了张图片在resources目录下,启动区访问的时候,突然好奇是识别哪些文件夹来展示静态资源的, 为什么有时候放的文件夹不能显示,有的却可以
    2023-01-01

最新评论