Bean Search 超级好用的搜索工具

发布时间 2023-05-21 19:12:59作者: his365

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、请求格式

  1. GET /user/index:无参数,默认返回第 1 页,默认分页大小为 15 (可配置)bean-searcher.params.pagination.pagebean-searcher.params.pagination.size
  2. GET /user/index? page=2 & size=10 返回结果:结构同 (1)(只是每页 10 条,返回第 2 页)
  3. GET /user/index? sort=age & order=desc 返回结果:结构同 (1)(只是 dataList 数据列表以 age 字段降序输出)
  4. GET /user/index? age=20 & age-op=eq 返回结果:结构同 (1)(但只返回 age=20 的数据) age-op=eq 也可以省略
  5. GET /user/index? age=20 & age-op=ne 返回结果:结构同 (1)(但只返回 age != 20 的数据,ne 是 NotEqual 的缩写)
  6. GET /user/index? age-0=20 & age-1=30 & age-op=bt 返回结果:结构同 (1)(但只返回 20 <= age <= 30 的数据,bt 是 Between 的缩写)
  7. GET /user/index? age-0=20 & age-1=30 & age-2=40 & age-op=il 返回结果:结构同 (1)(但只返回 age in (20, 30, 40) 的数据,il 是 InList 的缩写)
  8. GET /user/index? name-op=ey 返回结果:结构同 (1)(但只返回 name 为空 或为 null 的数据,ey 是 Empty 的缩写)
  9. 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:带分页的查询,返回值是数据集的数组