🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝
文章目录
一、Bean Searcher简介
官网
:https://bs.zhxu.cn/
Bean Searcher
是一个轻量级 数据库 条件检索引擎,它的作用是从已有的数据库表中检索数据,它的目的是为了减少后端模板代码的开发,极大提高开发效率,节省开发时间,使得一行代码完成一个列表查询接口成为可能!
不依赖具体的 Web 框架(即可以在任意的 Java Web 框架内使用)
不依赖具体的 ORM 框架(即可以与任意的 ORM 框架配合使用,没有 ORM 也可单独使用)
与 Hibernate MyBatis 的区别
区别点 | Bean Searcher | Hibernate | MyBatis |
---|---|---|---|
ORM | 只读 ORM | 全自动 ORM | 半自动 ORM |
实体类可多表映射 | ✔️ 支持 | ❌ 不支持 | ❌ 不支持 |
字段运算符 | 动态 | 静态 | 静态 |
CRUD | Only R(仅查询) | CRUD(全功能) | CRUD(全功能) |
推荐的使用场景
推荐在非事务性的动态检索场景中使用
二、Spring Boot项目中使用Bean Searcher
2.1 添加依赖
<!-- SpringBoot / Grails 的项目直接使用以下依赖 -->
<dependency>
<groupId>cn.zhxu</groupId>
<artifactId>bean-searcher-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
2.2 添加yml
因为查询第一页前端默认传page:1 size:10,所以我们自定义开始为1
# beanSearcher默认配置项
bean-searcher:
params:
pagination:
max-allowed-size: 5000
start: 1
2.3 定义实体类(映射数据库表)
使用 @SearchBean 和 @DbField 注解:
@Data
@AllArgsConstructor
@NoArgsConstructor
@SearchBean(tables = "user") // 指定表名
public class UserVO {
@DbField("id") // 映射数据库字段
private Long id;
@DbField("name")
private String name;
@DbField("age")
private Integer age;
.......
}
2.4 controller
/**
* 分页数据
*
* @param params 入参
* @return CommonResponse<SearchResult<UserVO>> 返回值
**/
@GetMapping("/beanSearchPage")
public CommonResponse<SearchResult<UserVO>> beanSearchPage(@RequestParam Map<String, Object> params) {
return CommonResponse.ok(this.entryVehicleService.beanSearchPage(params));
}
2.5 Service
/**
* 获取VO数据
*
* @param params 入参
* @return SearchResult<UserVO> 返回值
*/
SearchResult<UserVO> beanSearchPage(Map<String, Object> params);
2.5 ServiceImpl
@Autowired注入BeanSearcher 或者构造器注入都可以
@Slf4j
@Service("entryVehicleService")
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{
/*
* 构造器注入
*/
private final BeanSearcher beanSearcher;
/**
* 获取VO数据
*
* @param params 入参
* @return SearchResult<EntryVehicleVO> 返回值
*/
@Override
public SearchResult<UserVO> beanSearchPage(Map<String, Object> params) {
SearchResult<UserVO> search = beanSearcher.search(EntryVehicleVO.class, params);
return search;
}
}
三、扩展
3.1 SQL 日志打印
logging:
level:
cn.zhxu.bs: DEBUG
3.2 常用方法
当在项目中成功集成后,接下来便可以在我们的业务代码(Controller 或 Service)中拿到检索器实例了。 可以直接注入:
/**
* 注入 Map 检索器,它检索出来的数据以 Map 对象呈现
*/
@Autowired
private MapSearcher mapSearcher;
/**
* 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现
*/
@Autowired
private BeanSearcher beanSearcher;
3.2.1 共同拥有的方法(MapSearcher 和 BeanSearcher)
方法签名 | 返回值 | 说明 |
---|---|---|
searchCount(Class<T> beanClass, Map<String, Object> params) | Number | 查询指定条件下的数据总条数 |
searchSum(Class<T> beanClass, Map<String, Object> params, String field) | Number | 查询指定条件下某字段的统计值 |
searchSum(Class<T> beanClass, Map<String, Object> params, String[] fields) | Number[] | 查询指定条件下多字段的统计值 |
检索参数说明:
params
是一个条件集合,包含字段过滤、分页、排序等参数
3.2.2 仅在 MapSearcher 中的方法
方法签名 | 返回值 | 说明 |
---|---|---|
search(Class<T> beanClass, Map<String, Object> params) | SearchResult<Map<String, Object>> | 分页查询(返回列表+总条数) |
search(Class<T> beanClass, Map<String, Object> params, String[] summaryFields) | SearchResult<Map<String, Object>> | 分页查询+多字段统计 |
searchFirst(Class<T> beanClass, Map<String, Object> params) | Map<String, Object> | 查询指定条件下的第一条数据 |
searchList(Class<T> beanClass, Map<String, Object> params) | List<Map<String, Object>> | 分页查询数据列表 |
searchAll(Class<T> beanClass, Map<String, Object> params) | List<Map<String, Object>> | 查询指定条件下所有数据 |
数据格式:以上方法查询出的单条数据都以
Map
对象呈现
3.2.3 仅在 BeanSearcher 中的方法
方法签名 | 返回值 | 说明 |
---|---|---|
search(Class<T> beanClass, Map<String, Object> params) | SearchResult<T> | 分页查询(返回列表+总条数) |
search(Class<T> beanClass, Map<String, Object> params, String[] summaryFields) | SearchResult<T> | 分页查询+多字段统计 |
searchFirst(Class<T> beanClass, Map<String, Object> params) | T | 查询指定条件下的第一条数据 |
searchList(Class<T> beanClass, Map<String, Object> params) | List<T> | 分页查询数据列表 |
searchAll(Class<T> beanClass, Map<String, Object> params) | List<T> | 查询指定条件下所有数据 |
数据格式:以上方法查询出的单条数据都以泛型
T
对象呈现
3.3 高级查询(多表关联)
@SearchBean(
tables = "user u LEFT JOIN department d ON u.dept_id = d.id", // LEFT JOIN 语法
autoMapTo = "u" // 结果默认映射到 user 表的字段
)
public class UserDeptVO {
// 用户表字段
@DbField("u.id")
private Long userId;
@DbField("u.name")
private String userName;
@DbField("u.age")
private Integer age;
// 部门表字段(LEFT JOIN 可能为 null)
@DbField("d.id")
private Long deptId;
@DbField("d.name")
private String deptName;
// Getter & Setter ...
}