Mybatis批量插入或更新(根据指定字段更新)

本文详细解析了MyBatis如何利用ON DUPLICATE KEY UPDATE特性实现批量更新,当记录存在时更新,不存在时插入。通过具体实例说明了唯一索引在这一过程中的作用,并介绍了DAO层XML配置中foreach元素的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Mybatis批量更新运用ON DUPLICATE KEY UPDATE ,如果记录不存在则插入,存在则更新。那么这个记录是否存在根据什么判断?规则如下:

      如果你插入的记录导致UNIQUE索引重复,则认为这条记录存在。比如我创建表的时候设置的唯一索引为字段email,那么如果email重复时则执行更新,否则插入。当如果唯一索引为多个字段时如name,tchCode,那么当name,tchCode两个字段完全重复时候,此时就要执行更新语句。当然满足一部分唯一索引是不会触发更新操作的,此时会执行插入操作。

        接下来dao层:

        xml中的代码为:

update的字段名都是表中的字段名,包括values()中的

foreach元素的属性主要有 item,index,open,close ,separator,collection。

  1. item表示集合中每一个元素进行迭代时的别名
  2. index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置
  3. open表示该语句以什么开始
  4. close表示以什么结束
  5. separator表示在每次进行迭代之间以什么符号作为分隔符
  6. collection传入的是参数,可以是list,array.传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

 

 

<think>嗯,用户想了解MyBatisPlus中插入更新操作的用法。首先,我需要回忆一下MyBatisPlus的相关知识。插入的话,我记得有save和saveBatch方法,对吧?save用于单条插入,saveBatch用于批量插入。不过用户提到的参考里提到saveBatch速度慢的问题,可能需要注意优化方法,比如调整批次大小者使用自定义SQL。 然后是更新操作,常用的应该是updateById,根据主键更新。还有update方法,可以通过条件构造器来指定更新条件。这里可能需要提到UpdateWrapper的使用,以及如何设置更新字段。 接下来,用户提供的引用内容里有一些优化方法,比如InsertBatchSomeColumn方法,这个可能是MyBatisPlus的扩展,需要确认是否在官方文档中有提到。另外,自动填充字段的部分,比如@TableField(fill = FieldFill.INSERT)这样的注解,可以在插入时自动填充创建时间,更新时填充更新时间,者处理创建人和更新字段。 还有用户提到的数据库层面设置默认值,比如create_time和update_time使用DEFAULT CURRENT_TIMESTAMP,这可能和MyBatisPlus的自动填充配合使用。需要解释两种方式的不同,以及如何结合使用。 另外,用户参考里提到性能问题,比如saveBatch慢,解决方案可能包括分批次处理、使用自定义插入方法,者调整ExecutorType。这些都需要在回答中给出具体的代码示例者配置方法。 可能还需要提到公共字段的自动填充,比如使用元对象处理器实现MetaObjectHandler接口,重写insertFill和updateFill方法。这部分在引用3和4里都有涉及,需要详细说明如何配置注解和处理器。 用户的问题可能还涉及到插入更新时的默认值设置,比如通过@TableField的fill属性和数据库的默认值,这两者的区别和适用场景。 最后,生成相关问题时要考虑用户可能进一步想知道优化策略、自动填充的实现,者常见问题处理,比如如何获取插入后的主键ID。</think># MyBatisPlus插入更新操作详解 ## 一、基础插入操作 ### 1. 单条插入 使用`save()`方法实现单条数据插入: ```java User user = new User(); user.setName("张三"); user.setAge(25); userService.save(user); ``` ### 2. 批量插入 通过`saveBatch()`实现批量插入,默认每次提交1000条数据: ```java List<User> userList = new ArrayList<>(); // 填充数据... userService.saveBatch(userList); ``` *优化建议*:可通过`saveBatch(集合, 批次大小)`调整批处理量,如`saveBatch(list, 2000)`[^2] ## 二、高效插入方案 针对大数据量场景,推荐使用`InsertBatchSomeColumn`扩展方法: ```java int batchResult = userMapper.insertBatchSomeColumn(userList); ``` 此方式插入1万条数据耗时约690ms ## 三、更新操作 ### 1. 根据ID更新 ```java User user = new User(); user.setId(1L); user.setName("李四"); userService.updateById(user); ``` ### 2. 条件更新 ```java UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("status", 1) .set("email", "update@example.com"); userService.update(wrapper); ``` ## 四、自动字段填充 ### 1. 数据库层自动填充 ```sql CREATE TABLE user ( create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP ) ``` ### 2. MyBatisPlus自动填充 (1)字段注解配置: ```java @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; ``` (2)实现元对象处理器: ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createBy", String.class, "admin"); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateBy", String.class, "admin"); } } ``` ## 五、性能优化建议 1. 批量操作时调整`batchSize`参数 2. 使用`BATCH`执行器模式: ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper batchMapper = sqlSession.getMapper(UserMapper.class); ``` 3. 禁用实体类验证: ```java @Bean public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() { return plusProperties -> plusProperties.getGlobalConfig().setBanner(false); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值