[toc]
MyBatisPlus实现复杂查询 ![13 mp实现复杂查询](/medias/mybatisplus/13 mp实现复杂查询.png)
1. wapper介绍
Wrapper : 条件构造抽象类,最顶端父类。
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件。
QueryWrapper
:Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作。
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
1 2 3 4 5 6 7 @RunWith(SpringRunner.class) @SpringBootTest public class QueryWrapperTests { @Autowired private UserMapper userMapper; }
2. AbstractWrapper
注意:以下条件构造器的方法入参中的 column
均表示数据库字段
以下查询条件都是在AbstractWrapper中定义的。
2.1 ge、gt、le、lt、isNull、isNotNull 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Test public void testDelete () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.isNull("create_time" ).ge("age" , 21 ).isNotNull("email" ); int result = userMapper.delete(queryWrapper); System.out.println("result = " + result); }
2.2 eq、ne
注意: seletOne返回的是一条实体记录,当出现多条时会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 @Test public void testSelectOne () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.eq("name" ,"Sandy" ); User user = userMapper.selectOne(queryWrapper); System.out.println("user = " + user); }
2.3 between、notBetween 1 2 3 4 5 6 7 8 9 10 11 12 @Test public void testSelectCount () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.between("age" ,22 ,30 ); Integer count = userMapper.selectCount(queryWrapper); System.out.println("count = " + count); }
2.4 allEq 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test public void testSelctList () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); Map<String,Object> map = new HashMap <>(); map.put("name" ,"HeMiao" ); map.put("age" ,28 ); queryWrapper.allEq(map); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
2.5 like、notLike、likeLeft、likeRight
selectMaps返回Map集合列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void testSelectMaps () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.like("name" ,"2" ); List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper); maps.forEach(System.out::println); }
2.6 in、notIn、inSql、notinSql、exists、notExists
in、notIn:
inSql、notinSql:可以实现子查询
例: inSql("age", "1,2,3,4,5,6")
—>age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")
—>id in (select id from table where id < 3)
2.7 or、and
注意: 这里使用的是 UpdateWrapper
不调用or
则默认为使用 and
连
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void testUpdate1 () { User user = new User (); user.setAge(99 ); user.setName("Andy" ); UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper <>(); userUpdateWrapper .like("name" , "h" ) .or() .between("age" , 20 , 30 ); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result); }
2.8 嵌套or、嵌套and
这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void testUpdate2 () { User user = new User (); user.setAge(99 ); user.setName("Andy" ); UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper <>(); userUpdateWrapper .like("name" , "h" ) .or(i -> i.eq("name" , "李白" ).ne("age" , 20 )); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result); }
2.9 orderBy、orderByDesc、orderByAsc 1 2 3 4 5 6 7 8 9 10 11 12 13 @Test public void testSelectListOrderBy () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.orderByDesc("id" ); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
2.10 last
直接拼接到 sql 的最后
注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用。
1 2 3 4 5 6 7 8 9 @Test public void testSelectListLast () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.last("limit 1" ); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
2.11 指定要查询的列
queryWrapper.select("id","name","age");
1 2 3 4 5 6 7 8 9 @Test public void testSelectListColumn () { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.select("id" ,"name" ,"age" ); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
2.12 set、setSql
最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test public void testUpdateSet () { User user = new User (); user.setAge(99 ); UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper <>(); userUpdateWrapper .like("name" , "h" ) .set("name" , "老李头" ) .setSql(" email = '123@qq.com'" ); int result = userMapper.update(user, userUpdateWrapper); }
☆