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中

posted @ 2025-04-27 14:10  huhulahu  阅读(11)  评论(0)    收藏  举报