SpringBoot - MyBatis-Plus使用详解11(Service的CRUD接口3:增删改操作)
十一、Service 的 CRUD 接口3:增删修操作
1,新增数据
(1)save 方法可以将一个实体对象插入到对应的数据表中:
注意:插入成功后,当前插入对象在数据库中的 id 会写回到该实体中。
@RestController public class HelloController { @Autowired UserInfoService userInfoService; @RequestMapping("/test") public UserInfo test(){ UserInfo user = new UserInfo(); user.setUserName("hangge"); user.setPassWord("12345678"); user.setAge(100); userInfoService.save(user); return user; } }
(2)saveBatch 方法可以批量插入数据:
UserInfo user1 = new UserInfo(); user1.setUserName("hangge"); user1.setPassWord("12345678"); user1.setAge(100); UserInfo user2 = new UserInfo(); user2.setUserName("航歌"); user2.setPassWord("111111"); user2.setAge(10); UserInfo user3 = new UserInfo(); user3.setUserName("大力"); user3.setPassWord("0000"); user3.setAge(999); //批量插入数据 userInfoService.saveBatch(Arrays.asList(user1, user2, user3));
- saveBatch 方法还可以设置每个批次的插入数量:
UserInfo user1 = new UserInfo(); user1.setUserName("hangge"); user1.setPassWord("12345678"); user1.setAge(100); UserInfo user2 = new UserInfo(); user2.setUserName("航歌"); user2.setPassWord("111111"); user2.setAge(10); UserInfo user3 = new UserInfo(); user3.setUserName("大力"); user3.setPassWord("0000"); user3.setAge(999); //批量插入数据(每批2条数据) userInfoService.saveBatch(Arrays.asList(user1, user2, user3), 2);
2,修改数据
(1)updateById 方法根据实体对象中的 ID 进行修改:
注意:如果实体对象中某个属性为 null,不会更新该属性(即不会把对应的数据库字段值设置为 null)
UserInfo userInfo = new UserInfo(); userInfo.setId(3); userInfo.setUserName("hangge"); userInfo.setPassWord("123"); // 开始修改,返回执行结果 Boolean success = userInfoService.updateById(userInfo);
(2)updateBatchById 方法根据实体对象中的 ID 进行批量修改:
UserInfo user1 = new UserInfo(); user1.setId(1); user1.setUserName("hangge"); user1.setAge(100); UserInfo user2 = new UserInfo(); user2.setId(2); user2.setUserName("航歌"); user2.setAge(10); //批量修改数据 Boolean success = userInfoService.updateBatchById(Arrays.asList(user1, user2));
- updateBatchById 方法还可以设置每个批次的修改的数量:
UserInfo user1 = new UserInfo(); user1.setId(1); user1.setUserName("hangge"); user1.setAge(100); UserInfo user2 = new UserInfo(); user2.setId(2); user2.setUserName("航歌"); user2.setAge(10); //批量修改数据(每批2条数据) Boolean success = userInfoService.updateBatchById(Arrays.asList(user1, user2), 2);
(3)update 方法可以使用实体对象封装操作类进行更新操作:
(1)数据更新相关的构造器(UpdateWrapper、LambdaUpdateWrapper、LambdaUpdateChainWrapper)使用方法类似于查询构造器(QueryWrapper、LambdaQueryWrapper、LambdaQueryChainWrapper),不同的是它增加了如下两个方法:
- set:设置数据库字段值
- setSql:设置 set 部分的 sql
// 查询条件:名字中包含'ha'并且年龄小于40 LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40); // 将满足条件的记录密码都设置为8888 UserInfo userInfo = new UserInfo(); userInfo.setPassWord("8888"); // 开始修改,返回执行结果 Boolean success = userInfoService.update(userInfo, updateWrapper);
- 我们也可以通过 updateWrapper 的 set 方法直接设置字段值,比如下面除了将密码设置为 8888 外,还将年龄设置为 null:
// 查询条件:名字中包含'ha'并且年龄小于40 LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40) .set(UserInfo::getPassWord, "8888") .set(UserInfo::getAge, null); // 开始修改 Boolean success = userInfoService.update(updateWrapper); /*********** 二者可以结合使用的,下面效果等效于上面的 ****************/ // 查询条件:名字中包含'ha'并且年龄小于40 LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40) .set(UserInfo::getAge, null); // 将满足条件的记录密码都设置为8888 UserInfo userInfo = new UserInfo(); userInfo.setPassWord("8888"); // 开始修改 Boolean success = userInfoService.update(userInfo, updateWrapper);
- 而也通过 updateWrapper 的 setSql 方法可以直接设置 set 部分的 sql,下面的效果同上面是一样的:
// 查询条件:名字中包含'ha'并且年龄小于40 LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40) .setSql("pass_word = '8888'") .setSql("age = null"); // 开始修改 Boolean success = userInfoService.update( updateWrapper); /*********** 二者可以结合使用的,下面效果等效于上面的 ****************/ // 查询条件:名字中包含'ha'并且年龄小于40 LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40) .setSql("age = null"); // 将满足条件的记录密码都设置为8888 UserInfo userInfo = new UserInfo(); userInfo.setPassWord("8888"); // 开始修改 Boolean success = userInfoService.update(userInfo, updateWrapper);
3,新增或修改数据
(1)saveOrUpdate 会先判断实体类是否包含主键 ID,如果有的话则执行更新操作,没有的话则执行新增操作:UserInfo user1 = new UserInfo(); user1.setId(1); user1.setUserName("hangge"); user1.setAge(100); // 由于user1设置了主键id,则执行更新操作 userInfoService.saveOrUpdate(user1); UserInfo user2 = new UserInfo(); user2.setUserName("hangge"); user2.setAge(100); // 由于user2没有设置主键id,则执行新增操作 userInfoService.saveOrUpdate(user1);
(2)saveOrUpdateBatch 方法可以执行批量的新增或修改操作:
// 由于user1设置了主键id,则执行更新操作 UserInfo user1 = new UserInfo(); user1.setId(1); user1.setUserName("hangge"); user1.setAge(100); // 由于user2没有设置主键id,则执行新增操作 UserInfo user2 = new UserInfo(); user2.setUserName("hangge"); user2.setAge(100); // 开始执行批量新增或修改操作 userInfoService.saveOrUpdateBatch(Arrays.asList(user1, user2));
- saveOrUpdateBatch 方法还可以设置每个批次的新增修改的数量:
// 由于user1设置了主键id,则执行更新操作 UserInfo user1 = new UserInfo(); user1.setId(1); user1.setUserName("hangge"); user1.setAge(100); // 由于user2没有设置主键id,则执行新增操作 UserInfo user2 = new UserInfo(); user2.setUserName("hangge"); user2.setAge(100); // 开始执行批量新增或修改操作(每批2条数据) userInfoService.saveOrUpdateBatch(Arrays.asList(user1, user2), 2);
4,删除数据
(1)removeById 方法可以根据 id 删除一条记录:
// 返回删除结果 Boolean success = userInfoService.removeById(4);
(2)removeByIds 方法根据 id 批量删除:
// 返回删除结果 Boolean success = userInfoService.removeByIds(Arrays.asList(4,5,6));
(3)removeByMap 方法通过 Map 封装的条件删除记录:
注意:map 写的是数据表中的列名,而非实体类的属性名。比如属性名为 userName,数据表中字段为 user_name,这里应该写的是 user_name。
Map<String,Object> columnMap = new HashMap<>(); columnMap.put("user_name", "hangge"); columnMap.put("age", 22); // 返回删除结果 Boolean success = userInfoService.removeByMap(columnMap);
(4)remove 方法使用查询构造器,删除记录:
关于查询条件构造器(QueryWrapper、LambdaQueryWrapper)的详细用法可以参考我之前写的文章:
// 查询条件:名字中包含'ha'并且年龄小于40 LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40); // 返回删除结果 Boolean success = userInfoService.remove(queryWrapper);