الإنجليزية | 中文
التوثيق:https://bs.zhxu.cn
الرابط 1 الرابط: https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
مدونات جوجين:
سطر واحد فقط من التعليمات البرمجية لتحقيق:
التفكير التصميمي: تفكير Bean Searcher
بنيان:
على الرغم من أن CREATE/UPDATE/DELETE هي نقاط القوة في Hibernate وMyBatis وDataJDBC وغيرها من ORM، إلا أن الاستعلامات، وخاصة استعلامات القائمة المعقدة ذات الشروط المتعددة والجداول المتعددة والترحيل والفرز ، كانت دائمًا نقاط ضعفها.
يصعب تنفيذ ORM التقليدي من خلال استرجاع قائمة معقدة باستخدام كود أقل، لكن Bean Searcher بذل جهودًا كبيرة في هذا الصدد. يمكن حل هذه الاستعلامات المعقدة في سطر واحد تقريبًا من التعليمات البرمجية.
تحتاج الواجهة الخلفية إلى كتابة واجهة برمجة تطبيقات للاسترجاع، وإذا تمت كتابتها باستخدام ORM التقليدي، فإن تعقيد الكود يكون مرتفعًا جدًا
لكن يمكن لـ Bean Searcher:
أولاً، لديك فئة الكيان:
@ 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...
}
ثم يمكنك إكمال واجهة برمجة التطبيقات بسطر واحد من التعليمات البرمجية:
@ 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
الاسترجاع name
الذي يبدأ بـ Jac
بواسطة ترقيم الصفحات الافتراضي
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 إلى توفير وقت تطوير واجهة برمجة تطبيقات استرجاع القائمة المعقدة بشكل كبير!
domain
الأصلي، دون تحديد Entity
جديديمكن لـ Bean Searcher العمل مع أي من أطر عمل JavaWeb، مثل: SpringBoot وSpringMVC وGrails وJfinal وما إلى ذلك.
كل ما تحتاجه هو إضافة التبعية:
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 '
ثم يمكنك إنشاء Searcher
باستخدام 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 ();
يمكنك تخصيص وتوسيع أي مكون في Bean Searcher.
على سبيل المثال:
FieldOp
لدعم المشغل الميداني الآخرDbMapping
لدعم التعليقات التوضيحية لـ ORM الأخرىParamResolver
لدعم معلمات استعلام JSONFieldConvertor
لدعم أي نوع من الحقولDialect
لدعم المزيد من قاعدة البياناتالمرجع:https://bs.zhxu.cn
[ Sa-Token ]一个轻量级 Java 权限认证框架،让鉴权变得简单、优雅!
[ Fluent MyBatis ] MyBatis 语法增强框架، 综合了 MyBatisPlus، DynamicSql،Jpa 等框架的特性和优点،利用注解处理器生成代码
[ OkHttps ] قم بتنزيل رمز HTTP، وقم بتثبيت WebSocket على Stomp
[ hrun4j]
[JsonKit] تم تصميم JSON 门面工具، 用法简单، 不依赖具体实现،让业务代码与 Jackson،Gson،Fastjson 等解耦!
[واجهة مستخدم مجانية] تم إصدار Vue3 + TypeScript، تم إنشاء واجهة مستخدم جديدة!
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request