英語 | 中国語
ドキュメント:https://bs.zhxu.cn
阿里云最低1折:https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
ジュジンのブログ:
たった 1 行のコードで次のことを実現できます。
デザイン思考: Bean Searcher の思考
建築:
CREATE/UPDATE/DELETE は Hibernate、MyBatis、DataJDBC、その他の ORM の長所ですが、クエリ、特に複数条件、複数テーブル、ページング、ソートを伴う複雑なリスト クエリは常に弱点でした。
従来のORMでは複雑なリスト検索を少ないコードで実現するのは困難でしたが、 Bean Searcherではこの点に大きな努力が払われました。これらの複雑なクエリは、ほぼ 1 行のコードで解決できます。
バックエンドは取得 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...
}
その後、1 行のコードで 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 ]一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
[ Fluent MyBatis ] MyBatis 语法增强框架、結合了 MyBatisPlus、DynamicSql、Jpa 等架台の特性と利点、注解処理器を利用して代コードを生成
[ OkHttps ]大量削減された HTTP ゲスト端末、前後端末に対応、WebSocket と Stomp をサポート
[ hrun4j ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡
[ JsonKit ]超轻量级 JSON 门面ツール、用法简单、不依存特定实现、让业务代码と Jackson、Gson、Fastjson 等解耦!
[ 無料 UI ] Vue3 + TypeScript に基づく、非常に轻量炫酷な UI パッケージです!
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request
を送信する