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