Java中用Mybatis插入mysql报主键重复的解决方案
作者:泽米 发布时间:2024-01-20 01:49:45
标签: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">
来源:https://blog.csdn.net/a6822342/article/details/80245007


猜你喜欢
- sys.path模块搜索路径的字符串列表。由环境变量PYTHONPATH初始化得到。sys.path[0]是调用Python解释器的当前脚本
- 一、设置主窗口# -*- coding: utf-8 -*-import tkinter from tkinter import ttkim
- 游戏开始前的注意事项1:游戏《外星人入侵》将包含很多文件,请在你的D盘中新建一个空文件夹,并将其命名为alien_invasion.请务必将
- 如何将产生的密码记录并发送给用户?这里使用了cdonts邮件组件来发送邮件,前提服务器得支持cdonts组件。好了,看看具体实现方法吧,不是
- 本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 在网上看到一个小需求,需要用正则表达式来处理。原需求如下:找出文本中包含”因为……所以”的句子,并以两个词为中心对齐输出前后3个字,中间全输
- 由于Maui Blazor中界面是由WebView渲染,所以再使用Android的摄像头时无法去获取,因为原生的摄像头需要绑定界面组件所以我
- DQL简介概念:DQL(data query language)数据查询语言 select操作排序规则:- select 表达式1|字段,.
- 本文实例讲述了python中list常用操作。分享给大家供大家参考。具体分析如下:1.定义list>>> li = [&q
- by leecade :我聊下我的想法 从功能上看,能不能把JS分成3层结构1 语法设计,选择器,常用函数2 业务逻辑(比如封装好常用的TA
- 下面先看下python 使用值排序字典的方法In [8]: a={'x':11,'y':22,'c&
- 背景每次加载数据都要重新Load,想通过加入的注解方式开发缓存机制,每次缓存不用写代码了缺点:目前仅支持一个返回值,虽然能弄成字典,但是已经
- 昨天十行代码实现文字识别,感觉怎样,是不是很爽今天咋们继续利用pillow和pytesseract来实现验证码的识别一、环境配置需要 pil
- 每天不同时间段通过微信发消息提醒女友简介有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时
- 本文实例总结了PHP常用字符串操作函数。分享给大家供大家参考,具体如下:/*常用的字符串输出函数** echo() 输出字符串* print
- 在代码首行添加:%matplotlib inline即可。补充知识:jupyter不能显示Matplotlib 动画看莫烦老师的matplo
- 前言上一次简单了解了协程的工作原理 前文链接最后提到了几个使用协程时会遇到的问题,其中一个就是主线程不会等待子线程结束,在这里记录两种比较简
- 写此篇文章,我花10块购买了域名ssw.ski。目的是编写python脚本,通过dnspod api获取个人域名内的dns解析记录,免登录实
- LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要