Mybatis save、saveOrUpdate、update的区别

哈喽,大家好,我是木头左!

1. save方法

Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会抛出异常。

java 复制代码
int result = sqlSession.insert("userMapper.save", user);

2. saveOrUpdate方法

Mybatis的saveOrUpdate方法用于插入或更新一条记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。

java 复制代码
int result = sqlSession.insert("userMapper.saveOrUpdate", user);

3. update方法

Mybatis的update方法用于更新一条记录。当数据库中存在相同的记录时,会执行更新操作;如果不存在相同的记录,则不会执行任何操作。

java 复制代码
int result = sqlSession.update("userMapper.update", user);

4. 区别总结

  • save方法只适用于插入操作,如果数据库中已经存在相同的记录,会抛出异常。
  • saveOrUpdate方法既可以用于插入操作,也可以用于更新操作,当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。
  • update方法只适用于更新操作,如果数据库中不存在相同的记录,则不会执行任何操作。

通过以上介绍,可以看到save、saveOrUpdate和update方法在Mybatis中的不同作用。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作。同时,也可以通过设置主键策略来避免重复数据的问题,从而更好地使用Mybatis的这些方法。

5. 主键策略设置

5.1 自增主键

当使用自增主键时,可以保证每条记录的主键都是唯一的,因此可以直接使用save或saveOrUpdate方法进行插入或更新操作。例如:

xml 复制代码
<insert id="insertUser" parameterType="com.example.User">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

5.2 非自增主键

当使用非自增主键时,需要确保数据库中没有重复的主键值,否则会抛出异常。此时,可以使用以下两种方法来处理:

  • 先查询再判断:在执行插入或更新操作之前,先查询数据库中是否存在相同的主键值。如果存在,则不执行操作;如果不存在,则执行插入或更新操作。这种方法的缺点是可能会影响性能,因为需要多次查询数据库。例如:
java 复制代码
User user = getUserById(id);
if (user == null) {
    user = new User();
    user.setId(id);
    user.setName(name);
    user.setAge(age);
    sqlSession.insert("userMapper.insert", user);
} else {
    sqlSession.update("userMapper.update", user);
}
  • 使用主键策略:在Mybatis的配置文件中设置主键策略为"NOT_NULL",这样当数据库中不存在相同的主键值时,会自动生成一个新的主键值并执行插入或更新操作;如果已经存在相同的主键值,则会抛出异常。这种方法的优点是简单方便,但缺点是无法自定义主键生成逻辑。例如:
xml 复制代码
<insert id="insertUser" parameterType="com.example.User">
    INSERT INTO user (id, name, age) VALUES (#{id,jdbcType=INTEGER}, #{name}, #{age}) ON CONFLICT DO NOTHING;
</insert>

通过以上介绍,可以看到Mybatis save、saveOrUpdate和update方法在不同主键策略下的使用方法。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作,并根据主键策略来避免重复数据的问题。同时,也可以通过设置事务管理来确保数据的一致性和完整性,从而提高系统的可靠性和稳定性。

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

相关推荐
Han.miracle12 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu13 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白14 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
无妄无望15 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科15 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君201615 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋16 小时前
【word多文档docx合并】
java·word
@yanyu66617 小时前
idea中配置tomcat
java·mysql·tomcat
2501_9167665417 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard17 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿