mybatisplus的插入更新
时间: 2025-03-31 20:15:18 浏览: 43
<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", "[email protected]");
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);
}
```
阅读全文
相关推荐
















