超好用的数据库检索工具介绍——Bean Searcher
超好用的数据库检索工具介绍——Bean Searcher
超好用的数据库检索工具介绍——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)等等等…
四、进阶
查看官网吧,太多了,写累了。官网
更多推荐
所有评论(0)