1、引入依赖
<dependency>
<groupId>cn.zhxu</groupId>
<artifactId>bean-searcher-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
2、定义实体类
- autoMapTo: 若不指定别名,自动映射的表
- orderBy:排序字段,如果数据量大,不建议加,因为他是全表排序后再取页数
- JsonFormat:日期格式化
@SearchBean(tables = "staff_dict s left join dept_dict d on d.dept_code=s.dept_code",
autoMapTo = "s",
orderBy="name",
sortType = SortType.ALLOW_PARAM)
@Data
public class Staff {
private String empNo;
private String name;
private String userName;
@DbField("getpwd(password)")
private String password;
@DbField("d.dept_name")
private String deptName;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createDate;
}
3、controller
@RestController
@RequestMapping("emp")
public class TestController {
@Autowired
private BeanSearcher beanSearcher;
@GetMapping("index")
public Object list(@RequestParam Map<String, Object> params){
// 组合检索、排序、分页 和 统计 都在这一句代码中实现了
return beanSearcher.search(Emp.class, params, Emp::getSal);
}
@GetMapping("staff")
public Object staff(@RequestParam Map<String, Object> params){
// 组合检索、排序、分页 和 统计 都在这一句代码中实现了
return beanSearcher.search(Staff.class, params,Staff::getEmpNo);
}
}
4、生成的sql
select *
from (select row_.*, rownum rownum_
from (select s.emp_no c_0,
s.name c_1,
s.user_name c_2,
getpwd(password) c_3,
d.dept_name c_4
from staff_dict s
left join dept_dict d
on d.dept_code = s.dept_code
order by name) row_
where rownum <= 30) table_
where table_.rownum_ > 10
5、返回值
{
"totalCount": 893,
"dataList": [
{
"empNo": "1012",
"name": "张三",
"userName": "1012",
"password": "1",
"deptName": "外科疗区",
"createDate": "2022-04-13 17:12:56"
}
],
"summaries": [
2322726
]
}
6、注意点
- 指定起始页,不配置默认为0,这里配置为1,是为了兼容element UI的分页组件
- 默认分页使用的是mysql,其他分页请指定方言
bean-searcher:
params:
pagination:
# 起始页,不配置默认为0,这里配置为1,是为了兼容element UI的分页组件
start: 1
sql:
dialect: Oracle
7、请求简写说明
配置键名 | 含义 | 可选值 |
---|---|---|
bean-searcher.params.separator | 字段参数名分隔符 字符串 | - |
bean-searcher.params.operator-key | 字段运算符参数名后缀字符串 | op |
bean-searcher.params.ignore-case-key | 是否忽略大小写字段参数名后缀 字符串 | ic |
// 更多参考 https://bs.zhxu.cn/guide/latest/params.html#%E5%AD%97%E6%AE%B5%E8%BF%90%E7%AE%97%E7%AC%A6
numOps: [
{ key: 'eq', label: '等于',english:'Equal'},
{ key: 'ne', label: '不等于',english:'NotEqual'},
{ key: 'gt', label: '大于',english:'GreateThan'},
{ key: 'lt', label: '小于',english:'LessThan'},
{ key: 'ge', label: '大于等于',english:'GreateEqual'},
{ key: 'le', label: '小于等于',english:'LessEqual'},
{ key: 'bt', label: '区间',english:'Between'},
{ key: 'in', label: '包含',english:'in'},
{ key: 'ct', label: '包含',english:'Contain'},
{ key: 'ey', label: '空 或 null',english:'Empty'},
{ key: 'ny', label: '非空',english:'NotEmpty'},
{ key: 'sw', label: '以...开始',english:'StartWith'},
{ key: 'ew', label: '以...结束',english:'EndWith'}
],
8、请求格式
- GET /user/index:无参数,默认返回第 1 页,默认分页大小为 15 (可配置)
bean-searcher.params.pagination.page
和bean-searcher.params.pagination.size
- GET /user/index? page=2 & size=10 返回结果:结构同 (1)(只是每页 10 条,返回第 2 页)
- GET /user/index? sort=age & order=desc 返回结果:结构同 (1)(只是 dataList 数据列表以 age 字段降序输出)
- GET /user/index? age=20 & age-op=eq 返回结果:结构同 (1)(但只返回 age=20 的数据) age-op=eq 也可以省略
- GET /user/index? age=20 & age-op=ne 返回结果:结构同 (1)(但只返回 age != 20 的数据,ne 是 NotEqual 的缩写)
- GET /user/index? age-0=20 & age-1=30 & age-op=bt 返回结果:结构同 (1)(但只返回 20 <= age <= 30 的数据,bt 是 Between 的缩写)
- GET /user/index? age-0=20 & age-1=30 & age-2=40 & age-op=il 返回结果:结构同 (1)(但只返回 age in (20, 30, 40) 的数据,il 是 InList 的缩写)
- GET /user/index? name-op=ey 返回结果:结构同 (1)(但只返回 name 为空 或为 null 的数据,ey 是 Empty 的缩写)
- GET /user/index? name=Jack & name-ic=true 返回结果:结构同 (1)(但只返回 name 等于 Jack (忽略大小写) 的数据,ic 是 IgnoreCase 的缩写)
9、打印日志
- 包名必须为:cn.zhxu.bs 不能修改
logging:
level:
cn.zhxu.bs: DEBUG
- 如果需要日志文件也打印,配置logback.xml
<logger name="cn.zhxu.bs" level="DEBUG" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="file" />
</logger>
10、其他检索
- searchAll:所有数据 []
- searchCount:数据量 纯数值
- searchSum:求和 纯数值
- search:带分页的查询(包含数据总数以及合计域)
- searchList:带分页的查询,返回值是数据集的数组 []
- searchFirst:返回满足条件的第一条,{}