BeanSearcher的使用

本文介绍了BeanSearcher框架如何提高多表联查的便捷性,包括创建SearchBean、依赖导入、各种检索方法(如分页、分组、排序和字段过滤),以及前端请求参数的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档介绍 | Bean Searcher (zhxu.cn)

使用场景

提高多表联查的便捷性,关键在与定义searchbean(展示数据的最大范围,查询参数这些都是在缩短范围)

起步 | Bean Searcher (zhxu.cn)

导入依赖

<dependency>

 <groupId>cn.zhxu</groupId>

 <artifactId>bean-searcher-boot-starter</artifactId>

 <version>4.1.2</version>

</dependency>

创建searchBean

@SearchBean(

  tables = "user_address ua,eshop_user u",/*该类的数据来自哪些表*/

​    where = "ua.uid=u.uid",/*连接条件*/

​    autoMapTo = "ua" /*未被@DbField注解的属性,全部与ua表映射*/

)

@Data

public class UserAddress {

  /*收货人信息*/

  private String realName;

  /*收货人手机号*/

  private String phone;

 

  /*

  @DbField可以填表的字段名、聚合函数、查询结果

  */

 

  /*收货人地址ua.province+ua.city+ua.district*/

  @DbField("select concat(province,city,district) from user_address where user_address.id=ua.id ")

  private String address;

 

  /*收货人的账号*/

  @DbField("u.username")

  private String username;

  /*收货人昵称*/

  @DbField("u.nickname")

  private String nickname;

  /*当前余额*/

  @DbField("u.now_money")

  private BigDecimal nowMoney;

}

注入检索器

各个检索器方法参考:起步 | Bean Searcher (zhxu.cn)

截图.png

方法区别:

search 分页 查询指定条件下数据 列表 与 总条数

searchFirst 查询第一条

searchAll 查询所有符合条件数据

searchList 分页查询列表

searchSum 统计某字段和

searchCount统计某字段条数

/**

 \* 注入 Map 检索器,它检索出来的数据以 Map 对象呈现

 */

@Autowired

private MapSearcher mapSearcher;

/**

 \* 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现

 */

@Autowired

private BeanSearcher beanSearcher;

功能

分组

例:查询姓胡的住北京或者姓张的住河北

前端请求参数:

localhost:8080/test?A.realName=胡&A.address=北京&B.realName=张&B.address=河北&A.realName-op=ct&A.address-op=ct&B.realName-op=ct&B.address-op=ct&gexpr=A%7CB

由于 & 与 | 是特殊字符,所以在 RUL 中,参数 gexpr 的值需要 URLEncode 编码一下

&:%7C

|:%26

@GetMapping("/test")

public SearchResult<UserAddress> test(HttpServletRequest request){

  Map<String, Object> build = MapUtils.flatBuilder(request.getParameterMap())

 

      .build();

  SearchResult<UserAddress> result = beanSearcher.search(UserAddress.class, build);

 

  return result;

 

}

只使用后台编码方式

/*

\* 姓胡的住北京。姓张的住河北

\* */

@GetMapping("/like")

public SearchResult<UserAddress> like(HttpServletRequest request){

  Map<String, Object> build = MapUtils.flatBuilder(request.getParameterMap()).group("A").field(UserAddress::getRealName,"胡").op(Contain.class).field(UserAddress::getAddress,"北京").op(Contain.class).group("B").field(UserAddress::getRealName,"张").op(Contain.class).field(UserAddress::getAddress,"河北").op(Contain.class).groupExpr("A|B").build();return beanSearcher.search(UserAddress.class,build);

}
分页
GET /user/index? page=2 & size=10

or

Map<String, Object> params = MapUtils.builder()

​    .page(2, 10)

​    .build();

// 执行 1 条 SQL

List<User> users = searcher.searchList(User.class, params);

// 执行一条 SQL,默认查询 15 条数据

List<User> users = searcher.searchList(User.class, null);
排序
GET /user/index? sort=now_money & order=desc

or

 

  Map<String, Object> build = MapUtils.builder()

​      .orderBy(UserAddress::getNowMoney,"desc")

​      .build();

  SearchResult<UserAddress> result = beanSearcher.search(UserAddress.class, build);
选择与排除字段
GET /user/index? onlySelect=id,name #选择

GET /user/index? selectExclude=age  #排除

or

/**

 \* 选择字段

 */

@GetMapping("/select")

public SearchResult<UserAddress> select(){

  Map<String, Object> build = MapUtils.builder()

​      .onlySelect(UserAddress::getAddress,UserAddress::getRealName)

​      .build();

  return beanSearcher.search(UserAddress.class,build);

}

 

/**

 \* 排除字段

 */

@GetMapping("/exclude")

public SearchResult<UserAddress> exclude(){

  Map<String, Object> build = MapUtils.builder()

​      .selectExclude(UserAddress::getAddress,UserAddress::getRealName)

​      .build();

  return beanSearcher.search(UserAddress.class,build);

}
字段过滤

例:

GET /user/index? age-0=20 & age-1=30 & age-op=bt

or

 

Map<String, Object> build = MapUtils.builder()

​    .field("xxx").op("xxx")

​    .build();

 beanSearcher.search(UserAddress.class,build);

参数参考:检索参数 | Bean Searcher (zhxu.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值