Englisch | 中文
Dokumentation: https://bs.zhxu.cn
阿里云最低 1 Monat : https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
JueJin-Blogs:
Nur eine Codezeile, um Folgendes zu erreichen:
Design Thinking: Das Denken von Bean Searcher
Architektur:
Obwohl CREATE/UPDATE/DELETE die Stärken von Hibernate, MyBatis, DataJDBC und anderen ORM sind, waren Abfragen, insbesondere komplexe Listenabfragen mit mehreren Bedingungen , mehreren Tabellen , Paging und Sortierung , schon immer ihre Schwächen.
Mit herkömmlichem ORM ist es schwierig, einen komplexen Listenabruf mit weniger Code zu realisieren, aber Bean Searcher hat in dieser Hinsicht große Anstrengungen unternommen. Diese komplexen Abfragen können in fast einer Codezeile gelöst werden.
Das Back-End muss eine Abruf-API schreiben. Wenn diese mit herkömmlichem ORM geschrieben wird, ist die Komplexität des Codes sehr hoch
Aber Bean Searcher kann:
Zuerst haben Sie eine Entity-Klasse:
@ 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...
}
Dann können Sie die API mit einer Codezeile vervollständigen:
@ 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" });
}
}
Diese Codezeile kann Folgendes erreichen:
age
Diese API kann beispielsweise wie folgt angefordert werden:
GET: /user/index
Standardmäßige Paginierung abrufen:
{
"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
Abruf nach angegebener Paginierung
GET: /user/index? status=1
Abruf mit status = 1
bei Standard-Paginierung
GET: /user/index? name=Jac & name-op=sw
Abruf mit name
, der standardmäßig mit Jac
beginnt
GET: /user/index? name=Jack & name-ic=true
Abruf mit name = Jack
(Groß-/Kleinschreibung ignoriert) durch Standard-Paginierung
GET: /user/index? sort=age & order=desc
Abrufsortierung nach absteigendem age
und standardmäßiger Paginierung
GET: /user/index? onlySelect=username,age
username,age
nur durch Standard-Paginierung abrufen:
{
"dataList" : [
{
"username" : " Jack " ,
"age" : 25 ,
},
... // 15 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
GET: /user/index? selectExclude=joinDate
Beim Abrufen joinDate
wurde die Standardpaginierung ausgeschlossen
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 );
Demos :
Die Verwendung von Bean Searcher kann die Entwicklungszeit der komplexen Listenabruf-APIs erheblich verkürzen!
domain
wiederverwendet werden, ohne eine neue Entity
zu definierenBean Searcher kann mit allen JavaWeb-Frameworks arbeiten, wie zum Beispiel: SpringBoot, SpringMVC, Grails, Jfinal und so weiter.
Sie müssen lediglich eine Abhängigkeit hinzufügen:
implementation ' cn.zhxu:bean-searcher-boot-stater:4.3.4 '
und dann können Sie Searcher in einen Controller
oder Service
injizieren:
/**
* 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;
Sie müssen lediglich eine Abhängigkeit hinzufügen:
implementation ' cn.zhxu:bean-searcher-solon-plugin:4.3.4 '
und dann können Sie Searcher in einen Controller
oder Service
injizieren:
/**
* 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;
Diese Abhängigkeit hinzufügen:
implementation ' cn.zhxu:bean-searcher:4.3.4 '
Dann können Sie mit SearcherBuilder
einen Searcher
erstellen:
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 ();
Sie können jede Komponente in Bean Searcher anpassen und erweitern.
Zum Beispiel:
FieldOp
zur Unterstützung anderer FeldoperatorenDbMapping
zur Unterstützung anderer ORM-AnnotationenParamResolver
zur Unterstützung von JSON-AbfrageparameternFieldConvertor
zur Unterstützung aller FeldtypenDialect
zur Unterstützung weiterer DatenbankenReferenz: https://bs.zhxu.cn
[ Sa-Token ]一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
[Fluent MyBatis] MyBatis-Sprache, MyBatisPlus, DynamicSql, Jpa und MyBatisPlus, DynamicSql, Jpa
[ OkHttps ] Benutzen Sie die HTTP-App, die WebSocket-App und die Stomp-App
[ hrun4j ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡
[ JsonKit ] JSON-basierte JSON-Software, die von Jackson, Gson und Fastjson unterstützt wird.
[Free UI]基于 Vue3 + TypeScript, 一个非常轻量炫酷的 UI 组件库!
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request
senden