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初始化源码代码浅析

    spring初始化源码代码浅析

    Spring框架被广泛应用于我们的日常工作中,但是很长时间以来我们都是只会使用,不懂它的作用原理,下面这篇文章主要给大家介绍了关于spring初始化源码的相关资料,需要的朋友可以参考下
    2023-04-04
  • java实现俄罗斯方块游戏

    java实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了java实现俄罗斯方块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Spring Cloud Gateway使用Token验证详解

    Spring Cloud Gateway使用Token验证详解

    这篇文章主要介绍了Spring Cloud Gateway使用Token验证详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 基于Mock测试Spring MVC接口过程解析

    基于Mock测试Spring MVC接口过程解析

    这篇文章主要介绍了基于Mock测试Spring MVC接口过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot+微信小程序实现文件上传与下载功能详解

    SpringBoot+微信小程序实现文件上传与下载功能详解

    这篇文章主要为大家介绍了SpringBoot整合微信小程序实现文件上传与下载功能,文中的实现步骤讲解详细,快跟随小编一起学习一下吧
    2022-03-03
  • mybatis-plus 如何配置逻辑删除

    mybatis-plus 如何配置逻辑删除

    这篇文章主要介绍了mybatis-plus 如何配置逻辑删除,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Spring MVC中自定义拦截器的实例讲解

    Spring MVC中自定义拦截器的实例讲解

    下面小编就为大家带来一篇Spring MVC中自定义拦截器的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 通过System.getProperty配置JVM系统属性

    通过System.getProperty配置JVM系统属性

    这篇文章主要介绍了通过System.getProperty配置JVM系统属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot错误提示400状态问题

    SpringBoot错误提示400状态问题

    这篇文章主要介绍了SpringBoot错误提示400状态问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java代码简化工具Lombok的使用详解

    Java代码简化工具Lombok的使用详解

    这篇文章主要介绍了Java代码简化工具Lombok的使用,Lombok是一个Java库,它通过注解的方式自动插入编辑器和构建工具中,从而简化Java代码的编写,需要的朋友可以参考下
    2025-05-05

最新评论