mybatisplus
@param这个注解是为SQL语句中参数赋值而服务的
通过@RequestBody注解将json格式的请求数据封装到一个实体对象中
swagger补充知识
几种注入方式的区别
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的形参中
@GetMapping,查询条件是通过 URL 查询参数传过来的,所以不需要 @RequestBody √
这个字节码是什么,什么时候传递字节码不太清楚
重温下配置类与@bean注解
users.forEach(System.out::println);什么高级写法
糊涂包喵喵喵?
最后一个视频迷迷糊糊,听完泛型再来

快速入门
配置依赖项--定义mapper接口,继承接口basemapper(需要指定泛型)--在实体类上添加注解声明表信息--在application.yaml中根据需要添加配置
不写sql语句了,怎么对应到sql中的表与字段名:基于反射获取实体类信息作为数据库表信息

几个常用的注解,用在实体类上
@TableName
@TableId 设置增长类型,默认为雪花算法
@TableField 几种使用场景
理解:通过类对应到数据库表中,实现不写sql代码的目的
前面都示范了简单的基于主键的增删改查,后续展示如何构造复杂的where条件实现增删改查abstractwrapper

abstractwrapper的两个子类,往往选择用querywrapper来构造复杂的where条件;UpdateWrapper用的比较少,当涉及到特殊set语句时候使用
lambdawrapper,不硬编码字段名,而是传对应的get函数,利用反射机制
iservice实现了可以直接通过userService实现增删改查,对于一些简单的增删改查可以直接在controller里调用mp提供的service方法,无需写自定义的service和mapper,
核心功能
条件构造器
QueryWrapper:用于构建查询条件。
UpdateWrapper:用于构建更新条件。
@Test
void testUpdateWrapper(){
List<Long> ids = List.of(1L,2L,3L);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>()
.setSql("balance = balance - 100")
.in("id", ids);
userMapper.update(null, updateWrapper);
}
@Test
void testUpdatebyQueryWrapper(){
User user = new User();
user.setBalance(2000);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().eq("username","jack");
userMapper.update(user, updateWrapper);
}
lambda表达式
User::getId 是一种方法引用,意思是:引用 User 类里的 getId() 方法。
自定义sql
条件构造器应用的场景有限 where条件以外的没法用mp实现,只能拼接,违背了巴拉巴拉原则:在业务层编写了sql语句
因此选择用wrapper构建复杂的where条件,自己定义sql语句剩下的部分
根据主键操作就直接用默认提供的函数,如果又复杂条件的话就用wrapper
service接口
现在转到service层
MP中service接口的基本用法

注意要传递两个泛型
VO--DTO--PO
mp里的方法没有业务逻辑,设计到业务逻辑的还是需要service层
写if校验时尽量别写成嵌套的,写成并列的if更加优雅
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Override
public void deductMoneyById(Long id, Long money) {
//查询用户
User user = getById(id);//IService中的方法
//校验状态
if(user==null || user.getStatus()==2){
throw new RuntimeException("用户状态异常!");
}
//校验余额是否充足
if(user.getBalance()-money<0){
throw new RuntimeException("用户余额不足!");
}
//扣减余额
baseMapper.deductBalance(id,money);//这个为什么不是usermapper,就算是basemapper为什么不需要注入
}
}
在你的 UserServiceImpl 中,M被指定为 UserMapper,所以这里的 baseMapper 就是一个 UserMapper 对象。Spring Boot + MyBatis-Plus 启动时,框架自动帮你完成了注入。
IService的lambda方法
lambdaUpdate与lambdaQuery
@Override
@Transactional
public void deductMoneyById(Long id, Long money) {
//查询用户
User user = getById(id);//IService中的方法
//校验状态
if(user==null || user.getStatus()==2){
throw new RuntimeException("用户状态异常!");
}
//校验余额是否充足
if(user.getBalance()-money<0){
throw new RuntimeException("用户余额不足!");
}
//扣减余额
//baseMapper.deductBalance(id,money);//这个为什么不是usermapper,就算是basemapper为什么不需要注入
//扣除余额plus版,如果扣除后的金额为0的 话就冻结账号
Long remain = user.getBalance() - money;
lambdaUpdate()
.set(User::getBalance,remain)
.set(remain==0,User::getStatus,2)
.eq(User::getId,id)
.eq(User::getStatus,user.getStatus())
.update();
}
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
return lambdaQuery()
.like(name!=null,User::getUsername,name)
.eq(status!=null,User::getStatus,status)
.ge(minBalance!=null,User::getBalance,minBalance)
.le(maxBalance!=null,User::getBalance,maxBalance)
.list();
}
简单操作直接用iservice提供的基础方法,复杂查询更新lambda
扩展功能
代码生成器
表那边右键
DB静态工具
多个service相互调用,相互注入会出现循环依赖,因此一旦出现相互调用的情况,可以使用静态工具db,但是要传参字节码
方法与iservice类似
PO(Persistent Object),即持久对象,是与数据库表结构一一对应的对象,主要用于在DAO层(数据访问层)传输数据源对象。PO仅用来展现数据,通常包含属性和get/set方法,但不包含业务逻辑。
DTO(Data Transfer Object),即数据传输对象,service与controller之间。DTO主要用于网络传输,封装了需要传输的数据,可以减少网络调用次数,提高性能。
VO(View Object),即视图对象,用于展示层对象,通常是Web向模板渲染引擎层传输的对象。VO用于保存一个界面对应的数据,以便显示
分页插件
mp分页插件取代pagehelper(简单重温了web课程中分页查询的实现,定义了一个pagebean类,来返回查询到的总记录数和用户列表,两条sqly=语句分别查询记录数与用户列表)
定义配置类,配置插件--准备分页条件--分页查询并解析
一个分页通用实体示例
封装统一的查询条件(PageQuery)和统一的返回值(PageDTO)
为了方便,封装了两部分代码到PageQuery和PageDTO中

浙公网安备 33010602011771号