mybatis-plus wrapper使用,mybatisplus的wrapper使用
目录
包装器条件构建器1 queryWrapper构建器1.1组装、删除、更改、检查条件1.2条件优先级1.3实现子查询2 updateWrapper构建器2.1升级修改方法(无需创建对象)2.2实际开发中的应用3 lambdaXxxWrapper构建器3.1 lambdaQueryWrapper构建器3.2 lambdaUpdateWrapper构建器
00-1010条件构造器包装器是用来封装CRUD方法的参数条件的接口。它的底层有很多子类,最重要的是最底层的四个子类:
Querywrapper可用于删除和检查updateWrapper,update wrapper可用于修改操作,无需创建实体类对象。LambdaQueryWrapper和LambdaUpdateWrapper在调用字段参数时升级,其他都是一样的。因为添加、删除和检查记录的添加可以无条件完成,所以添加方法不需要条件构造函数包装器,而其他的删除和检查都有这个条件构造函数参数。
Wrapper条件构造器
00-1010装配查询条件
查询条件为:姓名包含所有带字母A的值,年龄在20-30之间,邮箱不为空。查询出的值按年龄降序排列,如果是同年龄,则按id升序排列。
查询姓名、年龄和电子邮件字段。
@ test public void selectlistest(){ query wrapper user query wrapper=new query wrapper();queryWrapper.select(姓名,年龄,电子邮件)。like(名字,一)。介于(年龄,20,30)。isNotNull(email )。orderByDesc(age )。orderByAsc( id );//SELECT id,姓名,年龄,邮箱,is_deleted FROM用户其中is_deleted=0和(姓名LIKE?年龄介于?然后呢。且email不为空)ORDER BY age DESC,id ASC ListMapString,Object maps=mapper . select maps(query wrapper);maps . foreach(system . out :3360 println);system . out . println(=================================================================);list user users=mapper . select list(query wrapper);users . foreach(system . out :3360 println);} selectMaps和selectList的区别在于:SELECT mapS会将查询结果封装在一个元素类型为MAP set的列表集合中,集合中只有对应于查询返回字段的键值对;selectList的返回值也是一个列表集,只不过元素类型是对应的泛型类型,包含泛型类型的所有字段,查询返回的以外的值都是null。
程序集删除条件
删除条件:电子邮件不为空。
@ test public void delete test(){ query wrapper user query wrapper=new query wrapper();query wrapper . is null( email );//更新用户集is_deleted=1其中is_deleted=0且(email为NULL)int result=mapper . delete(query wrapper);System.out.println(删除的行数是结果);}装配修改条件
修改条件:(年龄大于20,用户名包含A)或者邮箱为空。
@Testpublic void updateTest() {
User user = new User(); user.setAge(20); user.setEmail("temporary.com"); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.gt("age", 20) .like("name", "a") .or() .isNull("email"); // UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL) int result = mapper.update(user, queryWrapper); System.out.println("修改的行数为" + result);}
1.2 条件优先级
使用queryWrapper组装复杂条件的时候,存在一个且或条件的优先级问题,也就是说在实现多条件拼接的时候且或条件该如何拼接到一起,接下来就挑取两个例子来了解一下
// (年龄大于20并且用户名中包含有a) 或 邮箱为null// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)queryWrapper.gt("age", 20) .like("name", "a") .or() .isNull("email");// 用户名中包含有a 且 (年龄大于18或邮箱为null)// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))queryWrapper.like("name", "a") .and(i -> i.gt("age", 18).or().isNull("email"));
总结一下:Lambda表达式中的条件会被当做一个整体优先执行,如果不括起来影响结果的话就需要使用Lambda表达式的写法,具体的使用要根据业务SQL语句来定
1.3 实现子查询
@Testpublic void sonSelectTest() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.inSql("id", "select id from user where id <= 100"); // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100)) List<User> users = mapper.selectList(queryWrapper); users.forEach(System.out::println);}
2 updateWrapper构造器
2.1 升级修改方法(无需创建对象)
组装修改条件 修改条件:用户名中包含有a并且(年龄大于20或邮箱为null)
@Testpublic void updateWrapperTest() { UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.like("name", "a") .and(i -> i.gt("age", 20).or().isNull("email")); updateWrapper.set("name", "小黑").set("email", "dhsjfghr"); // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL)) int result = mapper.update(null, updateWrapper); System.out.println("修改的行数为" + result);}
由SQL可见,使用updateWrapper和queryWrapper完成的修改功能一样,且调用的方法也一样(mapper.update),二者的区别就是updateWrapper不用创建实体类对象,直接使用set方法就可以设置修改的字段值
2.2 实际开发时的应用
在实际开发中,不管是queryWrapper还是updateWrapper都应该在一定的判断下再去使用条件构造器拼接条件,比如说请求传过来的值在不为空的情况下才去对这个字段进行条件设置,比如下面的这段代码
@Testpublic void ifTest() { String userName = ""; Integer ageBegin = 20; Integer ageEnd = 30; QueryWrapper<User> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(userName)) { queryWrapper.like("name", userName); } if (ageBegin != null) { queryWrapper.ge("age", ageBegin); } if (ageEnd != null) { queryWrapper.le("age", ageEnd); } List<User> users = mapper.selectList(queryWrapper);}
然而,上面的代码使用了很多的if判断显得过于冗余,于是许多的方法都带有一个condition参数,当这个参数为true的时候才会拼接查询条件,下面的代码用来代替上面一堆的if判断
QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName) .ge(ageBegin != null, "age", ageBegin) .le(ageEnd != null, "age", ageEnd);
3 lambdaXxxWrapper构造器
lambdaXxxWrapper与xxxWrapper的区别就是:他们可以使用Lambda的方式直接调用对象的getter方法来指定字段,而不用对照数据库中的字段名,这样就乐意避免参数对应不上数据库字段的问题。除了在调用字段时的写法不一样之外,其他的写法上二者的方式都一样
3.1 lambdaQueryWrapper构造器
@Testpublic void lambdaQueryWrapperTest() { String userName = ""; Integer ageBegin = 20; Integer ageEnd = 30; LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName) .ge(ageBegin != null, User::getAge, ageBegin) .le(ageEnd != null, User::getAge, ageEnd); List<User> users = mapper.selectList(lambdaQueryWrapper);}
3.2 lambdaUpdateWrapper构造器
@Testpublic void lambdaUpdateWrapperTest() { LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.like(User::getName, "a") .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail)); lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr"); // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL)) int result = mapper.update(null, lambdaUpdateWrapper); System.out.println("修改的行数为" + result);}
到此这篇关于Mybatis-Plus Wrapper条件构造器超详细使用教程的文章就介绍到这了,更多相关Mybatis-Plus Wrapper条件构造器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。