Java中用Mybatis插入mysql报主键重复的解决方案

 更新时间:2023年02月08日 08:54:00   作者:泽米  
这篇文章主要介绍了Java中用Mybatis插入mysql报主键重复的解决方案,具有很好的参考价值,希望对大家有所帮助。

Mybatis插入mysql报主键重复的问题

首先思路是这样的,先去数据表里面去找有没有这个主键的数据(如果有会有返回值,如果没有则返回null),如果有则对该条数据进行更新操作,如果没有,则对数据表进行插入操作。

原来数据表中有这些数据。

数据表对应的bean的结构如下:

public class DataBean {
    String key;
    String value;
 
    public DataBean() {
 
    }
    public DataBean(String key, String value) {
        this.key = key;
        this.value = value;
    }
 
    public String getKey() {
        return key;
    }
 
    public void setKey(String key) {
        this.key = key;
    }
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
 
    @Override
    public String toString() {
        return "DataBean{" +
                "key='" + key + '\'' +
                ", value='" + value + '\'' +
                '}';
    }
}

下面是我Mapper内的内容:

    <insert id="InsertDataToTestTable" parameterType="test.bean.DataBean">
        insert into testtable values(#{key},#{value})
    </insert>
 
    <update id="UpdateDataToTestTable" parameterType="test.bean.DataBean">
        UPDATE testtable SET value=#{value} WHERE `key`=#{key}
    </update>
 
    <select id="SelectDataToTestTable" parameterType="int" resultType="test.bean.DataBean">
        SELECT * from testtable where `key`=#{key}
    </select>

首先通过SqlSession.selectOne去查,看我此次想要插入的bean是否存在于表里面(表的主键为key),如果存在,那么select语句会返回Databean对象,此时就可以去对表中数据进行相应的value更新操作了。

如果不存在的话,那么select语句返回的是null,此时就可以进行相应的插入操作,将数据插入到表中。

下面是测试代码:

    public static void main(String[] args) {
        SqlSession session = SqlSessionFactoryUtil.getSqlSession();
         DataBean dataBean=new DataBean();
         dataBean.setKey("123");
         dataBean.setValue("1111");
 
 
         if(session.selectOne("DataMapper.SelectDataToTestTable",Integer.valueOf(dataBean.getKey()))!=null){
             //查看select语句输出结果
             System.out.println(session.selectOne("DataMapper.SelectDataToTestTable",Integer.valueOf(dataBean.getKey())));
             session.update("DataMapper.UpdateDataToTestTable",dataBean);
         }else {
             session.insert("DataMapper.InsertDataToTestTable", dataBean);
         }
            session.commit();
    }

现在我的表里面是有key=123,value=111的记录,那么我这次执行程序会将其value更新为1111。下面请看输出结果以及表中数据更改。

select操作在查询key为123的时候返回的值。

并且数据库的记录已经做了对应的更改。

下面我进行插入记录key:123333 value:123123,我们知道表中是没有key为123333的记录的,所以select操作会返回null,然后执行insert操作而不是update操作。

    public static void main(String[] args) {
        SqlSession session = SqlSessionFactoryUtil.getSqlSession();
         DataBean dataBean=new DataBean();
         dataBean.setKey("123333");
         dataBean.setValue("123123");
 
 
 
         if(session.selectOne("DataMapper.SelectDataToTestTable",Integer.valueOf(dataBean.getKey()))!=null){
             //查看select语句输出结果
             System.out.println(session.selectOne("DataMapper.SelectDataToTestTable",Integer.valueOf(dataBean.getKey())));
             session.update("DataMapper.UpdateDataToTestTable",dataBean);
         }else {
             session.insert("DataMapper.InsertDataToTestTable", dataBean);
         }
            session.commit();
    }

至此,当数据库插入数据的时候遇到主键重复的错误问题已经解决,我这里只是提供一种思路和一些简单的实现,希望能对你们有帮助~

Mybatis返回插入的主键

<insert id="insertTask" parameterType="Task" useGeneratedKeys="true" keyProperty="id">

总结

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

相关文章

  • Java并发编程之ConcurrentLinkedQueue队列详情

    Java并发编程之ConcurrentLinkedQueue队列详情

    这篇文章主要介绍了Java并发编程之ConcurrentLinkedQueue队列详情,ConcurrentLinkedQueue 内部的队列使用单向链表方式实现,下文更多相关内容叙述需要的小伙伴可以参考一下
    2022-04-04
  • SpringBoot实现异步消息处理的代码示例

    SpringBoot实现异步消息处理的代码示例

    在现代应用程序中,异步消息处理是一项至关重要的任务。它可以提高应用程序的性能、可伸缩性和可靠性,同时也可以提供更好的用户体验,本文将介绍如何使用Spring Boot实现异步消息处理,并提供相应的代码示例
    2023-06-06
  • 实例讲解Java基础之反射

    实例讲解Java基础之反射

    今天小编就为大家分享一篇关于实例讲解Java基础之反射,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java中的SPI机制使用解析

    Java中的SPI机制使用解析

    这篇文章主要介绍了Java中的SPI机制使用解析,SPI意思是"服务提供者的接口",专门提供给服务提供者或者扩展框架功能的开发者去使用的接口,SPI 将服务接口和服务实现分离开来,将服务调用方和服务实现方进行解耦,需要的朋友可以参考下
    2023-10-10
  • java多线程有序读取同一个文件

    java多线程有序读取同一个文件

    这篇文章主要为大家详细介绍了java多线程有序读取同一个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • SpringMvc请求处理参数 和 响应数据处理的示例详解

    SpringMvc请求处理参数 和 响应数据处理的示例详解

    这篇文章主要介绍了SpringMvc请求处理参数和响应数据处理,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 浅谈spring中的default-lazy-init参数和lazy-init

    浅谈spring中的default-lazy-init参数和lazy-init

    下面小编就为大家带来一篇浅谈spring中的default-lazy-init参数和lazy-init。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot使用@Async注解实现异步调用

    SpringBoot使用@Async注解实现异步调用

    这篇文章主要介绍了SpringBoot使用@Async注解实现异步调用,异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待,程序执行完即可执行,可以减少程序执行时间,需要的朋友可以参考下
    2023-10-10
  • SpringBoot利用jpa连接MySQL数据库的方法

    SpringBoot利用jpa连接MySQL数据库的方法

    这篇文章主要介绍了SpringBoot利用jpa连接MySQL数据库的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 浅谈Java StringBuilder为什么线程不安全

    浅谈Java StringBuilder为什么线程不安全

    这篇文章主要介绍了浅谈Java StringBuilder为什么线程不安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论