Nutz1.b.38發布實現Dao更快速的插入
自 Nutz 1.b.37 發布以來,時隔近3個月。為什么間隔這么時間呢?因為我們做了很多重大的調整:
- 重構了 Dao -- 兌現了我們之前的承諾
- 重構了 EL
- Nutz 的源碼管理遷移到了 Github 上
以后,希望大家報 Issue 到 Nutz Github 的問題列表 中。Google Code 的問題列表還有66個 Issue 沒有處理,我們會在后續的版本中盡快修復。如果都修復了,我們就會關閉 Google Code 的問題列表,只維護 Github 的問題列表。
另外,如果你在 Github 上有帳號,歡迎隨時 fork Nutz,請記住我們的口號就是: 喜歡 Nutz,就 Fork 它
當然,Nutz 的下載地址仍然一直會是 Google Code 下載列表,并且 Nutz 在 Google Code 的項目主頁 也會一直維護。
同時,我想提醒大家注意一下 Nutz 的官網,我們會不斷的充實它的內容,比如最近做的
- Nutz 的文檔
- Nutz 的小白測試
說到小白測試,不得不提一下 Dao 重構。我們這次重構 Dao 后總是不放心,其實我們在今年 5 月初就重構完了,然后我們測試呀,測試,畢竟是重構 Dao 了嘛,但是我們還是不放心,于是又測試呀測試... 但是我們還是不放心...
于是 Juqkai 同學在我和 Wendal 的攛掇下痛下決心,寫了這個應用:
Nutz 小白測試計劃
我們希望這個計劃,能讓更多人方便的參與測試,提交測試結果,這樣我們就能為更多的人提供更穩定的 Jar 包。同時,我們也能更準確的統計貢獻者名單。
當然如果沒有人參與這個測試計劃,最差的結果就是維持現狀。令人欣慰的是,還是有4位同學(包括我)參加了1.b.38測試的小白測試
那么,讓我們看看,以后的版本參加的人是會越來越多,還是越來越少 ^_^!
Dao 兼容性問題
作為一篇發行注記,這次我們要上點干貨了
1.b.38 的 Dao 與之前的 Dao 使用上的主要區別
- 更快的批量操作 -- 比如大數據量的插入
- 提供了 Criteria 接口,擴展了 Condition 接口,這樣查詢的時候,可以用 PreparedStatement 參數
- 同時 Criteria 接口也非常方便你組織更復雜的 SQL 條件
- 自定義 SQL 可以設置 fetchSize,但是依然不能支持 pager,你還得自己用 SQL 方言來翻頁
- 重新設計的 Entity ,可以方便的擴展,這樣有些偏愛 JPA 或者配置文件的同學,可以擴展自己的實體配置方式
- 重新設計的 LOG,可以讓 SQL 打印的更清晰
- 你甚至可以 dao.insert 或者 dao.update 一個 Map
- 支持 dao.create/dao.drop 方式來建表和刪表
- org.nutz.dao.Dao 原有的接口函數統統保持不變,從而保證了兼容性不會有太大問題。
為了上述的優點,我們放棄了一點點兼容性,你的項目如果用 Nutz.1.b.38 可能需要少量修改幾行代碼。
Cnd 類的兼容問題
當然,如果你直接實現 Condition 接口也不會有問題。
- Cnd.exp 的返回值類型變成了 SqlExpression
- Cnd.exps 的返回值類型變成了 SqlExpressionGroup
Entity 接口的兼容問題
極個別很有 Hacking 精神的同學使用 Nutz 的時候,使用了 Entity 類,但是不幸的是現在 Entity 已經變成一個接口并且某些方法已經變了名字,但是原來 Entity 類所有的功能,現在 Entity 接口都能提供。如果你發現某些方法找不到了,耐心看看新的 Entity 接口的定義,我想你很快就能找到你要找的方法。
最重要的一個改變,就是原來的 entity.fields() 方法,變成了 entity.getMappingFields()。這個是有同學向我抱怨過,因此覺得有必要在這里特別提一下。
org.nutz.dao.tool 包的兼容問題
某些很有探索精神的同學可能偶然發現了 Nutz 還隱藏了一個 Dao 工具類的包,里面的方法可以跨數據庫的建表,所以很有可能在自己的項目里也這么應用了。但是不幸的是,1.b.38 之后,這個包沒了。因為我們不再需要它了。你的建表可以用:
Java代碼
- dao.create(Pet.class, true); // true 表示如果存在,先 DROP 掉再建, false 表示如果存在就不建了
來完成。當然,刪表,可以用:
Java代碼
- dao.drop(Pet.class);
除此之外,Nutz.Dao 不會有和之前不兼容的地方了。當然如果你發現了,請隨時告訴我們,應該都不是大問題。
EL 兼容性問題
EL 作為比較新的一個功能,可能用的人比較少,我們之后會再各個模塊里逐漸發掘 EL 的潛力。本次發布 EL 經過了重構,效率提升了將近1倍。當然,作為一個用反射實現的東東,它的還是很慢,但是我們設計 EL 的時候假定它的使用場景是配置文件,后臺進程等一些不是非常需要效率的地方。它可以讓你的程序更有彈性。如果非常需要效率的地方,恐怕它不是一個很好的選擇。
重構后的 EL,eval 的結果不再是 ElValue,而是普通的 Object,這樣,你使用的時候會更方便一些。
并且EL的預編譯,不再是
Java代碼
- BinObj exp = El.compile("3+4");
而是
Java代碼
- El exp = new El("3+4");
看起來更清爽一些不是嗎? Juqkai 同學的設計 ^_^
#p#
問題修復
Issue 34 dao: support JPA Annotation by zozoh
Issue 85 NutDao 中需要提供批量更新操作的方法. by ming300
Issue 121 Nutz是否有根據實體上的注解來自動創建數據庫表等對象的計劃? by hzzdong
Issue 137 數據庫操作是否可以增加對Blob類型的支持 by Toni.xutao
Issue 155 Dao 的 @Column注解可否標注在getter函數上 by jinghui70
Issue 192 NutDao性能問題:關于批量操作,使用PreparedStatement的Batch功能 by hzzdong
Issue 230 關于nutz dao能否動態根據tables.dod 更新表結構 by shao0707
Issue 267 NutzDao能否提供設置fetchSize的方法 by superxlm1985
Issue 294 Nutz Dao 大量數據插入效率問題 by fjayblue
Issue 332 sqlserver2005 nutz@google Junit測試 by haoyoushuai1986
Issue 416 建議nutz提供一個拼接復雜的查詢條件的方法 by liuxiaogang1987
Issue 420 Sqls.create語句中包含'@'會出錯。 by wangyingdong
Issue 426 Condition Cnd.where + orderBy by muyushi85
Issue 433 MVC的代碼覆蓋率實在太低,很多都沒測試用例! by wendal
Issue 437 SqlLiteral中的@過濾 by zhuyingxi
Issue 457 Json:增加字段映射方式 by wendal
Issue 458 ActionChainMakerConfiguration類名拼寫錯誤 by jentrees2008
Issue 466 使用MySQL數據庫,使用Nutz.dao的自定義SQL報錯 by mamacmm
Issue 469 Json.toJson 對char類型沒有加引號 by lwk0571
Issue 471 Dao: 添加對Hsql數據庫的支持 by wendal
Issue 473 使nutz兼容OSGi by windywany
Issue 478 1.b.38 的新 Dao 應該忽略 Column 不存在的情況 -- by Jay by zozoh
Issue 479 38 update 問題 by fjayblue
Issue 482 將Nutz打成jar, 2 個 Scans 的測試過不了 by zozoh
Issue 485 EL表達式引擎在某些情況下會出現錯誤 by ywjno.dev
Issue 487 ioc中某個屬性的值是Map時,如果是null偶爾報:String can not cast to java.util.Map by superhanliu
Issue 489 AnnotationIocLoader類對set方法處理@Inject 有bug by feiyan
Issue 490 38的Dao,在DB2下,使用@Column('abc')的話,insert會報錯 by wendal
Issue 493 Lang的str2number方法在某些情況下會出錯 by ywjno.dev
Issue 494 自定義SQL wiki by superhanliu
Issue 497 Nztz.Dao 注釋沒寫全,和注釋重寫 by hongchongyuan
Issue 500 nutz.Json 應擴展一下@JsonField注解 by conanca
質量
共通過了 697 個單元測試用例,代碼覆蓋率達到
Nutz.Dao 經測試在如下數據庫上可以工作正常
- H2
- SQLite
- MySql
- Oracle
- Postgresql
- SqlServer2005
- SqlServer2000
- DB2
回答新手的問題,我們現在只能根據印象草草統計,貢獻列表非常不完善。我們正在想辦法,爭取在不遠的將來,能記錄下來大家每一點一滴的付出 ^_^!
【編輯推薦】