영어 | 중국어
문서:https://bs.zhxu.cn
阿里云最低 1 折:https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
JueJin 블로그:
달성할 수 있는 코드는 단 한 줄입니다:
디자인적 사고: Bean Searcher의 사고
건축학:
CREATE/UPDATE/DELETE는 Hibernate, MyBatis, DataJDBC 및 기타 ORM의 강점이지만 쿼리, 특히 다중 조건 , 다중 테이블 , 페이징 , 정렬 이 있는 복잡한 목록 쿼리는 항상 약점이었습니다.
전통적인 ORM은 적은 코드로 복잡한 목록 검색을 구현하기 어렵지만 Bean Searcher는 이에 대해 많은 노력을 기울였습니다. 이러한 복잡한 쿼리는 거의 한 줄의 코드로 해결할 수 있습니다.
백엔드는 검색 API를 작성해야 하는데, 기존 ORM으로 작성하면 코드 복잡도가 매우 높다.
그러나 Bean Searcher는 다음을 수행할 수 있습니다.
먼저 Entity 클래스가 있습니다.
@ 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...
}
그런 다음 한 줄의 코드로 API를 완성할 수 있습니다.
@ RestController
@ RequestMapping ( "/user" )
public class UserController {
@ Autowired
private BeanSearcher beanSearcher ; // Inject BeanSearcher
@ GetMapping ( "/index" )
public SearchResult < User > index ( HttpServletRequest request ) {
// Only one line of code written here
return beanSearcher . search ( User . class , MapUtils . flat ( request . getParameterMap ()), new String []{ "age" });
}
}
이 코드 줄은 다음을 달성할 수 있습니다.
age
필드가 포함된 요약예를 들어 이 API는 다음과 같이 요청할 수 있습니다.
GET: /user/index
기본 페이지 매김으로 검색:
{
"dataList" : [
{
"id" : 1 ,
"username" : " Jack " ,
"status" : 1 ,
"age" : 25 ,
"gender" : " Male " ,
"joinDate" : " 2021-10-01 " ,
"roleId" : 1 ,
"roleName" : " User "
},
... // 15 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
GET: /user/index? page=1 & size=10
지정된 페이지 매김으로 검색
GET: /user/index? status=1
기본 페이지 매김에 따라 status = 1
로 검색
GET: /user/index? name=Jac & name-op=sw
기본 페이지 매김으로 Jac
로 시작하는 name
으로 검색
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 ,
},
... // 15 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
GET: /user/index? selectExclude=joinDate
joinDate
검색하면 기본 페이지 매김이 제외됩니다.
Map < String , Object > params = MapUtils . builder ()
. selectExclude ( User :: getJoinDate ) // Exclude joinDate field
. field ( User :: getStatus , 1 ) // Filter:status = 1
. field ( User :: getName , "Jack" ). ic () // Filter:name = 'Jack' (case ignored)
. field ( User :: getAge , 20 , 30 ). op ( Opetator . Between ) // Filter:age between 20 and 30
. orderBy ( User :: getAge , "asc" ) // Sorting by age ascending
. page ( 0 , 15 ) // Pagination: page=0 and size=15
. build ();
List < User > users = beanSearcher . searchList ( User . class , params );
데모 :
Bean Searcher를 사용하면 복잡한 목록 검색 API의 개발 시간을 크게 절약할 수 있습니다!
Entity
정의하지 않고도 원래 domain
재사용할 수 있습니다.Bean Searcher는 SpringBoot, SpringMVC, Grails, Jfinal 등과 같은 모든 JavaWeb 프레임워크와 함께 작동할 수 있습니다.
필요한 것은 종속성을 추가하는 것뿐입니다.
implementation ' cn.zhxu:bean-searcher-boot-stater:4.3.4 '
그런 다음 Searcher를 Controller
나 Service
에 삽입할 수 있습니다.
/**
* Inject a MapSearcher, which retrieved data is Map objects
*/
@Autowired
private MapSearcher mapSearcher;
/**
* Inject a BeanSearcher, which retrieved data is generic objects
*/
@Autowired
private BeanSearcher beanSearcher;
필요한 것은 종속성을 추가하는 것뿐입니다.
implementation ' cn.zhxu:bean-searcher-solon-plugin:4.3.4 '
그런 다음 Searcher를 Controller
나 Service
에 삽입할 수 있습니다.
/**
* Inject a MapSearcher, which retrieved data is Map objects
*/
@Inject
private MapSearcher mapSearcher;
/**
* Inject a BeanSearcher, which retrieved data is generic objects
*/
@Inject
private BeanSearcher beanSearcher;
이 의존성을 추가하면:
implementation ' cn.zhxu:bean-searcher:4.3.4 '
그런 다음 SearcherBuilder
사용하여 Searcher
빌드할 수 있습니다.
DataSource dataSource = ... // Get the dataSource of the application
// DefaultSqlExecutor suports multi datasources
SqlExecutor sqlExecutor = new DefaultSqlExecutor ( dataSource );
// build a MapSearcher
MapSearcher mapSearcher = SearcherBuilder . mapSearcher ()
. sqlExecutor ( sqlExecutor )
. build ();
// build a BeanSearcher
BeanSearcher beanSearcher = SearcherBuilder . beanSearcher ()
. sqlExecutor ( sqlExecutor )
. build ();
Bean Searcher의 모든 구성 요소를 사용자 정의하고 확장할 수 있습니다.
예를 들어:
FieldOp
사용자 정의DbMapping
사용자 정의ParamResolver
사용자 정의FieldConvertor
사용자 정의Dialect
사용자 정의참고 : https://bs.zhxu.cn
[ Sa-Token ]一个轻weight级 Java 权限认证框架,让鉴权变得简单、优雅!
[ Fluent MyBatis ] MyBatis 语法增强框架, 综合了 MyBatisPlus, DynamicSql,Jpa 等框架性特性 and优点, 利用注解处理器生成代码
[ OkHttps ]轻weight却强大的 HTTP 客户端,前后端communication,支持 WebSocket 与 Stomp 协议
[ hrun4j ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡
[ JsonKit ]超轻weight级 JSON 门face工具, 用법简单, 不依赖具体实现, 让业务代码与 Jackson, Gson, Fastjson 等解耦!
[ 무료 UI ]基于 Vue3 + TypeScript, 一个不常轻weight炫酷的 UI 组件库 !
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request
제출