1、QueryWrapper
QueryWrapper 使用的是数据库的字段名
/**
* (年龄小于40或邮箱不为空)且姓王
* SELECT * FROM `user`
* WHERE (`age`< 40 OR `email` IS NOT NULL) AND `name` LIKE '王%'
*/
@Test
public void selectList_nested() {
QueryWrapper<User> query = new QueryWrapper<>();
query.nested(q -> q.lt("age", 40).or().isNotNull("email"))
.likeRight("name", "王");
List<User> list = userMapper.selectList(query);
list.forEach(System.out::println);
}
@Test
public void selectList_entity() {
User whereUser = new User();
whereUser.setName("刘");
whereUser.setAge(32);
whereUser.setEmail("");
QueryWrapper<User> query = new QueryWrapper<>(whereUser);
List<User> list = userMapper.selectList(query);
list.forEach(System.out::println);
}
2、LambdaQueryWrapper
LambdaQueryWrapper使用的是Lambda语法
@Test
public void mySelect() {
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.likeRight(User::getName, "王")
.and(q -> q.lt(User::getAge, 40).or().isNotNull(User::getEmail));
List<User> list = userMapper.selectAll(query);
list.forEach(System.out::println);
}
3、LambdaQueryChainWrapper
链式查询
/**
* 链式lambda条件构造器:更优雅的书写方式
*/
@Test
public void lambdaQueryChainWrapper() {
List<User> list = new LambdaQueryChainWrapper<User>(userMapper)
.likeRight(User::getName, "王")
.and(
q -> q
.lt(User::getAge, 40)
.or()
.isNotNull(User::getEmail)
)
.list();
list.forEach(System.out::println);
}
4、三者区别
1、QueryWrapper 直接使用写死“列名”方式,容易因拼写错误导致异常,当字段名称发生改变,导致额外更多检查和修改工作。如有错误,运行时报错。或者需要封装查询类的对象,增加代码量。
2、LambdaQueryWrapper 使用lambda表达式,如有错误,编译期就会报错;灵活。【推荐】
3、LambdaQueryChainWrapper,写法偏向于炫技,可读性没有上面的代码强。