1、Bean Searcher 是什么?
Bean Searcher 是一个轻量级 数据库 条件检索引擎,它的作用是从已有的数据库表中检索数据,专注高级查询的只读 ORM,天生支持联表,免 DTO/VO 转换,使一行代码实现复杂列表检索成为可能!
2、为什么要使用 Bean Searcher?
产品给你画了一张图,还附带了一些要求:
- 检索结果分页展示
- 可以按任意字段排序
- 按检索条件统计某些字段值
这时候,后台接口该怎么写???使用 Mybatis 或 Hibernate 写100行代码是不是还打不住?而使用 BeanSearcher,仅需一行代码便可实现上述要求!!!
3、架构设计图
4、与 Hibernate MyBatis 的区别
首先,Bean Searcher 并不是一个完全的 ORM 框架,它存在的目的不是为了替换他们,而是为了弥补他们在列表检索领域
的不足。
下表列举它们之间的具体区别:
区别点 | Bean Searcher | Hibernate | MyBatis |
---|---|---|---|
ORM | 只读 ORM | 全自动 ORM | 半自动 ORM |
实体类可多表映射 | 支持 | 不支持 | 不支持 |
字段运算符 | 动态 | 静态 | 静态 |
CRUD | Only R | CRUD | CRUD |
从上表可以看出,Bean Searcher 只能做数据库查询,不支持 增删改。但它的 多表映射机制 与 动态字段运算符,可以让我们在做复杂列表检索时代码 以一当十,甚至 以一当百。
更关键的是,它无第三方依赖,在项目中可以和 任意 ORM 配合 使用。
5、具体使用方法
5.1、导入依赖
<!-- Bean Searcher 核心依赖,任何框架都可使用该依赖 -->
<dependency>
<groupId>cn.zhxu</groupId>
<artifactId>bean-searcher</artifactId>
<version>4.1.2</version>
</dependency>
5.2、配置数据源
- 在spring核心配置文件加入
<!-- 声明 BeanSearcher 检索器,它查询的结果是 SearchBean 泛型对象 -->
<bean id="beanSearcher" class="cn.zhxu.bs.implement.DefaultBeanSearcher" p:sqlExecutor-ref="sqlExecutor"/>
<!-- 声明 MapSearcher 检索器,它查询的结果是 Map 对象 -->
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher" p:sqlExecutor-ref="sqlExecutor"/>
<bean id="sqlExecutor" class="cn.zhxu.bs.implement.DefaultSqlExecutor" p:dataSource-ref="dataSource">
<!-- 配置慢 SQL 阈值 -->
<property name="slowSqlThreshold" value="500"/>
</bean>
5.4 、编写实体类
- Book.java
package com.llh.domain;
import cn.zhxu.bs.bean.DbField;
import cn.zhxu.bs.bean.SearchBean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName book
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@SearchBean(tables = "book b left join btype t on b.tid = t.tid",autoMapTo = "b")
public class Book implements Serializable {
/**
* 图书id
*/
private Integer bid;
/**
* 图书名称
*/
private String bname;
/**
* 图书价格
*/
private Double price;
/**
* 发布日期
*/
private Date publishdate;
/**
* 作者名称
*/
private String author;
/**
* 备注
*/
private String descp;
/**
* 图书类型id
*/
private Integer tid;
/**
* 图书类型名称
*/
@DbField("t.tname") // 字段映射
private String tname;
private static final long serialVersionUID = 1L;
}
- 本例是使用
@SearchBean
注解的tables
属性实现左外连接,可以很容易的指定多张表的关联关系。 - 本例实体类只是使用其中一种方式来进行关联,详情可以前往检索实体类了解
5.3、编写业务层
- 因为是只读 ORM,不需要DAO层,编写查询所有方法接口
- BookService.java
package com.llh.service;
import cn.zhxu.bs.SearchResult;
import com.llh.domain.Book;
import java.util.Map;
/**
* User: lilinhan
* DateTime: 2023/5/27 9:14
*/
public interface BookService {
SearchResult<Book> getBooks(Map<String,Object> map);
}
- 这里的返回值必须是 SearchResult,由于我们涉及到分页,方法里只需要传入一个map集合,就能实现查询所有功能了!点进去会有很多方法,自行研究吧
- BookServiceImpl.java
package com.llh.service.Impl;
import cn.zhxu.bs.BeanSearcher;
import cn.zhxu.bs.SearchResult;
import com.llh.domain.Book;
import com.llh.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* User: lilinhan
* DateTime: 2023/5/27 9:14
*/
@Service
public class BookServiceImpl implements BookService {
// 注入 BeanSearcher
@Autowired
BeanSearcher beanSearcher;
@Override
public SearchResult<Book> getBooks(Map<String, Object> map) {
return beanSearcher.search(Book.class,map);
}
}
返回BeanSearcher
的search
方法,有两个参数:
- beanClass – 要检索的 bean 类型
- paraMap – 检索参数
传入实体类的 class 对象和map集合
5.4、编写测试类
- TestBook.java
package com.llh.test;
import cn.zhxu.bs.operator.Between;
import cn.zhxu.bs.operator.Contain;
import cn.zhxu.bs.util.MapUtils;
import com.llh.domain.Book;
import com.llh.mapper.BookMapper;
import com.llh.service.BookService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* User: lilinhan
* DateTime: 2023/5/26 9:27
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-ioc.xml")
public class TestBook {
@Autowired
BookService bookService;
@Test
public void testList() {
Map<String, Object> map = MapUtils.builder()
.build();
// 获取 SearchResult 方法的list集合
List<Book> books = bookService.getBooks(map).getDataList();
for (Book book : books) {
System.out.println(book);
}
}
}
- 效果如下:
5.5、高级查询
- 测试一下,图书名称里包含“十”、价格在100-300之间、按照价格降序排序、分页三条数据,结果如下:
- 可以发现,我们在没有写任何一条 SQL语句的时候,BeanSearcher 已经在内部为我们解析好了。这里面有很多很多约束,包括表约束、字段约束、参数约束..等等,甚至还有风控参数!你所能想到的所有sql条件,这里全都有!详情还是前往官网了解
6、浅浅总结一下
- BeanSearcher 是个伟大的出现,为后端的程序猿们提供了太大的方便,从此不必再过于纠结前端传的参数,从而把重心放在业务逻辑代码上,极大的提高了工作效率!!!
73 comments
?励志类评语?
情感表达稍显含蓄,可适当强化渲染。
终极关怀的缺失可尝试补充升华。
创新略显不足,可尝试引入多元视角。
作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。
对话设计自然,符合角色身份与情境。
情感真挚自然,字里行间传递出强烈的感染力。
作者以简洁明了的语言,传达了深刻的思想和情感。
哈哈哈,写的太好了https://www.lawjida.com/
《夜郎传说之面具判官》爱情片高清在线免费观看:https://www.jgz518.com/xingkong/56336.html
《唐赛儿》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/42048.html
《不一样的本能》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/10446.html
《帝都狂神》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/25948.html
《哑舍第二季动态漫》国产动漫高清在线免费观看:https://www.jgz518.com/xingkong/117644.html
《欢乐合唱团第一季》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/114227.html
你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/Se1jeP2WrD.html
你的文章让我感受到了不一样的视角,非常精彩。 https://www.4006400989.com/qyvideo/45210.html
看到你的文章,我仿佛感受到了生活中的美好。 https://www.yonboz.com/video/60392.html
《比特币的崛起》记录片高清在线免费观看:https://www.jgz518.com/xingkong/123862.html
《沙漠情深之五月花开》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/29228.html