歡迎您光臨本站 註冊首頁

jSqlBox 4.0.7 釋出,Java 資料庫 ORM 工具

←手機掃碼閱讀     admin @ 2020-06-25 , reply:0

jSqlBox主要特點是架構優、尺寸小、功能全,基本上所有與資料庫操作相關的功能,jSqlBox都已提供。它的主要特點有:  
1.核心基於DbUtils並與之相容。  
2.提倡在java裡拼寫SQL,獨創引數內嵌式SQL寫法, 而且任意CRUD方法裡都可以混插SQl片段,例如:  
  new Demo().setName("張三").insert().putField("age", 15).update(" and name=?", param("李四"), " and age> ",ques(20));
3.只有單個jar包,不依賴任何第三方庫。  
4.支援分庫分表、宣告式事務、分散式事務。  
5.支援80多種資料庫方言,支援DDL生成、分頁、函式變換、實體原始碼生成。  
6.學習成本低,相容主要的實體JPA註解。

本次更新為jsqlbox-4.0.7.jre8版,有以下內容改動:
1.新增tx和tryTx兩個事務模板方法 
這兩個方法類似於JdbcTemplae和jFinal中的事務模式回撥方法。雖然原始碼只有十行,但這個語法糖可以簡化事務的寫法,不再需要每次手工開啟、提交、回滾事務了,使用示例如下:


 DbContext ctx = new DbContext(dataSource);
 DbContext.setGlobalDbContext(ctx);ctx.tx(()->{
     new User().putField("firstName", "Foo").insert();
     new User().putField("firstName", "Bar").insert();
   });
 

與tx方法類似的還有一個tryTx方法,如果方法體內有異常發生,它們事務都會回滾。兩者的區別是tx方法沒有返回值,如果方法體內有異常發生,事務會回滾,並丟擲一個執行時異常DbException。而tryTx方法不丟擲異常,它返回一個布林值,返回true表示事務提交成功,返回false表示事務提交失敗。  

tx和tryTx兩個方法都可以用ctx.getLastTxResult來返回一個TxResult物件,它的commitEx屬性裡存放了上次事務發生時捕獲的異常,result屬性裡存放了事務提交結果,注意這是一個三態值,有SUCESS、FAIL、UNKNOW三種狀態,UNKNOW態很少會遇到,它只發生在使用了jSqlBox的GTX分散式事務,有部分提交且自動回滾也未完成(如網線斷掉或有一個資料庫硬碟損壞)這種情形。   

2.增加了快取翻譯功能 
快取翻譯這個功能是從SqlToy這個ORM工具中抄過來的,當然不是抄原始碼了,而是抄這個功能,做開源要擅長於橫向比較同類專案,並吸收其它開源專案的亮點才能互相促進。 
快取翻譯(有時被稱為“資料字典”)可以用記憶體中快取的資料庫表來避免多表關聯查詢,簡化SQL的書寫,並有可能提高查詢效率。以下是一個使用了快取翻譯的示例,完整示例程式碼詳見單元測試中的CacheTranslateTest.java,實現上使用起來也很簡單,主要就下面幾行:  


 Map<Integer, Map<String, Object>> users = ctx.iQuery("select * from users", new KeyedHandler<Integer>("id"));
 Map<Integer, Map<String, Object>> groups = ctx.iQuery("select * from groups", new KeyedHandler<Integer>("id"));
 List<Map<String, Object>> orders = ctx.iQueryForMapList("select id,orderNo,userId,groupId from orders where id>'10' ");
 CacheTransUtils.translate(orders, users, "userID", "name", "userName", "age", "userAge", groups, "groupId", "groupName", "groupName");
 

以上translate方法對orders這個List集合,根據快取users和groups表,添加了userName、userAge和groupName三個列。
translate方法的引數可以有無限個,但是必須嚴格按照以下引數順序來使用: translate(要處理的集合,快取A,"集合中的列名","快取A中的列名1","列名1別名","快取A中的列名2","列名2別名"......, 快取B,"集合中的列名","快取B中的列名1","列名1別名"...)

注意這個快取翻譯功能是針對List<Map<String,Object>>這個資料結構的,是對SQL的查詢結果進行後處理,它與DAO工具實際上關係不大,也就是說,其它的DAO工具如MyBatis,JdbcTemplate等也可以呼叫jSqlBox的這個CacheTransUtils.translate方法實現快取翻譯功能。

快取翻譯通常快取不常變動的表格(即資料字典)到記憶體中,如果資料字典偶爾有變動,可以有兩種方案,一種是在更改資料字典時,強制重新整理快取。另一種方案是每次使用快取翻譯功能時,都重新查詢資料字典,在查詢資料字典給它傳遞一個快取攔截器,由快取攔截器的失效時間來決定是否實際發出SQL到資料庫查詢。

jSqlBox快取翻譯的缺點:被翻譯後新增的這些欄位,不能出現在SQL查詢條件中,這是它的一個使用限制。如果既想將這些欄位作為SQL引數參與查詢,又不想採用多表關聯這種傳統寫法,可以考慮打破資料庫正規化,採用新增冗餘欄位的技巧。

更多jSqlBox的使用說明請見其主頁:https://gitee.com/drinkjava2/jsqlbox     


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/116715/jsqlbox-4-0-7-released
jSqlBox 4.0.7 釋出,Java 資料庫 ORM 工具已經有54次圍觀

http://coctec.com/news/soft/show-post-239601.html