• Mybatis save、saveOrUpdate、update的区别


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

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

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

  • 相关阅读:
    uva1344
    Spring学习笔记 - 第一章 - IoC(控制反转)、IoC容器、Bean的实例化与生命周期、DI(依赖注入)
    低代码引擎 TinyEngine 正式发布!!!
    Verilog中什么是断言?
    降低模拟量信号干扰的10个有效方法
    Android系统Android.bp文件详解
    Mac 卸载 PyCharm 方法
    html页面动态加载css,可以根据系统参数配置
    Golang for 循环中的隐式内存别名问题
    嵌入式Linux_驱动开发:offset宏和container_of宏
  • 原文地址:https://blog.csdn.net/luansj/article/details/139656911