Bean Searcher列表查询其实只需要一行代码

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

一、Bean Searcher简介

官网:https://bs.zhxu.cn/

Bean Searcher 是一个轻量级 数据库 条件检索引擎,它的作用是从已有的数据库表中检索数据,它的目的是为了减少后端模板代码的开发,极大提高开发效率,节省开发时间,使得一行代码完成一个列表查询接口成为可能!

不依赖具体的 Web 框架(即可以在任意的 Java Web 框架内使用)
不依赖具体的 ORM 框架(即可以与任意的 ORM 框架配合使用,没有 ORM 也可单独使用)

与 Hibernate MyBatis 的区别

区别点Bean SearcherHibernateMyBatis
ORM只读 ORM全自动 ORM半自动 ORM
实体类可多表映射✔️ 支持❌ 不支持❌ 不支持
字段运算符动态静态静态
CRUDOnly 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 ...
}

3.4 其他使用方法请查看官方文档

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_sky分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值