Mybatis-plus的使用(四)——CRUD与条件构造器

原文链接:橙子&栗子&世界——Mybatis-plus的使用(四)——CRUD与条件构造器

CRUD

CRUD指增加(Create)、读取(Read)、更新(Update)和删除(Delete),mybatis-plus提供了两种CRUD的接口,一种是Mapper的,一种是Service的(当然Service的CRUD实际上也是继承Mapper的),先来看看几个不用条件构造器的简单CRUD:
新增

    @Test
    public void fndUserSaveTest() {
        FndUser fndUser = new FndUser();
        fndUser.setJobNumber("123456789");
        fndUser.setUserPhone("1888888888");
        fndUser.setUserName("橙子");
        fndUser.setLoginName("chenkang");
        iFndUserService.save(fndUser);
    }

使用mybatis-plus的id生成策略,在保存的时候自动set值

根据id更新

    @Test
    public void fndUserUpdateTest() {
        FndUser fndUser = new FndUser();
        fndUser.setJobNumber("1234567891");
        fndUser.setUserName("栗子");
        fndUser.setId("1154034819131699202");
        fndUser.setLoginName("lizi");
        iFndUserService.updateById(fndUser);
    }

查询全部

    @Test
    public void fndUserListTest() {
        List<FndUser> fndUserList = iFndUserService.list();
    }

根据id删除

    @Test
    public void fndUserDeleteTest() {
        iFndUserService.removeById("1154034819131699202");
    }

这些最简单的增删改查,但实际情况下,我们需要更为灵活的运用这些接口,所以mybatis-plus也给我们提供了更灵活的条件构造器。

条件构造器

先上一个条件构造关系图:
[外链图片转存失败(img-VRnoMAI8-1567238834096)(https://www.lmorange.com/oss-image/lmsystem/8dfb0d7dcc6948798f844fc78a2ec2181567077314021.png)]

  • 上图绿色框为抽象类abstract
  • 蓝色框为正常class类,可new对象
  • 黄色箭头指向为父子类关系,箭头指向为父类

对于wrapper的介绍:

  1. Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
  2. AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
  3. AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
  4. LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
  5. LambdaUpdateWrapper : Lambda 更新封装Wrapper
  6. QueryWrapper : Entity 对象封装操作类,不是用lambda语法
  7. UpdateWrapper : Update 条件封装,用于Entity对象更新操作

QueryWrapper是非常常用的条件构造器:

    public List<FndUser> simpleQuery(FndUser fndUser) {
        QueryWrapper<FndUser> fndUserQueryWrapper = new QueryWrapper<>();
        // 等于= 例: eq("name", "老王")--->name = '老王'
        fndUserQueryWrapper.eq("job_number", fndUser.getJobNumber());
        // 大于等于 >= 例: ge("age", 18)--->age >= 18
        fndUserQueryWrapper.ge("age", fndUser.getAge());
        // LIKE '%值%' 例: like("name", "王")--->name like '%王%'
        fndUserQueryWrapper.like("login_name", fndUser.getLoginName());
        // 排序:ORDER BY 字段, ... DESC 例: orderByDesc("id", "name")--->order by id DESC,name DESC
        fndUserQueryWrapper.orderByDesc("s_ct","job_number");
        // Mapper的查询接口(当然对应的删除、更新、插入接口都是有的)
        return baseMapper.selectList(fndUserQueryWrapper);
    }

以上代码类似于sql

select * from fnd_user 
where job_number = '123456789' and age > 18 
and login_name like '%wang%' 
order by s_ct,job_number desc

可以看出,使用条件构造器我们可以拼构出我们想要的的sql

注意:我经常为了确保单条查询不出错,经常在构造器中加上limit 1,例如:fndUserQueryWrapper.last(“limit 1”),这样是可以限制只查询一条;但是如果使用使用fndUserQueryWrapper.lambda().last(“limit 1”)的话最后拼接出的sql中不会带出limit 1,说明唯一的限制没有了,可能会报错;

对于LambdaQueryWrapper,我们可以这样写:

    public List<FndUser> lambdaSimpleQuery(FndUser fndUser) {
        LambdaQueryWrapper<FndUser> fndUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
        fndUserLambdaQueryWrapper
                // 等于= 例: eq("name", "老王")--->name = '老王'
                .eq(FndUser::getJobNumber, fndUser.getJobNumber())
                // 大于等于 >= 例: ge("age", 18)--->age >= 18
                .ge(FndUser::getAge, fndUser.getAge())
                // LIKE '%值%' 例: like("name", "王")--->name like '%王%'
                .like(FndUser::getLoginName, fndUser.getLoginName())
                // 排序:ORDER BY 字段, ... DESC 例: orderByDesc("id", "name")--->order by id DESC,name DESC
                .orderByDesc(FndUser::getSCt, FndUser::getJobNumber);
        // Service的查询接口(和Mapper的selectList接口是差不多的意思,)
        return super.list(fndUserLambdaQueryWrapper);
    }

其实就是换了种写法,意思还是一样的,就看你习惯那种写法;
还有一种常用的UpdateWrapper

    public void simpleUpdate(FndUser fndUser) {
        UpdateWrapper<FndUser> fndUserUpdateWrapper = new UpdateWrapper<>();
        // .lambda()这种形式和LambdaUpdateWrapper是一个意思
        fndUserUpdateWrapper.lambda().set(FndUser::getJobNumber, fndUser.getJobNumber())
                .set(FndUser::getLoginName, fndUser.getLoginName());
        super.update(fndUserUpdateWrapper);
    }

可用来更新实体类,当然QueryWrapper也是可以用来更新,只不过时Service(或者Mapper)调用的接口方法不同而已,比如也可以这样:

    public void simpleQueryWrapperUpdate(FndUser fndUser) {
        QueryWrapper<FndUser> fndUserQueryWrapper = new QueryWrapper<>();
        fndUserQueryWrapper.eq("job_number", fndUser.getJobNumber());
        super.update(fndUser, fndUserQueryWrapper);
    }

这段代码的意思其实就是根据fndUserQueryWrapper来作为更新的限制条件,而更新内容则是实体类fndUser
不同warpper的方法可能存在差异,但是常用的方法就那么一些,下面列出一些常用的:
[外链图片转存失败(img-3C3ys9CO-1567238834098)(https://www.lmorange.com/oss-image/lmsystem/285e94c3a3a449fc822d54d5e13723ba1567128835639.png)]
以上内容来源于

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值