Java中用Mybatis插入mysql报主键重复的解决方案
作者:泽米
这篇文章主要介绍了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">
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。