QueryChain - 链路查询
说明
QueryChain 是 一个链路式查询类,它可以构建任意复杂的查询!!!
实例
java
SysUserRoleVo sysUserRoleVo = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.join(SysUser.class, SysRole.class,on->on.eq(SysUser::getRole_id,SysRole::getId))
.eq(SysUser::getId,1)
.like(SysUser::getUserName,"abc")
.groupBy(SysUser::getId)
.having(SysUser::getId,c->c.count().gt(0))
.orderBy(SysUser::getId)
.returnType(SysUserRoleVo.class)
.get();
forSearch() :拼接where时,忽略null 、空字符、字符串trim 等
mybatis-mp 默认不对 null 、空字符 进行处理,这是一种安全的设计
QueryChain 默认 null 会报空指针,然后 空字符也不会忽略,也不会字符串trim,一般情况下也是不需要 忽略的;
但是当你在搜索的场景下时,是需要忽略这些条件,所以设计了 forSearch()方法
forSearch()方法其实是由3个方法组成的,也可以分开设置:
java
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
// 忽略 空字符串 条件参数
// 对字符串进行trim 去空格操作
.forSearch(true);
等同于:
java
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
.ignoreNullValueInCondition(true)
// 忽略 空字符串 条件参数
.ignoreEmptyInCondition(true)
// 对字符串进行trim 去空格操作
.trimStringInCondition(true);
也可以手动进行生效处理:
java
Integer id= XXX;
String userName= YYY;
SysUser sysUser = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.eq(SysUser::getId,id,Objects::nonNull)
.like(SysUser::getUserName,userName,StringUtils::isNotBlank)
.get();
或
java
Integer id= XXX;
String userName= YYY;
SysUser sysUser = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.eq(Objects.nonNull(id),SysUser::getId,id)
.like(StringUtils.isNotBlank(userName),SysUser::getUserName,userName)
.get();
returnType(class) - 映射类
结果对应的类;可实体类,VO,Map
returnMap() - 映射Map类
映射成Map<String,V>
查询方法
get()
:单个查询list()
:列表查询cursor()
:列表游标查询count()
:count查询exists( )
:exists boolean查询paging(Pager)
:分页查询mapWithKey(字段)
:把列表转成一个Map<KEY,对象>,KEY为指定字段的值
select
select(VO.class)
:自动select所需的列(推荐
)select(实体类.class)
:自动实体类里列(推荐
)select(实体类.get字段)
:select实体类字段的列select(实体类.get字段,Function)
:select实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理selectIgnore(实体类.get字段)
:忽略select实体类字段的列
from
from(实体类.class)
:from 实体类的表from(实体类.class,...,实体类N.class)
:from 多个实体类的表from(SubQuery)
:from 一个子查询
join
join(主实体类.class,次实体类.class)
:结合@ForeignKey 可以不写ON条件(推荐
)join(JoinMode,主实体类.class,次实体类.class)
:选择JOIN的方式例如INNER LEFT RIGHT,结合@ForeignKey 可以不写ON条件(推荐
)join(主实体类.class,次实体类.class,ON)
:自行添加ON条件join(JoinMode,主实体类.class,次实体类.class)
:选择JOIN的方式例如INNER LEFT RIGHT,自行添加ON条件
where
eq
:等于ne
:不等于gt
:大于lt
:小于gte
:大于等于lte
:小于等于in
:INnot
:NOT INisNull
:IS NULLisNotNull
:IS NOT NULLempty
:是空字符notEmpty
:非空字符like
:LIKEnotLike
:NOT LIKEbetween
:BETWEENnotBetween
:NOT BETWEENexists
:EXISTSnotExists
:NOT EXISTS
null ,空值等 忽略
eq(StringUtils.isNotBlank(值),SysUser:getUserName,值)
eq(SysUser:getUserName,值,StringUtils::isNotBlank)
and 或 or 切换
and()
:切换为AND 拼接,默认都是AND拼接;切换后,后续都是AND拼接or()
:切换为OR 拼接;切换后,后续都是OR拼接
and 或 or 一个子条件
andNested(Consumer<ConditionChain>)
:AND 一个子条件,会用括号包裹子查询orNested(Consumer<ConditionChain>)
:OR 一个子条件,会用括号包裹子查询
groupBy
groupBy(实体类.get字段)
:groupBy实体类字段的列groupBy(多个 实体类.get字段)
:groupBy多个实体类字段的列groupByselect(实体类.get字段,Function)
:groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
having
having(实体类.get字段,Function)
:groupBy实体类字段的列,同时提供一个Function,转成条件
orderBy
orderBy(实体类.get字段)
:orderBy实体类字段的列,ASC排序方式orderBy(多个 实体类.get字段)
:orderBy多个实体类字段的列,ASC排序方式orderByselect(实体类.get字段,Function)
:orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理orderBy(IOrderByDirection,实体类.get字段)
:orderBy实体类字段的列,IOrderByDirection是排序方式orderBy(IOrderByDirection,多个 实体类.get字段)
:orderBy多个实体类字段的列,ASC排序方式,IOrderByDirection是排序方式orderByselect(IOrderByDirection,实体类.get字段,Function)
:orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理