mybatis-plus QueryWrapper自定义查询条件的实现

  

mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/, github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus。
,但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发问题,能力强的还是直接看源码好,一切答案都在源码中。

版本推荐用3.1.0,3.1.1及以上版本有bug,访问mapper接口的时候,会把数据库日期类型转换为localDateTime,报错java.sql.SQLFeatureNotSupportedException

解决方案可以参考https://www.jb51.net/article/193995.htm

& lt; dependency>   & lt;才能groupId> com.baomidou</groupId>   & lt;才能artifactId> mybatis-plus-boot-starter</artifactId>   & lt;才能version> 3.1.0</version>   & lt;/dependency>

mybatis-plus里有个类QueryWrapper,封装sql对象,包括哪条件,订单排的序,选择哪些字段等等。该类的具体用法,网上教程很多。

这里有个需求,通过前端提交查询条件,后台动态拼接成那里的sql语句,用于查询。常规做法是前端提交一堆查询参数,控制器层用一个对象接收,然后在mybatis的xml里对该对象里的各种属性做判断

& lt; select  id=皌est"比;   ,select  *,得到测试   ,& lt; where>   ,& lt; if 测试=?name  !=, null 以及name  !=, & # 39; & # 39;,“比;   以及才能name=#{名称}   ,& lt;/if>   ,……   ,& lt;/where>   & lt;/select>

这有个问题是具体字段连接类型就有很多,=,祝辞,& lt;等等。当然要实现功能有很多种方式,mybatis-plus的QueryWrapper很强大,可以通过对象的方式进行查询操作,但是不同的页面都自己管自己,效率低下,会存在大量重复代码,所以我就想自己封装一套,从前端的查询条件传固定格式的参数,到后台进行转换,自动拼接成对应的,sql语句,再传到mybatis xml里进行动态查询。这样所有页面就可以统一,便于操作。下面进入正题:

<强>前端

前端用的技术是html + jquery, jquery操作dom做各种操作. html就仅仅是样式展现,不涉及任何的逻辑代码,没有使用vue之类的mvvm框架,也没有使用thymeleaf之类的模板引擎,其实这些都会在html嵌入污染代码,导致美工修改页面样式的时候一脸蒙蔽. html就是纯的html + css,通过jquery来完成剩余的工作。

索引。html

& lt; form  id=癿yform"比;   ,& lt; input  name=皀ame"/比;   ,& lt; input  name=癮ge"/比;   ,& lt; input  name=皊tartdate"/比;   ,& lt; input  name=癳nddate"/比;   & lt;/form>

jquery发起帖子请求,拼接的参数如下:

var  searchParam =, (   ,{列:“COLUMN_NAME",类型:,“like",,值:,“tim"},   ,{列:“COLUMN_AGE",类型:,“eq",,值:,“22”},   ,{列:“COLUMN_DATE",类型:,“ge",,值:,“2019 - 08 - 16,00:00:00"},   ,{列:“COLUMN_DATE",类型:,“le",,值:,“2019 - 08 - 16,23:59:59"}   ];

其中列值为数据表的字段名;类型值为sql字段拼接的方式,规则可自己定制;价值就是字段值了;目标拼接成的sql语句如下:

COLUMN_NAME  like  & # 39; %蒂姆% & # 39;,以及COLUMN_AGE=22,以及COLUMN_DATE>=& # 39; 2019 - 08 - 16,就是# 39;,以及COLUMN_DATE<=& # 39; 2019 - 08 - 16, 23:59:59& # 39;

, jquery发起帖子请求:

. ajax({美元   ,url:“list",   类型:大敌;“post",   ,数据:{pageNum: 1、页大小:20,条件:JSON.stringify (searchParam)……(根据需要自己加请求参数)}   ,成功:函数(结果){…}   });

说明:请求参数条件为什么要传json字符串后续有介绍。

<强>后端

<强>控制器

控制器接收前端发过来的参数,碰到一个问题,在有多个请求参数的情况下,如何接收集合对象请求参数?使用了很多方法都不行,后续有空再研究下,目前使用的方法简单粗暴,就上传json字符串,后端转换成对象。

控制器:

import  com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;   @RequestMapping (value =,“/list",, method =, RequestMethod.POST)   public  Object  getTestList (@RequestParam (=name “pageNum",, required =,假,,defaultValue =,“1“), int  pageNum,   ,,,,,,,,,,,,@RequestParam (=name “pageSize",, required =,假,,defaultValue =,“15”), int 页大小,   ,,,,,,,,,,,,@RequestParam (=name “condition", required =, false), String  conditionJson), {   ,QueryWrapper  QueryWrapper =, SearchUtil.parseWhereSql (conditionJson);   ,,queryWrapper.orderByDesc (“CREATE_DATE");   ,,return  service.getPageTestList (queryWrapper、pageNum pageSize);   }

mybatis-plus QueryWrapper自定义查询条件的实现