QueryChain - 链路查询 
说明 
QueryChain 是 一个链路式查询类,它可以构建任意复杂的查询!!!
实例 
java
SysUserRoleVo sysUserRoleVo = QueryChain.of(sysUserMapper)
    .select(SysUser.class,SysRole.class)
    .from(SysUser.class)
    .join(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 等 
xbatis 默认不对 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/innerJoin/leftJoin/rightJoin(主实体类::getId,次实体类::getId):最简单的join方式(- 不推荐)
- join/innerJoin/leftJoin/rightJoin(主实体类.class,次实体类.class,ON):需要自己设置ON条件
- join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,自行添加ON条件(- 旧方法,不推荐)
- join/innerJoin/leftJoin/rightJoin(主实体类.class,次实体类.class):结合@ForeignKey 可以不写ON条件(- 旧方法,不推荐)
- join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,结合@ForeignKey 可以不写ON条件(- 旧方法,不推荐)
where 
- eq:等于
- ne:不等于
- gt:大于
- lt:小于
- gte:大于等于
- lte:小于等于
- in:IN
- not:NOT IN
- isNull:IS NULL
- isNotNull:IS NOT NULL
- empty:是空字符
- notEmpty:非空字符
- like:LIKE
- notLike:NOT LIKE
- between:BETWEEN
- notBetween:NOT BETWEEN
- exists:EXISTS
- notExists: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多个实体类字段的列
- groupBy(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
- groupBy(GetterFields.of(多个 实体类.get字段),Function):groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
having 
- having(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,转成条件
orderBy 
- orderBy(实体类.get字段):orderBy实体类字段的列,ASC排序方式
- orderBy(多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式
- orderBy(实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
- orderBy(GetterFields.of(多个 实体类.get字段),Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
- orderBy(IOrderByDirection,实体类.get字段):orderBy实体类字段的列,IOrderByDirection是排序方式
- orderBy(IOrderByDirection,多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式,IOrderByDirection是排序方式
- orderBy(IOrderByDirection,实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
- orderBy(IOrderByDirection,GetterFields.of(多个 实体类.get字段),Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
