文章目錄
- 前言
- 一、功能概覽
- 二、類結構說明
- 1.MybatisBatch<?>
- 2.MybatisBatch.Method<?>
- 3. BatchMethod<?>
- 4.使用步驟
- 5.返回值說明
- 三、使用示例
- 1. execute方法
- 2. 示例一:實體類型數據
- 3. 示例二:非實體類型數據
- 4. 示例三:自定義方法插入(無注解)
- 5. 示例四:自定義方法插入(帶注解)
- 四、saveOrUpdate方法
- 1. 跨sqlSession示例
- 2. 共用sqlSession示例
- 五、事務處理示例
- 1. Spring事務處理示例
- 總結
前言
批量操作是一種高效處理大量數據的技術,它允許開發者一次性執行多個數據庫操作,從而減少與數據庫的交互次數,提高數據處理的效率和性能。在MyBatis-Plus中,批量操作主要用于以下幾個方面:
- 數據插入(Insert):批量插入是批量操作中最常見的應用場景之一。通過一次性插入多條記錄,可以顯著減少SQL語句的執行次數,加快數據寫入速度。這在數據遷移、初始化數據等場景中尤為有用。
- 數據更新(Update):批量更新允許同時修改多條記錄的特定字段,適用于需要對大量數據進行統一變更的情況,如批量修改用戶狀態、更新產品價格等。
- 數據刪除(Delete):批量刪除操作可以快速移除數據庫中的多條記錄,常用于數據清理、用戶注銷等場景。
添加鏈接描述
一、功能概覽
- 支持版本:
3.5.4 +
- 事務控制:需手動管理(默認關閉)
- 執行結果:返回批量處理結果,便于業務判斷成功與否
- 數據寫入:取決于代碼是否正確執行到
flushStatements
- 兼容性:支持Spring與非Spring項目
- 異常類型:執行拋出
PersistenceException
- 建議:對于
saveOrUpdate
方法,建議保持簡單的新增或更新操作
二、類結構說明
1.MybatisBatch<?>
- 泛型:實際數據類型
- sqlSessionFactory:可通過容器獲取,非Spring容器下需自行初始化Mybatis并記錄上下文
- dataList:實際批量數據處理列表(不可為空)
2.MybatisBatch.Method<?>
實際為BatchMethod,簡化框架內部操作方法調用。
- 泛型:實際Mapper方法參數類型
- mapperClass:具體的Mapper類
3. BatchMethod<?>
- 泛型:實際Mapper方法參數類型
- statementId:執行的MappedStatement ID
- parameterConvert:參數類型轉換處理器,用于數據類型與Mapper方法參數不一致時的轉換
4.使用步驟
- 創建MybatisBatch實例(綁定數據與sqlSessionFactory)
- 創建MybatisBatch.Method實例(確定執行的Mapper類方法)
- 執行操作(將批量參數轉換為Mapper方法所需參數)
5.返回值說明
返回類型:List
返回內容:每次執行MappedStatement + SQL的操作結果分組。
注意:例如批量根據ID更新,若10條數據中5條更新一個字段,5條更新兩個字段,則返回值為容量為2的List,分別存儲5條記錄的更新情況。
三、使用示例
框架提供MybatisBatchUtils進行靜態方法調用。
1. execute方法
適用于insert, update, delete操作。
2. 示例一:實體類型數據
List<H2User> userList = Arrays.asList(new H2User(2000L, "測試"), new H2User(2001L, "測試"));
MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, userList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert());
3. 示例二:非實體類型數據
List<Long> ids = Arrays.asList(120000L, 120001L);
MybatisBatch<Long> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, ids);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert(id -> {H2User h2User = new H2User();h2User.setTestId(id);return h2User;
}));
4. 示例三:自定義方法插入(無注解)
// mapper方法定義
@Insert("insert into h2user(name,version) values( #{name}, #{version})")
int myInsertWithoutParam(H2User user1);// 準備數據
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithoutParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithoutParam"));
5. 示例四:自定義方法插入(帶注解)
// 帶注解的mapper方法定義
@Insert("insert into h2user(name,version) values( #{user1.name}, #{user1.version})")
int myInsertWithParam(@Param("user1") H2User user1);// 準備數據
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithParam", (user) -> {Map<String, Object> map = new HashMap<>();map.put("user1", user);return map;
}));
四、saveOrUpdate方法
執行保存或更新操作。
注意:跨sqlSession下需注意緩存和數據感知問題。
1. 跨sqlSession示例
@Autowired
private H2UserMapper userMapper;List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(40000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> userMapper.selectById(h2User.getTestId()) == null), // 判斷條件mapperMethod.updateById()); // 指定update方法
2. 共用sqlSession示例
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(50000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> sqlSession.selectList(mapperMethod.get("selectById").getStatementId(), h2User.getTestId()).isEmpty()), // 判斷條件mapperMethod.updateById()); // 指定update方法
五、事務處理示例
1. Spring事務處理示例
@Autowired
private TransactionTemplate transactionTemplate;transactionTemplate.execute((TransactionCallback<List<BatchResult>>) status -> {MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);// 執行批量插入MybatisBatchUtils.execute(sqlSessionFactory, h2UserList, mapperMethod.insert());throw new RuntimeException("出錯了");
});
總結
回到頂部