大家好,我是苏三,又跟大家见面了。
文末留言送书啦!!!这本书最近非常火!!!
原文:gitee.com/ejlchina-zhxu/bean-searcher
1、开源项目简介
bean-searcher 是一款比 MyBatis 效率快 100 倍的条件检索引擎,专注高级查询的只读 ORM,天生支持联表,免 DTO/VO 转换,使一行代码实现复杂列表检索成为可能!
最近整理了一份10万字的面试宝典,可以免费送给大家,获取方式加我微信:su_san_java,备注:面试。
2、开源协议
使用Apache-2.0开源协议
2、开源协议
使用Apache-2.0开源协议
3、界面展示
3、界面展示
检索结果分页展示 可以按任意字段排序 按检索条件统计某些字段值
支持 实体多表映射 支持 动态字段运算符 支持 分组聚合 查询 支持 Select | Where | From 子查询 支持 实体类嵌入参数 支持 字段转换器 支持 Sql 拦截器 支持 数据库 Dialect 扩展 支持 多数据源 与 动态数据源 支持 注解缺省 与 自定义 支持 字段运算符 扩展 等等
快速开发
使用 Bean Searcher 可以极大节省后端的复杂列表检索接口的开发时间
集成简单
扩展性强
支持 注解缺省
支持 多数据源
支持 Select 指定字段
支持 参数过滤器
支持 字段转换器
支持 SQL 拦截器
框架目的:只一行代码实现:多表联查分页搜索任意字段组合过滤任意字段排序多字段统计 架构图:
这绝不是一个重复的轮子
例如,这样的一个典型的需求:
只一行代码实现以上功能
@SearchBean(tables="user u, role r", joinCond="u.role_id = r.id", autoMapTo="u")
public class User {
private long id;
private String username;
private int status;
private int age;
private String gender;
private Date joinDate;
private int roleId;
@DbField("r.name")
private String roleName;
// Getters and setters...
}然后你就可以用一行代码实现这个用户检索接口:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private BeanSearcher beanSearcher; // 注入 BeanSearcher 的检索器
@GetMapping("/index")
public SearchResult<User> index(HttpServletRequest request) {
// 这里只写一行代码
return beanSearcher.search(User.class, MapUtils.flat(request.getParameterMap()), new String[]{ "age" });
}
}
多表联查 分页搜索 组合过滤 任意字段排序 字段统计
GET: /user/index 无参请求(默认分页): { "dataList": [ { "id": 1, "username": "Jack", "status": 1, "level": 1, "age": 25, "gender": "Male", "joinDate": "2021-10-01" }, ... // 默认返回 15 条数据 ], "totalCount": 100, "summaries": [ 2500 // age 字段统计 ] } GET: /user/index? page=1 & size=10 指定分页参数 GET: /user/index? status=1 返回 status = 1 的用户 GET: /user/index? name=Jac & name-op=sw 返回 name 已 Jac 开头的用户 GET: /user/index? name=Jack & name-ic=true 返回 name = Jack(忽略大小写)的用户 GET: /user/index? sort=age & order=desc 按字段 age 降序查询 GET: /user/index? onlySelect=username,age 只检索 username 与 age 两个字段: { "dataList": [ { "username": "Jack", "age": 25 }, ... ], "totalCount": 100, "summaries": [ 2500 ] } GET: /user/index? selectExclude=joinDate 检索时排除 joinDate 字段
参数构建器
Map<String, Object> params = MapUtils.builder()
.selectExclude(User::getJoinDate) // 排除 joinDate 字段
.field(User::getStatus, 1) // 过滤:status = 1
.field(User::getName, "Jack").ic() // 过滤:name = 'Jack' (case ignored)
.field(User::getAge, 20, 30).op(Opetator.Between) // 过滤:age between 20 and 30
.orderBy(User::getAge, "asc") // 排序:年龄,从小到大
.page(0, 15) // 分页:第 0 页, 每页 15 条
.build();
List<User> users = beanSearcher.searchList(User.class, params);
普通的复杂列表查询只需一行代码 单表检索可复用原有 Domain,无需定义 SearchBean
集成简单
Spring Boot 项目,添加依赖即集成完毕:
implementation 'com.ejlchina:bean-searcher-boot-stater:3.6.0'
/**
* 注入 Map 检索器,它检索出来的数据以 Map 对象呈现
*/
@Autowired
private MapSearcher mapSearcher;
/**
* 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现
*/
@Autowired
private BeanSearcher beanSearcher;
其它框架,使用如下依赖:
implementation 'com.ejlchina:bean-searcher:3.6.0'
DataSource dataSource = ... // 拿到应用的数据源
// DefaultSqlExecutor 也支持多数据源
SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource);
// 构建 Map 检索器
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
.sqlExecutor(sqlExecutor)
.build();
// 构建 Bean 检索器
BeanSearcher beanSearcher = SearcherBuilder.beanSearcher()
.sqlExecutor(sqlExecutor)
.build();
自定义 FieldOp 来支持更多的字段运算符 自定义 FieldConvertor 来支持任意的 特殊字段类型 自定义 DbMapping 来实现自定义注解,或让 Bean Searcher 识别其它 ORM 的注解 自定义 ParamResolver 来支持其它形式的检索参数 自定义 Dialect 来支持更多的数据库 等等..
文末送书
为了感谢一路支持苏三的小伙们,今天特地给大家送一点小福利。规则非常简单:在本文留言,按点赞数量排名,点赞数量最多的前3位,每人获取1本书。参与者:最近3次公众号上未获奖的小伙伴。(你可以发朋友圈集赞,或者发微信群集赞。但不能在最后1小时内疯狂拉票,此外,如果发现有人用机器刷点赞数,立即取消资格,并且拉黑)
后面我会朋友圈公布中奖名单,给你免费包邮到家!这些书是由清华大学出版社提供的,感谢赞助。
《设计原本》
如果说《人月神话》是近40年来所有软件开发工程师和项目经理们必读的一本书,那么《设计原本》将会是未来数十年内所有软硬件设计师、架构师和软件开发工程师们必读的一本书。
《设计原本》是《人月神话》作者、著名计算机科学家、软件工程教父、美国两院院士、图灵奖和IEEE计算机先驱奖得主Brooks在计算机软硬件架构与设计、建筑和组织机构的架构与设计等领域毕生经验的结晶,是计算机图书领域的又一部史诗级著作。
本书从工程师和架构师的视角深入地探讨了设计的过程,尤其是复杂系统的设计过程,旨在提高产品的实用性与有效性,以及设计的效率和优雅性。
全书共28章,分为6个部分:第一部分(1~5章)主要讨论了什么是设计、设计过程的思考、设计的类别、理性模型及其缺陷,以及对一些好的设计过程模型的探讨;第二部分(6~7章)主要讨论了协作设计与远程协作;第三部分(8~16章)全面总结了设计中的各种原则、经验和教训,包括设计中的理性主义与实证主义、用户模型、资源预算、约束、设计中的美学与风格、设计中的范本、设计的分离、设计的演变途径和理由,以及专业设计者为何会犯错;第四部分(17~18章)探讨了建筑设计与计算机软硬件设计在设计思想和方法上的一些共同点和不同之处;第五部分(19~20章)探讨了卓越的设计和卓越的设计师之间的关系,以及如何培养卓越的设计师;第六部分(21~28章)对各个领域的各种类型的案例进行了分析和研究,旨在深刻揭示隐藏在这些案例背后不变的设计过程和思想。
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:面试、代码神器、开发手册、时间管理有超赞的粉丝福利,另外回复:加群,可以跟很多BAT大厂的前辈交流和学习。