• 超好用的数据库检索工具介绍——Bean Searcher


    超好用的数据库检索工具介绍——Bean Searcher

    一、介绍

    	Bean Searcher与我们常用的mybatis、tk等有类似之处,但也有区别,具体如下:
    	
    	相同点:
    	
    		* 都是orm框架
    		* 都用于查询数据
    
    	不同点:
    		* Bean Searcher只用于查询
    		* 且简洁高效
    		* 能轻松完成众多复杂查询
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    具体查看官网就行:Bean Searcher官网

    举个例子:
    我们要实现一个用户查询的功能
    这个查询有点复杂,它的要求如下:

    可按用户名字段查询,要求: 可精确匹配(等于某个值) 可全模糊匹配(包含给定的值) 可后模糊查询(以...开头) 可前模糊查询(以.. 结尾) 可指定以上四种匹配是否可以忽略大小写
    可按年龄字段查询,要求: 可精确匹配(等于某个年龄) 可大于匹配(大于某个值) 可小于匹配(小于某个值) 可区间匹配(某个区间范围)
    可按角色ID查询,要求:精确匹配
    可按用户ID查询,要求:同年龄字段
    可指定只输出哪些列(例如,只查询 ID 与 用户名 列)
    支持分页(每次查询后,页面都要显示满足条件的用户总数)
    查询时可选择按 ID、用户名、年龄 等任意字段排序
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    试想一下,对于这种要求的查询,后端接口里的代码如果用 mybatis、hibernate、data-jdbc 直接来写的话,100 行代码 能实现吗?

    面对这种需求后端如何 只用一行代码搞定 吧(有兴趣的同学可以 mybatis 等写个试试,最后可以对比一下)

    Bean Searcher只一行代码实现以上需求,它就是专门来对付这种列表检索的,无论简单的还是复杂的,统统一行代码搞定!而且它还非常轻量,Jar 包体积仅不到 100KB,无第三方依赖。

    介绍先到这!!!

    二、使用

    1.导入依赖

    spring项目导入以下依赖:

    <dependency>
        <groupId>com.ejlchina</groupId>
        <artifactId>bean-searcher</artifactId>
        <version>3.7.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    springboot直接导入以下依赖:

    <dependency>
        <groupId>com.ejlchina</groupId>
        <artifactId>bean-searcher-boot-starter</artifactId>
        <version>3.7.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.注入对象
    在你的controller或者service注入base searcher的对象

    	/**
    	 * 注入 Map 检索器,它检索出来的数据以 Map 对象呈现
    	 */
    	@Autowired
    	private MapSearcher mapSearcher;
    	/**
    	 * 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现
    	 */
    	@Autowired
    	private BeanSearcher beanSearcher;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    共同拥有的方法#

    • searchCount(Class beanClass, Map<String, Object> params): Number 查询指定条件下的数据 总条数
    • searchSum(Class beanClass, Map<String, Object> params, String field): Number 查询指定条件下的 某字段 的 统计值
    • searchSum(Class beanClass, Map<String, Object> params, String[] fields): Number[] 查询指定条件下的 多字段 的 统计值
      检索参数 params 是一个条件集合,包含字段过滤、分页、排序 等参数

    只在 MapSearcher 内的方法#

    • search(Class beanClass, Map<String, Object> params): SearchResult<Map<String, Object>> 分页 查询指定条件下数据 列表 与 总条数
    • search(Class beanClass, Map<String, Object> params, String[] summaryFields): SearchResult<Map<String, Object>> 同上 + 多字段 统计
    • searchFirst(Class beanClass, Map<String, Object> params): Map<String, Object> 查询指定条件下的 第一条 数据
    • searchList(Class beanClass, Map<String, Object> params): List<Map<String, Object>> 分页 查询指定条件下数据 列表
    • searchAll(Class beanClass, Map<String, Object> params): List<Map<String, Object>> 查询指定条件下 所有 数据 列表
      以上方法的查询出的单条数据都以 Map 对象呈现

    只在 BeanSearcher 内的方法#

    • search(Class beanClass, Map<String, Object> params): SearchResult 分页 查询指定条件下数据 列表 与 总条数
    • search(Class beanClass, Map<String, Object> params, String[] summaryFields): SearchResult 同上 + 多字段 统计
    • searchFirst(Class beanClass, Map<String, Object> params): T 查询指定条件下的 第一条 数据
    • searchList(Class beanClass, Map<String, Object> params): List 分页 查询指定条件下数据 列表
    • searchAll(Class beanClass, Map<String, Object> params): List 查询指定条件下 所有 数据 列表

    三、查询

    比如你已经有如下的实体:

    public class User {             // 默认映射到 user 表
    
        private Long id;            // 默认映射到 id 字段
        private String name;        // 默认映射到 name 字段
        private int age;            // 默认映射到 age 字段
    
        // Getter and Setter ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    开始检索

    有了实体类后,接下来我们便用 MapSearcher 的 search(Class beanClass, Map<String, Object> params): SearchResult<Map<String, Object>> 方法来体验一下如何 只用一行代码 实现一个检索接口,代码如下:

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private MapSearcher mapSearcher;              // 注入 BeanSearcher 的检索器
    
        @GetMapping("/index")
        public SearchResult<Map<String, Object>> index(HttpServletRequest request) {
            // 一行代码,实现一个用户检索接口(MapUtils.flat 只是收集前端的请求参数)
            return mapSearcher.search(User.class, MapUtils.flat(request.getParameterMap()));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码解析

    上面的 MapUtils 是 Bean Searcher 提供的一个工具类,MapUtils.flat(request.getParameterMap()) 只是为了把前端传来的请求参数统一收集起来,然后剩下的,就全部交给 MapSearcher 检索器了。
    当然不直接从 request 里取参数也是可以的,只是代码这么写看起来比较简洁。

    上面的代码,实现了一个 /user/index 接口,它的方法体里真的只有一行代码,但这个接口能支持哪些请求参数呢?不同的请求参数又能输出怎样的结果呢,接下来让我们来简单列举一下:

    (1)无参请求

    • GET /user/index
    • 返回结果:
    {
        "dataList": [           // 用户列表,默认返回第 1 页,默认分页大小为 15 (可配置)
            { "id": 1, "name": "Jack", "age": 25 },,,
        ],
        "totalCount": 100       // 用户总数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (1)无参请求

    • GET /user/index
    • 返回结果:
    {
        "dataList": [           // 用户列表,默认返回第 1 页,默认分页大小为 15 (可配置)
            { "id": 1, "name": "Jack", "age": 25 },,,
        ],
        "totalCount": 100       // 用户总数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)分页请求(page | size)

    • GET /user/index? page=2 & size=10
    • 返回结果:结构同 (1)(只是每页 10 条,返回第 2 页)
    TIP
    
    参数名 size 和 page 可自定义, page 默认从 0 开始,同样可自定义,并且可与其它参数组合使用
    
    • 1
    • 2
    • 3

    (3)数据排序(sort | order)

    • GET /user/index? sort=age & order=desc
    • 返回结果:结构同 (1)(只是 dataList 数据列表以 age 字段降序输出)
    TIP
    
    参数名 sort 和 order 可自定义,可和其它参数组合使用
    
    • 1
    • 2
    • 3

    (4)指定(排除)字段(onlySelect | selectExclude)

    • GET /user/index? onlySelect=id,name
    • GET /user/index? selectExclude=age
    • 返回结果:( dataList 数据列表只含 id 与 name 字段)
    {
        "dataList": [           // 用户列表,默认返回第 1 页(只包含 id 和 name 字段)
            { "id": 1, "name": "Jack" },,,
        ],
        "totalCount": 100       // 用户总数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (5)字段过滤( [field]-op=eq )

    • GET /user/index? age=20
    • GET /user/index? age=20 & age-op=eq
    • 返回结果:
    TIP
    
    参数 age-op=eq 表示 age 的 字段运算符 是 eq(Equal 的缩写),表示参数 age 与参数值 20 之间的关系是 Equal,由于 Equal 是一个默认的关系,所以 age-op=eq 也可以省略
    
    参数名 age-op 的后缀 -op 可自定义,且可与其它字段参数 和 上文所列的参数(分页、排序、指定字段)组合使用,下文所列的字段参数也是一样,不再复述。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (6)等等等…

    四、进阶

    查看官网吧,太多了,写累了。官网

  • 相关阅读:
    基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作
    [计组03]进程详解2
    字符与数字的相互转换
    MQTT协议是什么?快速了解MQTT协议在物联网中的应用
    Nexus【应用 01】上传jar包到私有Maven仓库的两种方法:手动 Upload 和 mvn deploy 命令(配置+操作流程)
    文本分类方案,飞浆PaddleNLP涵盖了所有
    相机快门之:电子快门
    Testng+java+chromedriver
    Vue-router 路由间参数传递看完让你明明白白!
    低功耗、高性能处理器RK3326、RK3308、RK2206、RK2108芯片可广泛应用于各种产品领域。
  • 原文地址:https://blog.csdn.net/student_zz/article/details/125546835