jSqlBoxJava 持久層工具
jSqlBox是一個(gè)全功能數(shù)據(jù)庫持久層工具,有Java6和Java8兩個(gè)版本。采用Apache2.0開源協(xié)議。
優(yōu)點(diǎn) | Advantages
-
架構(gòu)優(yōu)良:模塊式架構(gòu),各個(gè)模塊都可以脫離jSqlBox單獨(dú)存在。
-
跨數(shù)據(jù)庫:基于jDialects,支持80多種數(shù)據(jù)庫的分頁、DDL生成、實(shí)體源碼生成、函數(shù)變換。
-
與DbUtils兼容:繼承于DbUtils, 原有基于DbUtils的項(xiàng)目可以無縫移植到j(luò)SqlBox。
-
多種SQL寫法:Inline方法、模板方法、DataMapper、ActiveRecord、鏈?zhǔn)綄懛ǖ取?/p>
-
多項(xiàng)技術(shù)創(chuàng)新:Inline寫法、多行文本支持、ORM越級(jí)查詢、樹結(jié)構(gòu)查詢等。
-
動(dòng)態(tài)配置:除了支持實(shí)體Bean注解式配置,jSqlBox還支持在運(yùn)行期動(dòng)態(tài)更改配置。
-
無會(huì)話設(shè)計(jì):無會(huì)話設(shè)計(jì)(Sessionless),是真正的輕量級(jí)工具,可以隨用隨棄。
-
自帶聲明式事務(wù):基于獨(dú)立的聲明式事務(wù)工具jTransactions,并可配置成使用Spring事務(wù)。
-
學(xué)習(xí)曲線平滑:模塊化學(xué)習(xí),了解了各個(gè)子模塊,就掌握了jSqlBox,jSqlBox主體只有20多個(gè)類。
文檔 | Documentation
與其它DAO工具對(duì)比 | Features
下表是jSqlBox在各個(gè)方面與一些其它DAO工具的對(duì)比, 內(nèi)容僅為個(gè)人看法,而且隨時(shí)更新,因?yàn)榭赡苡姓f錯(cuò)的地方,或是其它DAO工具有了新版本發(fā)布,表中的MP為MyBatis-Plus的縮寫:
| 對(duì)比內(nèi)容 | MP | BeetlSql | JFinal | jSqlBox | 打分理由(僅參考官網(wǎng)文檔,純屬個(gè)人看法) |
|---|---|---|---|---|---|
| 總體架構(gòu) | 3.5 | 4 | 3.5 | 5 | jSqlBox模塊式架構(gòu)更合理,各個(gè)模塊可以抽取出來使用。MP內(nèi)核基于MyBatis,這個(gè)內(nèi)核比較大,本身固有的問題(如XML配置復(fù)雜)不能通過插件來解決。JFinal:1)從DAO選型角度看,它捆綁發(fā)布的Web層代碼是多余的。2)基于Map的實(shí)體類不規(guī)范,不是標(biāo)準(zhǔn)POJO,對(duì)項(xiàng)目有侵入性 |
| 易學(xué)、易用、易維護(hù) | 4 | 4 | 5 | 5 | jSqlBox的配置和代碼量在所有ORM工具中最少,見DaoBenchMark項(xiàng)目對(duì)比(缺JFinal) |
| 從實(shí)體類生成DDL腳本 | 0 | 0 | 0 | 5 | jSqlBox支持從實(shí)體創(chuàng)建跨數(shù)據(jù)庫(80種方言)的DDL腳本,更方便原型開發(fā)和單元測(cè)試 |
| 從數(shù)據(jù)庫生成實(shí)體源碼 | 5 | 5 | 5 | 5 | 代碼生成器在項(xiàng)目后期作用有限,例如當(dāng)實(shí)體類字段名重構(gòu),還是必須在IDE里打開源碼手工重構(gòu),代碼生成器幫不上忙。 |
| 分頁 | 4 | 4 | 4 | 5 | jSqlBox的分頁方式侵入性最少,任意SQL和CRUD方法中都可以傳入分頁攔截器 |
| 事務(wù) | 4 | 4 | 5 | 5 | 都兼容Spring事務(wù),Jfinal和jSqlBox都自帶聲明式事務(wù),可以甩掉笨重的Spring。jSqlBox的聲明式事務(wù)有獨(dú)立發(fā)布版,可以提供給其它工具使用。 |
| 動(dòng)態(tài)SQL | 4 | 4 | 4 | 5 | jSqlBox首創(chuàng)參數(shù)內(nèi)嵌(Inline)式寫法,方便拼接SQL,任意SQL和CRUD方法中都可以將SQL文本、參數(shù)、分頁攔截器、緩存選項(xiàng)、分庫分表選項(xiàng)等當(dāng)作參數(shù)傳遞。其它DAO工具則主要依賴模板實(shí)現(xiàn)動(dòng)態(tài)SQL,多繞了一層。 |
| DBA友好(多行SQL存放) | 3.5 | 4.5 | 5 | 5 | BeetlSql不能切換模板。MyBatis的XML太繁瑣,Sql注解又不適用于多行SQL。jSqlBox缺省模板無語法功能,扣分,但它首創(chuàng)用注釋存放多行SQL,支持IDE定位,加分。 |
| 支持重構(gòu)的SQL | 4 | 4 | 4 | 4.5 | jSqlBox利用Lambda可以寫出支持重構(gòu)的SQL(Java8版),而且沒有重新發(fā)明新的SQL語法。BeetlSql中的Lambda查詢器和MP中的條件構(gòu)造器支持重構(gòu),但個(gè)人認(rèn)為是重新發(fā)明SQL的反模式,意義不大。jFinal沒有發(fā)明反模式,但也沒有什么創(chuàng)新,所以打分不高。jSqlBox沒有打滿分是因?yàn)槭躂ava語言限制,Lambda不能直接當(dāng)參數(shù)傳遞,使用起來繁瑣。 |
| ORM關(guān)聯(lián)查詢 | 5 | 3 | 3 | 5 | BeetlSql和JFinal實(shí)體關(guān)聯(lián)查詢有缺陷,例如dept=user.get(“department“)這種寫法不支持重構(gòu),也沒有自動(dòng)裝配POJO中的字段屬性。JFinal中Blog.dao.find(“select * from blog where user_id=?“,get(“id“));這種方式隱含1+N問題 |
| DataMapper模式 | 5 | 5 | 0 | 5 | 即類似dao.save(user)寫法。JFinal不支持標(biāo)準(zhǔn)POJO的持久化,不利于與其它工具集成使用。 |
| ActiveRecord模式 | 5 | 0 | 5 | 5 | ActiveRecord實(shí)現(xiàn)起來很簡單,它是DataMapper模式的鏡像,在jSqlBox中只有不到300行代碼,但是從文檔中看不出BeetlSql有這個(gè)功能,希望改進(jìn)。jSqlBox的Java8版只需要聲明ActiveEntity接口,不占用單繼承。 |
| 接口代理模式 | 5 | 5 | 0 | 0 | 只需要寫出接口,SQL用注釋加在接口方法上,在運(yùn)行時(shí)生成代理實(shí)例方法,這可能是個(gè)反模式,因?yàn)槭褂盟枰日{(diào)用dao.getMapper(User.class)生成一個(gè)特殊的代理實(shí)例,不如ActiveRecord模式簡單明了。在jSqlBox中,簡單的SQL和邏輯復(fù)雜的SQL,直接在Java方法里拼接就可以了,大段的SQL可以利用/-/注釋來存放,支持IDE定位 |
| 混合模型 | ? | 5 | 5 | 5 | 即同時(shí)支持利用POJO和數(shù)據(jù)庫字段存取,如user.setName(“Tom“).putTail(“usr_age“,10).save()。BeetlSql利用@Tail或TailBean實(shí)現(xiàn),jSqlBox中的ActiveRecord支持混合模型,jFinal中的Model支持混合模型。MP不清楚,先打個(gè)問號(hào)。 |
| Record/Map模式 | ? | 5 | 5 | 5 | 實(shí)體類不存在時(shí),JFinal可以用Record類來直接存取數(shù)據(jù)庫,jSqlBox用Tail類實(shí)現(xiàn)(是ActiveRecord的子類,源碼只有兩行),BeetlSql還支持直接用Map來存取數(shù)據(jù)庫。Tail/Record/Map這種方式不支持重構(gòu),所以不建議在項(xiàng)目中大量使用。 |
| 主從支持 | 2 | 5 | 2 | 5 | jSqlBox的主從選擇可以精細(xì)控制到任意一個(gè)CURD或SQL,jFinal需要手工選擇主從庫,不具備自動(dòng)切換主從功能。MyBatis本身不支持主從,要利用AOP等第三方手段實(shí)現(xiàn)。 |
| 分庫分表 | 2 | 2 | 2 | 4.5 | 只要使用了Sharding,對(duì)SQL寫法就有侵入。jSqlBox自帶基本的Sharding支持,支持原生SQL和所有數(shù)據(jù)庫。其它DAO工具本身不具備sharding功能,需要第三方Sharding工具支持,限制較多。 |
| 批處理 | 4 | 4 | 4 | 5 | 除了通常的JDBC批處理方法外,jSqlBox還提供批處理開關(guān)模式。 |
| 緩存 | 5 | 5 | 5 | 5 | 都有,都是針對(duì)SQL查詢結(jié)果而不是實(shí)體容器緩存 |
| 攔截器 | 5 | 5 | 5 | 5 | 都有 |
| Sql日志 | 5 | 5 | 5 | 5 | 都有 |
| 鎖及版本控制 | 5 | 5 | 0 | 0 | 不常用,JFinal和jSqlBox需手工實(shí)現(xiàn)鎖及版本 |
| 列名到實(shí)體字段映射 | 5 | 5 | 5 | 5 | 數(shù)據(jù)表與Java字段命名不符時(shí),jSqlBox用@Column注解來更正,符合JPA慣例。jFina推薦Java字段命名與數(shù)據(jù)表一致。MP和BeetlSql有幾種映射策略選擇。 |
| Java6/Java8支持 | 5 | 5 | 5 | 5 | 都支持。jSqlBox的Java8版只由3個(gè)類組成,反映了它的架構(gòu)可擴(kuò)展性好,用戶可以模仿這3個(gè)文件開發(fā)自已的Java8版。 |
| 性能 | 4 | 5 | ? | 5 | 對(duì)于持久層,易用性為王,不用多考慮性能。性能測(cè)試詳見閑大賦的DaoBenchMark |
| 文檔 | 4 | 4 | 3 | 4 | JFinal需要官網(wǎng)注冊(cè)才能下載Demo |
| 知名度、成熟度 | 4 | 4 | 5 | 0 | 用的人越多,Bug就越少。成熟度反映了軟件本身的質(zhì)量,但它與軟件的架構(gòu)、功能、易用性無關(guān)。 |
上表中未加入Hibernate和MyBatis,是因?yàn)镠iberante太復(fù)雜、MyBatis不提供CRUD,缺點(diǎn)太明顯。已經(jīng)被很多人用腳投票了。
不加入EBean的原因是它的功能相對(duì)單調(diào)一些,設(shè)計(jì)思路與Hibernate相似,復(fù)雜性依然存在。
國產(chǎn)的Nutz DAO功能也挺全的,而且也支持DDL腳本的生成,架構(gòu)上沒有大問題,待下次更新時(shí)加入作對(duì)比。它的主要缺點(diǎn)是沒提供ActiveRecord和實(shí)體關(guān)聯(lián)有點(diǎn)復(fù)雜化。
JdbcTemplate和DbUtils等DAO工具因?yàn)楣δ軉伪。膊患尤胱鲗?duì)比。
jSqlBox示例 | Demo
-
jsqlbox-in-actframework 演示jSqlBox與ActFramework框架的整合,分別展示利用jBeanBox和Guice來實(shí)現(xiàn)聲明式事務(wù)。
-
jsqlbox-in-jfinal 演示jSqlBox與jFinal的整合,用jSqlBox替換掉jFinal自帶的DAO工具。
-
jSqlBox-in-Spring 這是一個(gè)MVC Web項(xiàng)目,演示jSqlBox在Spring+Tomcat環(huán)境下的配置和使用, IOC、AOP和聲明式事務(wù)均使用Spring的。
-
jsqlbox-in-springboot 演示jSqlBox在SpringBoot環(huán)境下的配置和使用。
-
jsqlbox-in-springboot-mybatis 演示在SpringBoot環(huán)境下jSqlBox和MyBatis的混合使用。
-
jsqlbox-java8-demo 主要演示jSqlBox-Java8版的兩個(gè)特點(diǎn):實(shí)體類只需要聲明接口、利用Lambda來寫SQL。
配置方式 | Configuration
在pom.xml中添加:
com.github.drinkjava2
jsqlbox
2.0.4
作者其它開源項(xiàng)目 | Other Proje
期望 | Futures
歡迎發(fā)issue提出更好的意見或提交PR,幫助完善jSqlBox
