SpringBoot+MyBatis-Plus使用教程(二)

条件构造器

MyBatis-Plus提供了多种条件构造器,用来应对复杂的业务功能逻辑,条件构造器使用了设计模式中的适配器模式,提供了多个类来分别支持不同的条件,比如有专门查询用的QueryWrapper,更新用的UpdateWrapper等,中心思想还是尽量通过类操作来完成对数据库表的操作。

  1. 使用QueryWrapper查询数据
        @RequestMapping(value = "/testQuery", method = RequestMethod.GET)
        public String testQuery() {
            //条件构造器,username包含zhang的模糊查询,id大于等于1小于等于4
            QueryWrapper<User> query = new QueryWrapper<User>().select("id", "username").like("username", "zhang").ge("id", 1).le("id", 4);
            //查询结果里的user只有id和username有数据
            List<User> users = userMapper.selectList(query);
            return JSON.toJSONString(users);
        }

  2. 使用LambdaQueryWrapper查询数据
        @RequestMapping(value = "/testLambdaQuery", method = RequestMethod.GET)
        public String testLambdaQuery() {
            //lambda条件构造器,可以彻底用类来代替列名
            LambdaQueryWrapper<User> query = new LambdaQueryWrapper<User>().select(User::getId, User::getUsername).like(User::getUsername, "zhang").ge(User::getId, 1).le(User::getId, 4);
            //查询结果里的user只有id和username有数据
            List<User> users = userMapper.selectList(query);
            return JSON.toJSONString(users);
        }

    Lambda的好处是不用再去写表中的列名,只要我们写好po,LambdaQueryWrapper会通过反射的方式去解析po类中的写好的注解,比如@TableField("username"),这样它就自动获取到列名,如果有一天列名改了,那么只要操作po类即可,这也是解耦合的设计。MyBatis-Plus推荐使用LambdaQueryWrapper。

  3. 使用QueryWrapper更新数据
        @RequestMapping(value = "/updateWithQueryWrapper", method = RequestMethod.GET)
        public String updateWithQueryWrapper() {
            //条件构造器,id为6的user更新username为lisi
            User user = new User();
            user.setUsername("lisi");
            QueryWrapper<User> query = new QueryWrapper<User>().eq("id", 6);
            //返回值为更新行数
            int updateNum = userMapper.update(user, query);
            return String.valueOf(updateNum);
        }

    通过QueryWrapper同样可以实现update操作,可以看出这是适配器设计模式的好处,即使传入的参数不是那么合适,由于对象提供的参数是有效的,照样可以完成update功能。这些Wrapper类应该有着同一个interface或者父class。

  4. 使用UpdateWrapper更新数据
        @RequestMapping(value = "/updateWithUpdateWrapper", method = RequestMethod.GET)
        public String updateWithUpdateWrapper() {
            //条件构造器,id为7和8的username=username+id
            ArrayList<Integer> ids = new ArrayList<>();
            ids.add(7);
            ids.add(8);
            UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("username = concat( username , id )").in("id", ids);
            //返回值为更新行数
            int updateNum = userMapper.update(null, wrapper);
            return String.valueOf(updateNum);
        }

    setSql这个方法很有意思,你可以按照纯粹的sql语句去填充,但是注意它会接到where后面,所以是条件sql,不能太随意的写否则肯定报错。

思考一下这些Wrapper是怎么实现的呢?如果是我来完成这样一个功能,我应该是拼一个很长的sql,为了能很好的适配这些条件,我会在拼完所有的条件之后,前面加一个"where 1=1 and ",然后再往前加select或者update。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值