MyBatis Plus应用实践总结
程序员文章站
2024-03-05 23:05:25
...
【1】MyBatis Plus中的嵌套查询
很多时候我们可能需要构造一个嵌套查询,如WHERE (name = ? AND ( (id = ? OR type = ?) ))。外层是and(or)连接,嵌套一个or(and)查询。MyBatis Plus同样对此提供了支持,在Nested<Param, Children>
接口中我们可以看到具体使用方法。
① Nested<Param, Children>接口源码
public interface Nested<Param, Children> extends Serializable {
//jdk1.8中支持了default方法,如下是and嵌套
default Children and(Consumer<Param> consumer) {
return this.and(true, consumer);
}
//带条件的and嵌套
Children and(boolean condition, Consumer<Param> consumer);
//or嵌套
default Children or(Consumer<Param> consumer) {
return this.or(true, consumer);
}
//带条件的or嵌套
Children or(boolean condition, Consumer<Param> consumer);
//不带and or的普通嵌套
default Children nested(Consumer<Param> consumer) {
return this.nested(true, consumer);
}
//不带条件的不带and or的普通嵌套
Children nested(boolean condition, Consumer<Param> consumer);
}
那么如何使用呢?这里建议有lambda表达式基础。关于lambda表达式可以参考博文jdk1.8新特性lambda应用。
② 嵌套应用实例
如我们要达到的SQL效果为:WHERE (name = ? AND ( (id = ? OR type = ?) ))
第一种写法
这种写法比较麻烦,相当于实现了一个匿名类。
QueryWrapper<SysUser> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("name","jane");
queryWrapper.and(new Consumer<QueryWrapper<SysUser>>() {
@Override
public void accept(QueryWrapper<SysUser> sysUserQueryWrapper) {
sysUserQueryWrapper.eq("id",1).or().eq("type",0);
}
});
第二种写法使用lambda表达式
QueryWrapper<SysUser> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("name","jane");
queryWrapper.and(e-> e.eq("id",1).or().eq("type",0));
这种确实很简洁了。