อังกฤษ | 中文
เอกสาร: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
การดึงข้อมูลด้วย 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 สามารถประหยัดเวลาในการพัฒนา API การเรียกค้นรายการที่ซับซ้อนได้อย่างมาก!
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 ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安heart睡
[ 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