使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是“新增“和“修改”方法是对一条数据进行处理的,如果有一万条数据就会和数据库交互一万次所以效率就低。如何提高效率就需要批量操作,如下展示批量插入和批量修改的代码,数据库使用mysql。
1、建表语句
CREATE TABLE yc_test_t ( id int COMMENT '主键ID', name VARCHAR(40) COMMENT '姓名', note VARCHAR(100) COMMENT '备注', PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='测试';
2、实体类
package com.example.demo.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; /** * <p> * 测试表。 * </p> * * @author yc * @since 2024-09-03 */ @TableName(value = "yc_test_t") public class YcTestT { private static final long serialVersionUID = 1L; /** * ID。 */ @TableId private Integer id; /** * 姓名。 */ private String name; /** * 备注。 */ private String note; public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setNote(String note) { this.note = note; } public String getNote() { return note; } }
3、mapper类
package com.example.demo.mapper; import com.example.demo.domain.YcTestT; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 测试表 Mapper 接口。 * </p> * * @author yc * @since 2024-09-03 */ public interface YcTestTMapper extends BaseMapper<YcTestT> { }
4、接口
package com.example.demo.service; import com.example.demo.domain.YcTestT; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Collection; /** * <p> * 测试表 服务类。 * </p> * * @author yc * @since 2024-09-03 */ public interface IYcTestTService extends IService<YcTestT> { //批量插入 boolean saveBatch(Collection<YcTestT> entityList); /** * 批量更新。 * @param oldNote 旧 * @param newNote 新 * @return status */ boolean updateBatch(String oldNote,String newNote); /** * 单记录新增测试表。 * * @param ycTestT 参数说明 * @return status */ int insert(YcTestT ycTestT); }
5、接口实现
package com.example.demo.service.impl; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.example.demo.domain.YcTestT; import com.example.demo.mapper.YcTestTMapper; import com.example.demo.service.IYcTestTService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; /** * <p> * 测试表 服务实现类。 * </p> * * @author yc * @since 2024-09-03 */ @Service public class YcTestTServiceImpl extends ServiceImpl<YcTestTMapper, YcTestT> implements IYcTestTService { @Autowired YcTestTMapper ycTestTMapper; //批量插入 @Override public boolean saveBatch(Collection<YcTestT> entityList) { return super.saveBatch(entityList); } /** * 批量更新。 * @param oldNote 旧 * @param newNote 新 * @return status */ @Override public boolean updateBatch(String oldNote,String newNote) { // 创建 UpdateWrapper 实例 UpdateWrapper<YcTestT> updateWrapper = new UpdateWrapper<>(); // 设置更新条件,例如根据 userId 更新 updateWrapper.lambda().eq(YcTestT::getNote, oldNote); // 设置需要更新的字段值 updateWrapper.set("note",newNote); // 调用 update 方法进行批量更新 return this.update(updateWrapper); } /** * 单记录新增测试表。 * * @param ycTestT 参数说明 * @return status */ @Override public int insert(YcTestT ycTestT) { return ycTestTMapper.insert(ycTestT); } }
6、控制类
package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.service.IYcTestTService; import com.example.demo.domain.YcTestT; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; /** * <p> * 测试表 前端控制器。 * </p> * * @author yc * @since 2024-09-03 */ @RestController @RequestMapping("/test") public class YcTestTController { @Autowired private IYcTestTService ycTestTService; /** * 批量插入。 * * @return AjaxResult */ @PostMapping(value = "/saveBatch") @ResponseBody public String saveBatch() { List<YcTestT> list = new ArrayList<>(); for (int i = 0; i < 5000; i++) { YcTestT ycTestT = new YcTestT(); ycTestT.setId(i); ycTestT.setName("张三" + (i + "")); ycTestT.setNote("旧"); list.add(ycTestT); if ((i + 1) % 3000 == 0) { try { ycTestTService.saveBatch(list); } catch (Exception e) { // 批量插入失败,改为单条插入 for (int j = 0; j < list.size(); j++) { try { YcTestT testT = list.get(j); //单条插入 ycTestTService.insert(testT); } catch (Exception ex) { ex.printStackTrace(); } } } finally { list.clear(); } } } //处理除3000余数的数据 if (list.size() >= 1) { ycTestTService.saveBatch(list); } return "批量插入成功!"; } @PostMapping(value = "/updateBatch") @ResponseBody public String updateBatch() { ycTestTService.updateBatch("旧","新"); return "批量更新成功!"; } }
7、postman接口
批量插入:http://127.0.0.1:8080/test/saveBatch
批量修改:http://127.0.0.1:8080/test/updateBatch
8、效果-后台执行的更新效果是一次批量更新
源码获取方式(免费):
(1)登录-注册:http://resources.kittytiger.cn/
(2)签到获取积分
(3)搜索:mybatis-plus批量增加-修改样例
(4)文件列表
标签:建表,postman,批量,example,return,import,com,public From: https://www.cnblogs.com/yclh/p/18395247