<mapper namespace="com.example.YourMapper"> <insert id="batchInsertOrUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> <if test="item.id != null"> <!-- 判断ID是否存在 --> SELECT COUNT(*) FROM your_table WHERE id = #{item.id} </if> <choose> <when test="_parameter[0] > 0"> <!-- 更新操作 --> UPDATE your_table SET column1 = #{item.column1}, column2 = #{item.column2} WHERE id = #{item.id} </when> <otherwise> <!-- 插入操作 --> INSERT INTO your_table (id, column1, column2) VALUES (#{item.id}, #{item.column1}, #{item.column2}) </otherwise> </choose> </foreach> </insert> </mapper>和mybatis-plus的saveOrUpdateBatch性能比较及如何选用
时间: 2024-04-16 08:26:04 浏览: 11
`<insert>`标签和`saveOrUpdateBatch`是两种不同的方式来实现大批量数据操作。下面是它们的性能比较和如何选择的建议:
1. `<insert>`标签方式:
- 性能比较:使用`<insert>`标签进行大批量数据操作时,会根据每个数据的ID是否存在执行对应的更新或插入操作。这种方式对于数据量较小的情况下性能较好,因为它会逐条执行SQL语句。但是对于大批量数据操作来说,可能会有较多的数据库交互,性能可能较低。
- 选择建议:如果您的数据量不是特别大,并且对性能要求不高,可以考虑使用`<insert>`标签方式。
2. `saveOrUpdateBatch`方法:
- 性能比较:`saveOrUpdateBatch`是MyBatis-Plus提供的方法,它能够根据实体对象的ID自动判断执行插入或更新操作。这种方式可以减少数据库交互次数,提高性能,尤其在处理大批量数据时效果更好。
- 选择建议:如果您的数据量较大,并且对性能要求较高,推荐使用`saveOrUpdateBatch`方法。
综上所述,如果您的数据量较小且对性能要求不高,可以选择使用`<insert>`标签方式。如果您的数据量较大且对性能有较高的要求,可以考虑使用`saveOrUpdateBatch`方法。根据具体情况选择适合您的方式。
相关问题
<mapper namespace="com.example.YourMapper"> <insert id="batchInsertOrUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> <if test="item.id != null"> <!-- 判断ID是否存在 --> SELECT COUNT(*) FROM your_table WHERE id = #{item.id} </if> <choose> <when test="_parameter[0] > 0"> <!-- 更新操作 --> UPDATE your_table SET column1 = #{item.column1}, column2 = #{item.column2} WHERE id = #{item.id} </when> <otherwise> <!-- 插入操作 --> INSERT INTO your_table (id, column1, column2) VALUES (#{item.id}, #{item.column1}, #{item.column2}) </otherwise> </choose> </foreach> </insert> </mapper>和mybatis-plus的saveOrUpdateBatch性能比较及如何选用,注:实体对象ID属于type = IdType.INPUT非自增
`<insert>`标签方式和MyBatis-Plus的`saveOrUpdateBatch`方法是两种不同的方式来实现大批量数据操作。下面是它们的性能比较和如何选择的建议:
1. `<insert>`标签方式:
- 性能比较:使用`<insert>`标签进行大批量数据操作时,会根据每个数据的ID是否存在执行对应的更新或插入操作。这种方式对于数据量较小的情况下性能较好,因为它会逐条执行SQL语句。但是对于大批量数据操作来说,可能会有较多的数据库交互,性能可能较低。
- 选择建议:如果您的数据量不是特别大,并且对性能要求不高,可以考虑使用`<insert>`标签方式。
2. `saveOrUpdateBatch`方法:
- 性能比较:`saveOrUpdateBatch`是MyBatis-Plus提供的方法,它能够根据实体对象的ID自动判断执行插入或更新操作。这种方式可以减少数据库交互次数,提高性能,尤其在处理大批量数据时效果更好。
- 选择建议:如果您的数据量较大,并且对性能要求较高,推荐使用`saveOrUpdateBatch`方法。
根据您提供的注释信息,实体对象ID属于`IdType.INPUT`非自增类型。在这种情况下,使用`<insert>`标签方式可能更适合,因为您需要在插入操作中显式指定ID的值。
综上所述,如果您的数据量较小且对性能要求不高,可以选择使用`<insert>`标签方式。如果您的数据量较大且对性能有较高的要求,并且实体对象ID属于`IdType.INPUT`非自增类型,可以考虑使用MyBatis-Plus的`saveOrUpdateBatch`方法。根据具体情况选择适合您的方式。
<update id="batchUpdate" parameterType="java.util.List"> update vis_model_device_plan_osbl <set> <trim prefix="osbl_value = case" suffix="end,"> <foreach collection="list" item="item"> when osbl_id=#{item.osblId} then #{item.osblValue} </foreach> </trim> <trim prefix="osbl_type = case" suffix="end,"> <foreach collection="list" item="item"> when osbl_id=#{item.osblId} then #{item.osblType} </foreach> </trim> </set> <where> osbl_id in <foreach collection="list" separator="," item="item" open="(" close=")"> #{item.osblId} </foreach> </where> </update>
这段代码是一个 MyBatis 的 Mapper XML 文件中的一个 `update` 标签,用于批量更新 `vis_model_device_plan_osbl` 表中的记录。其中,`id` 属性为 `batchUpdate`,表示该更新语句的唯一标识符,`parameterType` 属性为 `java.util.List`,表示传入的参数类型为 List。具体来说,这个 List 包含了一些 `osblId`、`osblValue` 和 `osblType` 字段的值,用于更新表中对应的记录。
在 `set` 标签中,通过两个 `trim` 标签对 `osbl_value` 和 `osbl_type` 字段进行赋值。其中,`prefix` 属性为 `osbl_value = case`,表示对 `osbl_value` 字段进行 case when 的判断;`suffix` 属性为 `end,`,表示 case when 的结束符为 end,并在最后加上一个逗号。在 `trim` 标签内部,通过 `foreach` 标签遍历 List 中的每个元素,将 `osbl_id` 字段与对应的 `osbl_value` 或 `osbl_type` 字段进行匹配,从而确定更新的值。在 `where` 标签中,则是通过 `osbl_id` 字段来确定需要更新的记录。
总的来说,这段代码是使用 MyBatis 提供的动态 SQL 语句,通过传入一个 List 来批量更新表中的记录。