官方文档介绍 | 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)
方法区别:
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);