【SpringBoot专题】整合mybatis-plus之封装查询参数简化查询

通常开发过程中,操作数据库是作为后端开发必要掌握的本领,今天分享的是springboot整合mybatis-plus,官网上也有很多栗子,今天整合不是重点,重点是小B今天造了个轮子,想写成博客分享出来。

项目中需要引入pom依赖,如下:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatisplus-spring-boot-starter</artifactId><version>1.0.5</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>${mybatisplus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus.version}</version></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.6</version></dependency>

接着就是配置,我们可以用yml配置(仅仅是自己的爱好)

mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml # 你的mapper sql文件位置type-aliases-package: fast.cloud.nacos.mybatis.entity # mybatis 扫遍实体类的位置configuration:map-underscore-to-camel-case: true  # 驼峰配置#配置数据源
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo?useUnicode=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8username: rootpassword: root
# 打印sql配置
logging:level:fast.cloud.nacos.mybatis.mapper: debug#pagehelper 配置
pagehelper:helper-dialect: mysqlreasonable: falsesupport-methods-arguments: tureparams: count=countSql

创建实体类,mapper接口,以及mapper.xml文件,自己可以写一个test类测试,具体代码后面会分享github地址。

下面要说的就是今天的重点了我们通常在查询的时候通常会写如下的代码:

QueryWrapper<DemoEntity> queryWrapper = new QueryWrapper<>();queryWrapper.eq();queryWrapper.lt();queryWrapper.like();.....还有很多查询条件,有时候还要加上参数的非空判断,很繁琐。

于是就造了一个轮子,能不能把这些查询条件给抽取出来呢,先给一个代码,就是封装的一个工具类,下面的代码思想就是,想把这些查询条件封装到一个类里面。

public class MyBaseRequest<T> extends CommonSearchRequest<T> {public <ENTITY> QueryWrapper<ENTITY> getQuery(Class<ENTITY> entityClass) {QueryWrapper<ENTITY> queryWrapper = new QueryWrapper<>();//添加sortif (this != null && this.getSortBy() != null) {queryWrapper.orderBy(true, this.getSortBy().getDirection() == 1 ? true : false, this.getSortBy().getField());}MyBaseRequest request = this;if (request.getCondition() == null) {return queryWrapper;}Class clazz = request.getCondition().getClass();//获取查询类Query的所有字段,包括父类字段List<Field> fields = getAllFieldsWithRoot(clazz);for (Field field : fields) {//获取字段上的@QueryWord注解QueryCondition qw = field.getAnnotation(QueryCondition.class);if (qw == null) {continue;}// 获取字段名String column = qw.column();//如果主注解上colume为默认值"",则以field为准if (column.equals("")) {column = field.getName();}field.setAccessible(true);try {Object value = field.get(request.getCondition());//如果值为null,注解未标注nullable,跳过if (value == null && !qw.nullable()) {continue;}// can be emptyif (value != null && String.class.isAssignableFrom(value.getClass())) {String s = (String) value;//如果值为"",且注解未标注emptyable,跳过if (s.equals("") && !qw.emptyable()) {continue;}}//通过注解上func属性,构建路径表达式column = UnderlineToHump(column);switch (qw.func()) {case equal:queryWrapper.eq(column, value);break;case like:queryWrapper.like(column, "%" + value + "%");break;case gt:queryWrapper.gt(column, value);break;case lt:queryWrapper.lt(column, value);break;case ge:queryWrapper.ge(column, value);break;case le:queryWrapper.le(column, value);break;case notEqual:queryWrapper.ne(column, value);break;case notLike:queryWrapper.notLike(column, "%" + value + "%");break;}} catch (IllegalAccessException e) {e.printStackTrace();}}return queryWrapper;}public static String UnderlineToHump(String para) {StringBuilder result = new StringBuilder();String a[] = para.split("_");for (String s : a) {if (!para.contains("_")) {result.append(s);continue;}if (result.length() == 0) {result.append(s.toLowerCase());} else {result.append(s.substring(0, 1).toUpperCase());result.append(s.substring(1).toLowerCase());}}return result.toString();}//获取类clazz的所有Field,包括其父类的Fieldprivate List<Field> getAllFieldsWithRoot(Class<?> clazz) {List<Field> fieldList = new ArrayList<>();Field[] dFields = clazz.getDeclaredFields();//获取本类所有字段if (null != dFields && dFields.length > 0) {fieldList.addAll(Arrays.asList(dFields));}// 若父类是Object,则直接返回当前Field列表Class<?> superClass = clazz.getSuperclass();if (superClass == Object.class) {return Arrays.asList(dFields);}// 递归查询父类的field列表List<Field> superFields = getAllFieldsWithRoot(superClass);if (null != superFields && !superFields.isEmpty()) {superFields.stream().filter(field -> !fieldList.contains(field)).//不重复字段forEach(field -> fieldList.add(field));}return fieldList;}
}

封装请求类的代码如下

@EqualsAndHashCode(callSuper = true)
@Data
public class DemoCondition extends PageCondition {@QueryCondition(func = MatchType.like)private String name;
}

基于这样我们就可以写下测试代码了,如果想加查询条件的话,直接请求里面加上就好了。

MyBaseRequest<DemoCondition> request = new MyBaseRequest<>();DemoCondition demoCondition = new DemoCondition();request.setCondition(demoCondition);CommonSearchRequest.Sort sort = new CommonSearchRequest.Sort();sort.setDirection(1);sort.setField("name");request.setSortBy(sort);Page<DemoEntity> demoEntityPage = demoService.initPage(request);demoMapper.selectDemoPage(demoEntityPage);

比如我们在开发的时候,需求是一直在变的,比如产品经理一会相加个查询条件,我们只需要在我们的请求类里面添加就好了,至于其他的我们不用动了,正所谓,拥抱变化吧,哈哈~ 最后奉上github地址

https://github.com/fafeidou/fast-cloud-nacos/tree/master/fast-common-examples/fast-common-example-web

【SpringBoot专题】整合mybatis-plus之封装查询参数简化查询相关推荐

  1. springboot中整合mybatis及简单使用

    springboot中整合mybatis及简单使用 1.引入依赖 2.在applicaiton.yaml中配置数据源以及mybatis 3.创建sql测试表 4.编写mapper接口和mapper.x ...

  2. springboot项目整合mybatis

    SpringBoot项目整合mybatis 本章内容 使用 idea创建 SpringBoot项目 SpringBoot项目中配制 mybatis 框架 1 创建 SpringBoot项目 1.1 在 ...

  3. Springboot轻松整合Mybatis

    在springboot没有出现之前,spring整合mybatis是相当麻烦,各种bean配置,现在我们来感受一下Springboot整合Mybatis是有多么方便 先来看看效果 添加用户: 查询用户 ...

  4. 玩转springboot:整合mybatis实例

    这篇文章讲解一下springboot整合mybatis,其实,springboot整合mybatis和springmvc整合mybatis并没有什么太大的区别,大体上还是差不多哦,只是比springm ...

  5. java xml快捷注释_详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)

    序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求. 一 ...

  6. mysql mybatis多库查询_SpringBoot2.0.3整合Mybatis添加动态数据源实现多库查询(DynamicDataSource)...

    最近由于项目使用了spring boot 2.0.3版本,业务从多个数据查询,必须支持动态数据源,由于2.0.3的版本与之前的版本有了较大的改动其实现上有些不同,再采坑以后在此记录 1.需要Java类 ...

  7. springboot/springcloud整合mybatis(mysql)

    1.导入相关jar包 <!-- mysql客户端 --> <dependency><groupId>mysql</groupId><artifac ...

  8. Springboot中使用Mybatis框架对数据库进行联表查询,踩坑填坑

    因为mybatis使用的基本是原生sql语句 所以首先从数据库开始说 以mysql数据库为例,对表的连接查询分为四种 内连接,外连接,交叉连接,和联合连接 内连接使用比较运算符根据每个表共有的列的值匹 ...

  9. springboot之整合mybatis

    第一次搞,真的是花了老大的经历了,各种字段敲错了. 记录一下过程: 首先添加依赖: <dependency><groupId>org.mybatis.spring.boot&l ...

最新文章

  1. html %3c% page,page.html
  2. 基于工程经验的『RESTful接口设计规范』
  3. hdu 1532(最大流)
  4. Java---报错The type List is not generic; it cannot be parameterized with arguments <Role>==List打包错误
  5. 基于Java学院网页的搜索引擎设计和实现
  6. 行为设计模式 - 模板方法设计模式
  7. 线段树区改区查标记永久化板子
  8. 微信开发 Java SDK
  9. KDD Cup 2020多模态召回比赛亚军方案与搜索推荐业务的业务应用
  10. Bootstrap学习(九)collapse折叠窗口、carousel轮播效果、Affix侧边栏
  11. js Qrcode.js实现文字内容通过二维码展示
  12. 杰理之RX传导杂散【篇】
  13. python barplot宽度,如何在seaborn barplot上设置宽度
  14. 销售小姐姐再也不用担心写错合同编号了
  15. 网络硬盘 excel服务器,Excel Server Tutorial
  16. [c++]c++程序设计-Y.Daniel.Liang 笔记
  17. 一文学会目前最火热的大数据技术
  18. 医学文献资料档案全文收集攻略
  19. Endnote下载的pdf文件合并到同一个文件夹
  20. 手把手硬件电路详细设计过程

热门文章

  1. 汉字怎么输入计算机,教你不会读的汉字怎么在电脑中打出来,巧用拆字拼音法来解决...
  2. RStudio:R语言编辑器
  3. Python爬虫实战 下载原力创付费文档---滑动式
  4. 推荐一个git辅助工具:TortoiseGit
  5. 6-VulnHub-Lord Of The Root 1.0.1
  6. 在西安,程序员的平均薪资是多少?同职场经验的不同职位薪资差距到底有多大?
  7. JSP总结(一):概述,真身,语法
  8. 知名游戏引擎公司Havok发布免费3D移动游戏引擎“Project Anarchy”
  9. 案例 | 华泰证券:数据驱动的智能营销平台
  10. 页面载入进度条 nprogress的使用