IT自学第三十八天

张开发
2026/4/10 5:54:45 15 分钟阅读

分享文章

IT自学第三十八天
多线程1、MybatisPlus简介MybatisPlusMyBatisPlus简称MP是一个MyBatis的增强工具在MyBatis的基础上只做增强不做改变为简化开发、提高效率而生。2、入门案例环境准备入门案例需求基于资料中提供的mp-demo项目改造为使用MP实现下列功能导入需要的项目导入需要的数据库表修改yaml文件的数据库连接信息。3、快速入门MyBatisPlus官方提供了starter其中继承了Mybatis和MybatisPlus的所有功能并且实现了自动装配效果。代码演示dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.4.3/version /dependency自定义的Mapper继承MybatisPlus提供的BaseMapper接口代码演示public interface UserMapper extends BaseMapperUser { }代码演示SpringBootTest class UserMapperTest { Autowired private UserMapper userMapper; Test void testInsert() { User user new User(); user.setId(5L); user.setUsername(Lucy); user.setPassword(123); user.setPhone(18688990011); user.setBalance(200); user.setInfo({\age\: 24, \intro\: \英文老师\, \gender\: \female\}); user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(LocalDateTime.now()); userMapper.insert(user); } Test void testSelectById() { User user userMapper.selectById(5L); System.out.println(user user); } Test void testQueryByIds() { ListUser users userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L)); users.forEach(System.out::println); } Test void testUpdateById() { User user new User(); user.setId(5L); user.setBalance(20000); userMapper.updateById(user); } Test void testDeleteUser() { userMapper.deleteById(5L); } }对于多表查询与复杂查询利用手动写SQL执行。4、常见注解常见注解MyBatisPlus通过扫描实体类并基于反射获取实体类信息作为数据库表信息。类名驼峰转下划线作为表名名为id的字段作为主键变量名驼峰转下划线作为表的字段名。MybatisPlus中比较常见的几个注解如下5、常见配置常见配置MyBatisPlus的配置继承了MyBatis原生配置和一些自己特有的配置。例如6、条件构造器-QueryWrapper条件构造器MyBatisPlus支持各种复杂的where条件可以满足日常开发的所有需求。SELECT * FROM products; UPDATE products SET price99.9 WHERE id 3 INSERT INTO products VALUES(3,12,1.2); DELETE FROM name where ID 4;代码演示//查询user表的idusernameinfobalance信息且username带有obalance 1000的信息 Test public void testQueryWrapper1(){ //创建条件构造器 QueryWrapperUser queryWrapper new QueryWrapper(); //查询的列 queryWrapper.select(id,username,info,balance); //查询条件名字带“o”的 queryWrapper.like(username,o); //查询条件balance 1000 queryWrapper.ge(balance,1000); //查询 ListUser userList userMapper.selectList(queryWrapper); //输出 for (User user : userList) { System.out.println(user); } } //更新用户名为jack的用户的余额为2000 Test public void testQueryWrapperUpdate(){ User user new User(); user.setBalance(2000); QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.eq(username,jack); userMapper.update(user,queryWrapper); }7、条件构造器-UpdateWrapperLambdaQueryWrapper基于UpdateWrapper的更新需求更新id为124的用户的余额扣200.代码演示// 需求更新id为124的用户的余额扣200. Test public void testUpdateWrapper(){ UpdateWrapperUser updateWrapper new UpdateWrapper(); //自定义更新的语句设置的是set updateWrapper.setSql(balance balance - 200); //id为124的用户 updateWrapper.in(id,1,2,4); userMapper.update(null,updateWrapper); }代码演示Test public void testLambdaQueryWrapper1(){ //创建条件构造器 LambdaQueryWrapperUser lambdaQueryWrapper new LambdaQueryWrapper(); //查询的列 lambdaQueryWrapper.select(User::getId,User::getUsername,User::getInfo,User::getBalance); //查询条件名字带“o”的 lambdaQueryWrapper.like(User::getUsername,o); //查询条件balance 1000 lambdaQueryWrapper.ge(User::getBalance,1000); //查询 ListUser userList userMapper.selectList(lambdaQueryWrapper); //输出 for (User user : userList) { System.out.println(user); } }8、自定义Sql自定义SQL我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件然后自己定义SQL语句中剩下的部分。需求将id在指定范围的用户例如1、2、4的余额扣减指定值代码演示//自定义拼接SQL Test public void testCustomSqlSeqment(){ LambdaQueryWrapperUser lambdaQueryWrapper new LambdaQueryWrapper(); lambdaQueryWrapper.in(User::getId,1L,2L,4L); userMapper.updateBalanceByWrapper(200,lambdaQueryWrapper); }public interface UserMapper extends BaseMapperUser { Update(update user set balance balance - ${amount} ${ew.customSqlSegment}) void updateBalanceByWrapper(Param(amount) int amount, Param(ew) LambdaQueryWrapperUser queryWrapper); }9、Service接口-接口与类编写Service接口10、Service接口-案例基础案例 基于Restful风格实现下列接口需求基于Restful风格实现下面的接口步骤引入起步依赖定义UserController新增业务方法特殊的业务方法mybatisPlus中没有提供的则可以自定义编写。代码演示Api(用户接口管理) RestController RequestMapping(/users) RequiredArgsConstructor //添加注释不用添加Autowired public class UserController { private final IUserService userService; ApiOperation(新增用户) PutMapping public void saveUser(RequestBody UserFormDTO userFormDto){ //将userFormDto转换为User User user BeanUtil.copyProperties(userFormDto, User.class); userService.save(user); } ApiOperation(删除用户) DeleteMapping(/{id}) public void deleteUser(PathVariable(id) Long id){ userService.removeById(id); } }11、Service接口-扣减余额代码演示/** * 根据id扣减余额 * param id 用户id * param amount 扣减的金额多少 */ ApiOperation(根据id扣减余额) PutMapping(/{id}/deduction/{amount}) public void updateBalanceById(PathVariable Long id, PathVariable Integer amount){ userService.deductBalanceById(id,amount); } private final UserMapper userMapper; Override public void deductBalanceById(Long id, Integer amount) { //1、判断用户是否存在 User user this.getById(id); if(user null || user.getStatus() 2){ throw new RuntimeException(用户有问题); } //2、判断余额是否充足 当前用户的余额是否大于等于要扣除的金额 if(user.getBalance() amount){ throw new RuntimeException(余额不足); } //3、扣减金额 //update user set balance balance - #{amount} where id #{id} userMapper.deduceBalanceById(amount,id); } Update(update user set balance balance - #{amount} where id #{id}) void deduceBalanceById(Integer amount, Long id);12、IService的LambdaQuery方法应用需求代码演示ApiOperation(根据条件查询用户列表) PostMapping(/list) public ListUserVO queryList(RequestBody UserQuery userQuery){ String username userQuery.getName(); Integer status userQuery.getStatus(); Integer maxBalance userQuery.getMaxBalance(); Integer minBalance userQuery.getMinBalance(); ListUser userList userService.lambdaQuery() .like(StrUtil.isNotBlank(username), User::getUsername, username) .eq(status ! null, User::getStatus, status) .ge(minBalance ! null, User::getBalance, minBalance) .le(maxBalance ! null, User::getBalance, maxBalance) .list(); //最终进行查询 return BeanUtil.copyToList(userList, UserVO.class); }13、IService的LambdaUpdate方法应用案例IService的Lambda更新代码演示//3、扣减金额 //update user set balance balance - #{amount} [,status 2] where id #{id} int remainBalance user.getBalance() - amount; this.lambdaUpdate() .set(User::getBalance, remainBalance) .set(remainBalance 0, User::getStatus, 2) .eq(User::getId, id) .update();14、批量插入数据的优化案例IService批量新增代码演示//批量新增十万条数据 Test public void testBatch(){ //记录开始时间与结束时间 long start System.currentTimeMillis(); ListUser list new ArrayList(1000); for(int i 1; i 100000; i) { list.add(buildUser(i)); if(i % 1000 0){ userService.saveBatch(list); list.clear(); } } //记录技术时间 long end System.currentTimeMillis(); System.out.println(end - start); }

更多文章