Bahasa Inggris | tidak
Dokumentasi:https://bs.zhxu.cn
Jawaban 1 :https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
Blog JueJin:
Hanya satu baris kode yang harus dicapai:
Pemikiran desain: Pemikiran Bean Searcher
Arsitektur:
Meskipun CREATE/UPDATE/DELETE adalah kelebihan Hibernate, MyBatis, DataJDBC dan ORM lainnya, kueri, terutama kueri daftar kompleks dengan multi condition , multi table , paging , sorting , selalu menjadi kelemahannya.
ORM tradisional sulit mewujudkan pengambilan daftar yang rumit dengan kode yang lebih sedikit, tetapi Bean Searcher telah melakukan upaya besar dalam hal ini. Kueri kompleks ini dapat diselesaikan dalam hampir satu baris kode.
Back-end perlu menulis API pengambilan, dan jika ditulis dengan ORM tradisional, kompleksitas kodenya sangat tinggi
Tapi Bean Searcher bisa:
Pertama, Anda memiliki kelas Entitas:
@ 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...
}
Kemudian Anda dapat melengkapi API dengan satu baris kode :
@ 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" });
}
}
Baris kode ini dapat mencapai:
age
Misalnya, API ini dapat diminta sebagai berikut:
GET: /user/index
Mengambil pagination secara default:
{
"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
Pengambilan berdasarkan pagination yang ditentukan
GET: /user/index? status=1
Pengambilan dengan status = 1
secara default pagination
GET: /user/index? name=Jac & name-op=sw
Pengambilan dengan name
yang dimulai dengan Jac
dengan penomoran halaman default
GET: /user/index? name=Jack & name-ic=true
Pengambilan dengan name = Jack
(huruf besar diabaikan) dengan penomoran halaman default
GET: /user/index? sort=age & order=desc
Penyortiran pengambilan berdasarkan age
menurun dan penomoran halaman default
GET: /user/index? onlySelect=username,age
Pengambilan username,age
hanya berdasarkan penomoran halaman default:
{
"dataList" : [
{
"username" : " Jack " ,
"age" : 25 ,
},
... // 15 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
GET: /user/index? selectExclude=joinDate
Mengambil joinDate
mengecualikan pagination default
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 );
Demo :
Menggunakan Bean Searcher dapat sangat menghemat waktu pengembangan api pengambilan daftar yang kompleks!
domain
asli, tanpa mendefinisikan Entity
baruBean Searcher dapat bekerja dengan kerangka JavaWeb apa pun, seperti: SpringBoot, SpringMVC, Grails, Jfinal, dan sebagainya.
Yang Anda perlukan hanyalah menambahkan ketergantungan:
implementation ' cn.zhxu:bean-searcher-boot-stater:4.3.4 '
dan kemudian Anda dapat memasukkan Searcher ke dalam Controller
atau 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;
Yang Anda perlukan hanyalah menambahkan ketergantungan:
implementation ' cn.zhxu:bean-searcher-solon-plugin:4.3.4 '
dan kemudian Anda dapat memasukkan Searcher ke dalam Controller
atau 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;
Menambahkan ketergantungan ini:
implementation ' cn.zhxu:bean-searcher:4.3.4 '
maka Anda dapat membuat Searcher
dengan SearcherBuilder
:
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 ();
Anda dapat menyesuaikan dan memperluas komponen apa pun di Bean Searcher.
Misalnya:
FieldOp
untuk mendukung operator lapangan lainnyaDbMapping
untuk mendukung anotasi ORM lainnyaParamResolver
untuk mendukung parameter kueri JSONFieldConvertor
untuk mendukung semua jenis bidangDialect
untuk mendukung lebih banyak databaseReferensi :https://bs.zhxu.cn
[ Sa-Token ]一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
[ Fasih MyBatis ] MyBatis 语法增强框架, 综合了 MyBatisPlus, DynamicSql,Jpa 等框架的特性和优点,利用注解处理器生成代码
[ OkHttps ]轻量却强大的 HTTP ,前后端通用,支持 WebSocket 与 Stomp 协议
[ hrun4j ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡
[ JsonKit ]超轻量级 JSON 门面工具,用法简单,不依赖具体实现,让业务代码与 Jackson、Gson、Fastjson 等解耦!
[ UI Gratis ]基于 Vue3 + TypeScript,一个非常轻量炫酷的 UI 组件库 !
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request