哈喽,大家好,我是木头左!
1. save方法
Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会抛出异常。
int result = sqlSession.insert("userMapper.save", user);
2. saveOrUpdate方法
Mybatis的saveOrUpdate方法用于插入或更新一条记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。
int result = sqlSession.insert("userMapper.saveOrUpdate", user);
3. update方法
Mybatis的update方法用于更新一条记录。当数据库中存在相同的记录时,会执行更新操作;如果不存在相同的记录,则不会执行任何操作。
int result = sqlSession.update("userMapper.update", user);
4. 区别总结
- save方法只适用于插入操作,如果数据库中已经存在相同的记录,会抛出异常。
- saveOrUpdate方法既可以用于插入操作,也可以用于更新操作,当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会执行更新操作。
- update方法只适用于更新操作,如果数据库中不存在相同的记录,则不会执行任何操作。
通过以上介绍,可以看到save、saveOrUpdate和update方法在Mybatis中的不同作用。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作。同时,也可以通过设置主键策略来避免重复数据的问题,从而更好地使用Mybatis的这些方法。
5. 主键策略设置
5.1 自增主键
当使用自增主键时,可以保证每条记录的主键都是唯一的,因此可以直接使用save或saveOrUpdate方法进行插入或更新操作。例如:
<insert id="insertUser" parameterType="com.example.User">
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
5.2 非自增主键
当使用非自增主键时,需要确保数据库中没有重复的主键值,否则会抛出异常。此时,可以使用以下两种方法来处理:
- 先查询再判断:在执行插入或更新操作之前,先查询数据库中是否存在相同的主键值。如果存在,则不执行操作;如果不存在,则执行插入或更新操作。这种方法的缺点是可能会影响性能,因为需要多次查询数据库。例如:
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”,这样当数据库中不存在相同的主键值时,会自动生成一个新的主键值并执行插入或更新操作;如果已经存在相同的主键值,则会抛出异常。这种方法的优点是简单方便,但缺点是无法自定义主键生成逻辑。例如:
<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方法在不同主键策略下的使用方法。在实际开发中,需要根据业务需求选择合适的方法来执行相应的操作,并根据主键策略来避免重复数据的问题。同时,也可以通过设置事务管理来确保数据的一致性和完整性,从而提高系统的可靠性和稳定性。
我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!