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

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

相关推荐
骄马之死5 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
郑洁文7 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
qfljg7 小时前
oracle 迁移到postgres
数据库·oracle
六月雨滴7 小时前
Oracle SGA 优化
oracle·dba
螺丝钉code7 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
Maynor9968 小时前
Codex API 网关迁移与流量优化实战
数据库·oracle
南极企鹅8 小时前
MySQL的两大支柱:undo Log&redo log
数据库·mysql·oracle
摇滚侠9 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown9 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
折哥的程序人生 · 物流技术专研9 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则