模板网站 seo,免费网站的app,关键词诊断优化全部关键词,辽宁省建设机械协会官方网站一、条件构造器
1.为什么要学#xff1f;
用于方便地构建SQL查询条件 2.如何使用#xff1f; 3.实战案例
例#xff1a;查询出名字中带o的#xff0c;存款大于等于1000元的人的id,username,info,balance字段
数据库如图#xff1a; 示例#xff1a;
Test
void testL…一、条件构造器
1.为什么要学
用于方便地构建SQL查询条件 2.如何使用 3.实战案例
例查询出名字中带o的存款大于等于1000元的人的id,username,info,balance字段
数据库如图 示例
Test
void testLambdaQueryWrapper() {//1.构建查询条件
LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser().select(User::getId,User::getUsername,User::getInfo,User::getBalance)
.like(User::getUsername,o)
.ge(User::getBalance, 1000);//2.查询
ListUser users userMapper.selectList(wrapper);
users.forEach(System.out::println);}
二、自定义SQL
1.为什么要学
当SQL语句中where条件之外的部分无法使用MP方便地实现只能手动进行拼接但违背了开发规范因此可以使用自定义SQL解决。
2.如何使用
先在业务层利用wrapper创建条件之后在自定义mapper方法中传入wrapper需要使用注解Param(ew)然后在自定义SQL中拼接前半部分 三、IService接口 1.如何使用 2.实战案例 编号 接口 请求方式 请求路径 请求参数 返回值 1 新增用户 POST /users 用户表单实体 无 2 删除用户 DELETE /users/{id} 用户id 无 3 根据id查询用户 GET /users/{id} 用户id 用户VO 4 根据id批量查询 GET /users 用户id集合 用户VO集合
package com.itheima.mp.controller;import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;import java.util.List;Api(tags 用户管理接口)
RequiredArgsConstructor
RestController
RequestMapping(users)
public class UserController {private final IUserService userService;PostMappingApiOperation(新增用户)public void saveUser(RequestBody UserFormDTO userFormDTO){// 1.转换DTO为POUser user BeanUtil.copyProperties(userFormDTO, User.class);// 2.新增userService.save(user);}DeleteMapping(/{id})ApiOperation(删除用户)public void removeUserById(PathVariable(id) Long userId){userService.removeById(userId);}GetMapping(/{id})ApiOperation(根据id查询用户)public UserVO queryUserById(PathVariable(id) Long userId){// 1.查询用户User user userService.getById(userId);// 2.处理voreturn BeanUtil.copyProperties(user, UserVO.class);}GetMappingApiOperation(根据id集合查询用户)public ListUserVO queryUserByIds(RequestParam(ids) ListLong ids){// 1.查询用户ListUser users userService.listByIds(ids);// 2.处理voreturn BeanUtil.copyToList(users, UserVO.class);}
} 上述接口都直接在controller即可实现无需编写任何service代码 3.实战案例高级
当需要处理解决复杂业务时不得不自定义service方法来编辑业务逻辑
例 Controller层
PutMapping({id}/deduction/{money})
ApiOperation(扣减用户余额)
public void deductBalance(PathVariable(id) Long id, PathVariable(money)Integer money){userService.deductBalance(id, money);
}
Service层
package com.itheima.mp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;public interface IUserService extends IServiceUser {void deductBalance(Long id, Integer money);
}
Serviceimpl层
package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;Service
public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {Overridepublic void deductBalance(Long id, Integer money) {// 1.查询用户User user getById(id);// 2.判断用户状态if (user null || user.getStatus() 2) {throw new RuntimeException(用户状态异常);}// 3.判断用户余额if (user.getBalance() money) {throw new RuntimeException(用户余额不足);}// 4.扣减余额baseMapper.deductMoneyById(id, money);}
}
mapper层
Update(UPDATE user SET balance balance - #{money} WHERE id #{id})
void deductMoneyById(Param(id) Long id, Param(money) Integer money);
四、IService的Lambda方法
IService中还提供了Lambda功能来简化我们的复杂查询及更新功能
1.实战案例一
例实现一个根据复杂条件查询用户的接口查询条件如下 name用户名关键字可以为空 status用户状态可以为空 minBalance最小余额可以为空 maxBalance最大余额可以为空
可以理解成一个用户的后台管理界面管理员可以自己选择条件来筛选用户因此上述条件不一定存在需要做判断。 Service中对LambdaQueryWrapper和LambdaUpdateWrapper的用法进一步做了简化。我们无需自己通过new的方式来创建Wrapper而是直接调用lambdaQuery和lambdaUpdate方法 GetMapping(/list)
ApiOperation(根据id集合查询用户)
public ListUserVO queryUsers(UserQuery query){// 1.组织条件String username query.getName();Integer status query.getStatus();Integer minBalance query.getMinBalance();Integer maxBalance query.getMaxBalance();// 2.查询用户ListUser users userService.lambdaQuery().like(username ! null, User::getUsername, username).eq(status ! null, User::getStatus, status).ge(minBalance ! null, User::getBalance, minBalance).le(maxBalance ! null, User::getBalance, maxBalance).list();// 3.处理voreturn BeanUtil.copyToList(users, UserVO.class);
}
可以发现lambdaQuery方法中除了可以构建条件还需要在链式编程的最后添加一个list()这是在告诉MP我们的调用结果需要是一个list集合。这里不仅可以用list()可选的方法有 .one()最多1个结果 .list()返回集合结果 .count()返回计数结果 MybatisPlus会根据链式编程的最后一个方法来判断最终的返回结果。
2.实战案例二
例改造根据id修改用户余额的接口要求如下 如果扣减后余额为0则将用户status修改为冻结状态
Override
Transactional
public void deductBalance(Long id, Integer money) {// 1.查询用户User user getById(id);// 2.校验用户状态if (user null || user.getStatus() 2) {throw new RuntimeException(用户状态异常);}// 3.校验余额是否充足if (user.getBalance() money) {throw new RuntimeException(用户余额不足);}// 4.扣减余额 update tb_user set balance balance - ?int remainBalance user.getBalance() - money;lambdaUpdate().set(User::getBalance, remainBalance) // 更新余额.set(remainBalance 0, User::getStatus, 2) // 动态判断是否更新status.eq(User::getId, id).eq(User::getBalance, user.getBalance()) // 乐观锁.update();
}
五、IService的批量新增 Test
void testSaveBatch() {// 准备10万条数据ListUser list new ArrayList(1000);long b System.currentTimeMillis();for (int i 1; i 100000; i) {list.add(buildUser(i));// 每1000条批量插入一次if (i % 1000 0) {userService.saveBatch(list);list.clear();}}long e System.currentTimeMillis();System.out.println(耗时 (e - b));
}