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

一、介绍

	Bean Searcher与我们常用的mybatis、tk等有类似之处,但也有区别,具体如下:
	
	相同点:
	
		* 都是orm框架
		* 都用于查询数据

	不同点:
		* Bean Searcher只用于查询
		* 且简洁高效
		* 能轻松完成众多复杂查询

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

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

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

试想一下,对于这种要求的查询,后端接口里的代码如果用 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>

springboot直接导入以下依赖:

<dependency>
    <groupId>com.ejlchina</groupId>
    <artifactId>bean-searcher-boot-starter</artifactId>
    <version>3.7.1</version>
</dependency>

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

	/**
	 * 注入 Map 检索器,它检索出来的数据以 Map 对象呈现
	 */
	@Autowired
	private MapSearcher mapSearcher;
	/**
	 * 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现
	 */
	@Autowired
	private BeanSearcher beanSearcher;

共同拥有的方法#

  • 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 ...
}

开始检索

有了实体类后,接下来我们便用 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()));
    }
}

代码解析

上面的 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)无参请求

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

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

  • GET /user/index? page=2 & size=10
  • 返回结果:结构同 (1)(只是每页 10 条,返回第 2 页)
TIP

参数名 size 和 page 可自定义, page 默认从 0 开始,同样可自定义,并且可与其它参数组合使用

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

  • GET /user/index? sort=age & order=desc
  • 返回结果:结构同 (1)(只是 dataList 数据列表以 age 字段降序输出)
TIP

参数名 sort 和 order 可自定义,可和其它参数组合使用

(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       // 用户总数
}

(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 可自定义,且可与其它字段参数 和 上文所列的参数(分页、排序、指定字段)组合使用,下文所列的字段参数也是一样,不再复述。

(6)等等等…

四、进阶

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐