1、查询注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Query {/*** 是否进行相等查询*/boolean eq() default true;/*** 是否模糊查询*/boolean like() default false;/*** 是否使用in表达式*/boolean in() default false;/*** 使用in表达式字符串划分符号*/String symbol() default QueryConstant.COMMA;/*** 是否需要排序*/boolean orderBy() default false;/***排序方式,默认升序*/String sortWay() default QueryConstant.ASC;}

2、查询常量

public class QueryConstant {/*** 升序*/public static final String ASC="ASC";/*** 逆序*/public static final String DESC="DESC";/*** 逗号*/public static final String COMMA=",";}

3、扩展函数式接口


@FunctionalInterface
public interface ComplexFunction<T, U, P, R> {R apply(T t, U u, P p);
}

4、BaseServiceImpl封装

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.regex.Matcher;@SuppressWarnings({"unused", "unchecked"})
public abstract class BaseServiceImpl<MAPPER extends BaseMapper<ENTITY>, ENTITY extends BaseEntity> extends ServiceImpl<MAPPER, ENTITY> implements BaseService<ENTITY> {@Overridepublic boolean updateById(ENTITY entity){entity.setDateUpdated(null);return SqlHelper.retBool(getBaseMapper().updateById(entity));}protected <T> LambdaQueryWrapper<ENTITY> buildWrapper(T t) {QueryWrapper<ENTITY> query = new QueryWrapper<>();Field[] fields = t.getClass().getDeclaredFields();//构建普通查询条件query=buildQueryWrapper(t,query, this::buildQuery);//构建排序查询条件query=buildQueryWrapper(t,query,this::buildOrderBy);return query.lambda();}/***通用方法构建queryWrapper*/private <T> QueryWrapper<ENTITY> buildQueryWrapper(T t,QueryWrapper<ENTITY> queryWrapper, ComplexFunction<Field,Object,QueryWrapper<ENTITY>,QueryWrapper<ENTITY>> function){Field[] fields=t.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);Object o;try {o = field.get(t);} catch (IllegalAccessException e) {log.error("反射获取值异常", e);throw new BusinessException("反射获取值异常");}if (ClassUtil.fieldInClass(field.getName(), getEntityClass())) {queryWrapper=function.apply(field,o,queryWrapper);}}return queryWrapper;}/*** 构建查询条件*/private QueryWrapper<ENTITY> buildQuery(Field field,Object o,QueryWrapper<ENTITY> queryWrapper){if(Func.isEmpty(o)){return queryWrapper;}Query query = field.getAnnotation(Query.class);if (query == null) {return queryWrapper;}String dbName = xX2x_x(field.getName());if (query.like()) {queryWrapper.like(dbName, o);return queryWrapper;}if (query.in()) {if (o instanceof String) {queryWrapper.in(dbName, ListUtil.getListByString((String) o, query.symbol()));}return queryWrapper;}if(query.eq()){queryWrapper.eq(dbName, o);}return queryWrapper;}/*** 构建排序条件*/private QueryWrapper<ENTITY> buildOrderBy(Field field,Object o,QueryWrapper<ENTITY> queryWrapper){Query query = field.getAnnotation(Query.class);if (query == null) {return queryWrapper;}String dbName = xX2x_x(field.getName());if(query.orderBy()){if(QueryConstant.ASC.equals(query.sortWay())){queryWrapper.orderByAsc(dbName);}else if(QueryConstant.DESC.equals(query.sortWay())){queryWrapper.orderByDesc(dbName);}}return queryWrapper;}/*** 将驼峰转为下划线** @param str 字符串* @return java.lang.String*/private String xX2x_x(String str) {Matcher matcher = RegexConstant.CAPITAL_LETTER.matcher(str);StringBuffer sb = new StringBuffer();while (matcher.find()) {matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());}matcher.appendTail(sb);return sb.toString();}}

MybatisPlus查询条件和排序高级封装相关推荐

  1. mybatis-plus 查询条件中按时间查询方法

    感觉java的时间处理对中国地区用户来说实在是太蛋疼,因为我们习惯了 yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd 这种格式了,但是java毕竟是外国人写的,他们的时间不是结尾多了 ...

  2. MybatisPlus QueryWrapper(简称 QW,MP 封装的一个查询条件构造器)的使用和简单认识

    上一篇讲的是MybatisPlus的MP注解用法和简单介绍 传送门 (跟上一篇是同一个项目)先来创一个Springboot测试项目 创建一个数据库 -- 创建表 CREATE TABLE t_empl ...

  3. MySQL:单表查询---简单查询+条件查询+高级查询+表和字段取别名

    目录 一.通用模版展示 简单查询 条件查询 高级查询 表和字段取别名 二.举例说明 简单查询 条件查询 高级查询 表和字段取别名 三.注意事项 四.Mapper简单举例 简单查询 条件查询 高级查询 ...

  4. mongorepository查询条件_MongoRepository的多条件查询和排序功能

    继承MongoRepository也太香了吧 mongonDB作为非关系型数据库 是非关系数据库当中功能最丰富,最像关系数据库的.因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言 ...

  5. MyBatis-Plus Wrapper条件构造器查询大全

    一.引言 那么那么那么今天来说下MP中强大的条件查询功能. 本章是基于上个案例来讲的:MyBaits-Plus 快速入门案例 二.具体操作 首先来说说基本的查询吧,根据主键或者简单的查询条件进行查询. ...

  6. Elasticsearch实现商品搜索(关键字查询 条件筛选 规格过滤 价格区间搜索 分页查询 排序查询 高亮查询)

    Elasticsearch实现商品搜索 商品搜索 1.根据关键字查询 2.条件筛选 2.1 品牌筛选 2.1.1 需求分析 2.1.2 代码实现 2.2 规格过滤 2.2.1 需求分析 2.2.2 代 ...

  7. linq之InnerJoin和LeftJoin以及封装动态查询条件版本

    Linq的出现,使数据集的处理显得愈来愈简便.很多时候对于本地数据集的处理,脑海中的第一反应,即尝试使用Linq来实现.诸如DataTable的innerJoin以及leftJoin等操作,很多时候我 ...

  8. MybatisPlus实现条件查询

    wapper介绍 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity ...

  9. php,tp5关键词,分词模糊查询并根据查询条件排序

    php,tp5关键词,分词模糊查询并根据查询条件排序 1.大概需求是我这边搜索"维修工",需要先搜索维修工再搜索维修,用一般模糊查询的话会导致维修的词出不来,所有这边需要先进行分词 ...

最新文章

  1. 利用MEGA32制作辉光数码管显示电路
  2. Java程序员从笨鸟到菜鸟之(七十三)细谈Spring(五)spring之AOP底层大揭秘
  3. 数据加载约定表模型变更_08
  4. VS2010复制项目
  5. python操作注册表能干啥_转 python操作注册表模块_winreg
  6. go语言 Accept error: accept tcp [::]:5551: too many open files;
  7. 10 个优秀的JavaScript开发框架
  8. [原创]如何有效的考核测试人员
  9. 从二元函数的泰勒展开到应用Hessian矩阵检测边缘
  10. win7驱动程序未经签名可以使用吗_win7系统驱动强制数字签名的问题
  11. 9.5 预测市场和真实世界的数据源
  12. https://acs.jxnu.edu.cn/problem/GYM103495E
  13. 鲜为人知 的 人名典故
  14. 原生Poi导出Excel
  15. 架构设计-支付宝、京东、美团、去哪儿的支付系统架构整体设计详解!!!
  16. Hadoop实战视频分享_2013年完整版学习视频种子下载
  17. CSS 3.0实现云雾特效
  18. SQL语言的数据查询之嵌套查询
  19. 友情链接作用与方法详解
  20. C++中的动态空间扩充方法

热门文章

  1. mac 安装软件 显示信任任何来源
  2. 微信 日志服务器 并发大,微信高性能线上日志系统xlog剖析
  3. 抖音xlog算法分析
  4. c语言百变图形,百变图标app官方版-百变图标更换图标app下载v1.0.0-西西软件下载...
  5. LaTeX如何输出反斜杠 \
  6. wx.getLocation接口申请
  7. 异构数据库结构与数据同步工具dbswitch
  8. Excel 快速计算相邻行之间的时间差
  9. Pytest setup teardown
  10. 计算机屏幕一直闪,如何解决电脑显示器一直闪的问题