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