Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

Easter79
• 阅读 524

最近开始使用Spring开发新项目了,开发新项目必定少不了折腾增删查改。 其中模糊查询,精确查询,分页查询也算是不好对付的功能,需要手写大量重复的代码来实现相关的功能,如何优雅的实现查询功能呢? 

首先上两张截图。

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

第一张截图是分页列出活动,可以根据活动名称和活动内容进行模糊查询。 举办机构,举办年份,活动分类为可选项。如指定了年份就会检索相应年份的数据。

第二张截图是列出分类。 可以根据分类名称进行模糊查询。 

可以发现,两个listData 方法均只有4行代码。 

第一行指定模糊查询的列名s,第二行获取一个 Specification 对象,并且传递需精确匹配的参数。 第三行查询。第四行return 。

以下是获取Specification对象的实现 。   这里使用了静态泛型方法,关键在于熟练的使用 CriteriaBuilder 来构建or  and  like  eq 等操作符号。 

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

最终的实现效果如下: 

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

这里需要根据fid 隔离不同用户的数据,所以每条sql查询都带有一个fid=? 条件查询,当然这个条件是通过 addCommon 方法来实现的。 如果有其他共同的查询条件,在此方法中实现即可。

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

PageRequestUtil 类的实现,简单的实现了参数的校验。 比如页码不能为负数,每页最多100条数据。 如果 numPerPage大于100,很有可能就是有人在采集你网站的数据了,虽然这种限制也根本阻止不了别人的采集行为。但至少可以使得程序更加安全一点,不会一次性查询大量数据导致mysql崩溃。

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

如何应对新的业务, 如果只有根据某些字段进行模糊查询, 只需写4行代码足以实现分页功能。 

如何应对业务的变更, 今天产品说根据活动名称检索足以,但第二天又说需要跟据活动内容进行检索,或者新增检索字段。 那么还是只需要修改第一行代码即可。 

以下是更新内容:

2019-04-26 

本博文适用场景。单表查询  where   A.a = ?  and A.b = ?   and (A.c like ? or A.d like ?)      ,   参数不定, param1 为空的话 where 条件退化为 A.b =param2  and (A.c like ? or A.d like ?)  ,  param2 为空的话 where 条件退化 A.a = param1  and (A.c like ? or A.d like ?)   , searchword 为空的话, where 条件退化为 A.a = param1  and A.b = param2 。 

关于 where 条件的排序问题, 我坚信精确匹配放在迷糊查询前, 整型匹配放在字符串匹配前 ,有索引的列放在没有索引的列前,这样可以提高查询速度。 

A.a = 100  and  A.b = 'lizhifeng'    and  A.c like '%李%'     >     A.b = 'lizhifeng'  and A.a = 100  and  A.c like '%李%'   >   A.c like '%李%'  and A.b = 'lizhifeng'  and A.a = 100 .   当然我也更愿意相信现在的sql查询器强大得到能够自动优化查询条件。 

夸表查询,我还没有找到很好的解决办法,不过我觉得使用 @Query 和 hql  还是不错的选择。 

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

2019-04-28

今天下午在尝试构建一个 SpecificationBuilder 工具 ,看似使用起来还是非常简单的,但是实现十分丑陋,就不敢拿出来丢人了。

2019-04-29 

虽然实现得非常垃圾,但毕竟是亲手实现的,所以SpecificationBuilder 的代码还是贴出来。 

https://github.com/lzflzf/SpecificationBuilder/blob/master/src/main/SpecificationBuilder.java

Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。

看同事一直在使用  ExampleMatcher  。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
MySQL总结(十一)子查询
!(https://oscimg.oschina.net/oscnet/upa344f41e81d3568e3310b5da00c57ced8ea.png)子查询1\.什么是子查询需求:查询开发部中有哪些员工selectfromemp;通
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Wesley13 Wesley13
3年前
mysql出现Waiting for table metadata lock的解决方法
查询某一个表时,一直没有显示数据,于是就showprocesslist;!(https://oscimg.oschina.net/oscnet/07f86cfca979bba85837f1b6352eb00ec33.jpg)发现有表已经被锁了,关掉了之前的查询语句可以看到!(https://oscimg.oschina.net/oscn
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k