Spring如何使用4行代码优雅的实现模糊查询,精确查询,分页查询功能。
最近开始使用Spring开发新项目了,开发新项目必定少不了折腾增删查改。 其中模糊查询,精确查询,分页查询也算是不好对付的功能,需要手写大量重复的代码来实现相关的功能,如何优雅的实现查询功能呢?
首先上两张截图。
第一张截图是分页列出活动,可以根据活动名称和活动内容进行模糊查询。 举办机构,举办年份,活动分类为可选项。如指定了年份就会检索相应年份的数据。
第二张截图是列出分类。 可以根据分类名称进行模糊查询。
可以发现,两个listData 方法均只有4行代码。
第一行指定模糊查询的列名s,第二行获取一个 Specification 对象,并且传递需精确匹配的参数。 第三行查询。第四行return 。
以下是获取Specification对象的实现 。 这里使用了静态泛型方法,关键在于熟练的使用 CriteriaBuilder 来构建or and like eq 等操作符号。
最终的实现效果如下:
这里需要根据fid 隔离不同用户的数据,所以每条sql查询都带有一个fid=? 条件查询,当然这个条件是通过 addCommon 方法来实现的。 如果有其他共同的查询条件,在此方法中实现即可。
PageRequestUtil 类的实现,简单的实现了参数的校验。 比如页码不能为负数,每页最多100条数据。 如果 numPerPage大于100,很有可能就是有人在采集你网站的数据了,虽然这种限制也根本阻止不了别人的采集行为。但至少可以使得程序更加安全一点,不会一次性查询大量数据导致mysql崩溃。
如何应对新的业务, 如果只有根据某些字段进行模糊查询, 只需写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 还是不错的选择。
2019-04-28
今天下午在尝试构建一个 SpecificationBuilder 工具 ,看似使用起来还是非常简单的,但是实现十分丑陋,就不敢拿出来丢人了。
2019-04-29
虽然实现得非常垃圾,但毕竟是亲手实现的,所以SpecificationBuilder 的代码还是贴出来。
https://github.com/lzflzf/SpecificationBuilder/blob/master/src/main/SpecificationBuilder.java
看同事一直在使用 ExampleMatcher 。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
NEXT社区小课堂 | 第四课:dBFT 2.0详解 | 委托拜占庭容错:技术细节、挑战和前景
NEXT社区 | 小课堂 由于近期NEXT社区加入很多新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者。为了更方便、更系统的让NEXT社区的伙伴们了解NEO的技术知识,因此我们开设了小课堂,每周3节,向大家普及NEO相关的知识要点! NEXT社区小课堂 | 第四课 dBFT 2.0详解 委托拜占庭容错:技术细节、挑战和前景 针对部分同步和完全异步的拜占庭容错系统 的相关研究文献有很多; 但是能真正应用于真实的不同种类的去中心化应用智能合约(SC)场景的研究却很少。值得注意的是,与涉及状态机复制(Schneider 1990)的智能合约交易持久化需求相比,更新存储状态的应用程序会带来不一样的挑战。 此外,要考虑的第二个重要事实与账本信息更新后的确定性有关。终端用户、商家和交易所都希望能明确地知悉他们的交易是否已得到处理或者是否有可能被回退。与先前文献中的大部分研究不同,NEO区块链在第一层网络上提出了一种具有一区块最终确认性的共识机制 。除了在实际案例应用中广为人知的优势之外,这个特性也带来了一些额外的限制、漏洞和挑战。 本技术材料的目的是强调从经典的实用拜占庭容错机制(p...
- 下一篇
死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)CopyOnWriteArraySet以何种方式保证元素不重复? (5)如何比较两个Set中的元素是否完全一致? 简介 CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存储元素的,所以它并不是使用Map来存储元素的。 但是,我们知道CopyOnWriteArrayList底层其实是一个数组,它是允许元素重复的,那么用它来实现CopyOnWriteArraySet怎么保证元素不重复呢? CopyOnWriteArrayList回顾请点击【死磕 java集合之CopyOnWriteArrayList源码分析】。 源码分析 Set类的源码一般都比较短,所以我们直接贴源码上来一行一行分析吧。 Set之类的简单源码适合泛读,主要是掌握一些不常见的用法,做到心里有说,坐个车三五分钟可能就看完了。 像ConcurrentHashMap、ConcurrentSkipL...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 2048小游戏-低调大师作品
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址