關於dao層的設計我現在也還是有點模糊,大大小小的專案也做了五六個了,負責的資料庫設計也有三四個了。
在對dao層進行設計時採用過兩種方案:
方案一:每一表對應乙個dao類(介面也可),每個dao將完成對該錶的增刪改查以及業務上要求的查詢操作。這麼設計的話如果表很多的話將會產生很多類,並且將會出現大量重複的**,因為每乙個dao中都將涉及到基礎的增刪改查。
方案二:寫乙個基礎的類,可以完成基本的增刪改查,其他的對於業務上有額外需求的表單獨在寫乙個類,不過這個類只包括額外的功能。這裡的基礎類寫的時候是需要嚴格注意的,因為採用的類似對映的實現,需要你把實體類設計的同表結構一摸一樣,因為在該類中對資料庫的增刪改查的sql語句就是通過對實體類類名以及對實體類類中屬性的提取完形成的。
這裡給出乙個基本的新增方法(vb.net實現):
public
class sqldao :
implements dal.
idao
private sqldr
as sqldatareader
private sqlcon
as sqlconnection
private sqlcmd
as sqlcommand
private strconnect
asstring
= configurationmanager.
("strcon"
)'得到類名
private strclassname
asstring
'得到類的型別
private mtype
as type
'得到屬性集
private mpros
as propertyinfo
()'在初始化方法中連線資料庫
'public sub init(byval obj as object) implements idao.init
' sqlcon = new sqlconnection(strconnect)
' '在建構函式中對必要型別進行初始化
' strclassname = typename(obj)
' mtype = obj.gettype()
' mpros = mtype.getproperties
'end sub
'連線資料庫的乙個私有方法
private
function getcon
()as sqlconnection
implements idao.
getcon
tryif
(sqlcon.
state
= connectionstate.
closed
)then
sqlcon.
open()
endif
catch ex
as exception
msgbox
("開啟資料庫時:"
+ ex.
message
)end
tryreturn sqlcon
endfunction
'''
''' 將物件新增到對應的表中,引數為物件,返回值為int型,表示影響的行數
'''
'''
''' integer
'''
public
function addobj
(of t
)(byval entity
as t
)asinteger
implements idao.
addobj
dim res
asinteger=0
'用來返回該操作影響的行數
'定義單個屬性
dim mpro
as propertyinfo
'定義sql引數
dim para
as sqlparameter
dim strfields
asstring=""
dim strcondition
asstring=""
dim strsql
asstring=""
foreach mpro in mpros
'該迴圈用來進行引數組合
'再新增時不用新增時間
strfields
=cstr
(trim
(mpro.
getvalue
(entity,
nothing))
)'獲取屬性值
if strfields <>
"0"and strfields <>
"00:00:00"
and strfields <>
""then
strsql
= strsql
+"@"
+ mpro.
name
+","
'組合形成欄位名
strcondition
= strcondition
+ mpro.
name
+","
endif
next
'最後再插入最後的括號
strsql
=left
(strsql,
len(strsql
)-1)
+")"
strcondition
=left
(strcondition,
len(strcondition
)-1)
+")"
strsql
="insert into "
+ strclassname
+" ("
+ strcondition
+" values ("
+ strsql
'msgbox(strsql)
tryusing scmd
asnew sqlcommand
(strsql, getcon
)'設定執行方式
scmd.
commandtype
= commandtype.
text
foreach mpro in mpros
'進行引數的賦值
'dim stra as string = mpro.getvalue(obj, nothing)
'一般的新增不用加入時間,除了下機表
strfields
=cstr
(trim
(mpro.
getvalue
(entity,
nothing))
)'獲取屬性值
if strfields <>
"0"and strfields <>
"00:00:00"
and strfields <>
""then
para
=new sqlparameter
("@"
+ mpro.
name, mpro.
getvalue
(entity,
nothing))
scmd.
parameters.
add(para
)end
ifnext
res
= scmd.
executenonquery
end using
catch ex
as exception
msgbox
("進行物件新增時:"
+ ex.
message
)end
tryreturn res
'返回該操作影響的行數
endfunction
endclass
這幾天從網上也查了一些資料主要就是關於dao層該如何設計的問題,最直接的設計方案就是每乙個表對應乙個dao,說是**重複太多,不過這樣設計那些基本的**是不用寫的,都有現成的工具,直接根據表生成對應的增刪改查。
不過因為需要重複的**太多了,因此有人提出這種方法:
public
inte***ce basedao
>
public
inte***ce winddao
extends basedao
>
將基本的增刪改查通過泛型放置到乙個基礎的介面中,其他的只需實現該介面,如果有額外的需求便可自行新增方法。這可謂乙個典型的繼承的應用。不過說實話,這種方法也不能使**量減少。
這塊還真是不太明白,論壇裡有人說:「其實可以將basedao注入baseservice來實現,這樣就不用每個dao都寫乙個類了」,實在是理解不了,如果有大牛恰好經過勞煩指點一二,不勝感激。
曹師哥點撥:
遇到乙個問題,我會採用軟體工程上的3w原則(what,why,how)來思考。
首先what:
如何物件導向軟體設計?
軟體設計也分大小,每個軟體開發工程師都有自己的設計,下面談談自己的見解 軟體開發的相關技術更新快,之前掌握的框架如前端的jquery和與jquery相關的框架,後端springmvc,structs,hiberneate等技術都逐漸被淘汰,有些技術公升級成新的技術仍在使用。技術是第一生產率。技術更新...
自動軟體設計
在1973年,美國人peter freeman在他的文章 自動軟體設計 automating software design 中有這樣的假設 如果有這樣一台機器 當我們告訴它我們需要什麼軟體的時候,它立刻就會滿足我們的要求,自動生成我們需要的程式。這台機器我稱之為萬能機。當我們提出需求的時候,需要關...
軟體設計原則
開閉原則 ocp 軟體設計的最大原則 這個原則說的是 對擴充套件開放,對修改關閉。其實意思是說,給系統新增新的功能,但不修改原有 如果能做到呢,關鍵在於抽象化,也就是封裝變化,抽象層不變,讓具體實現依賴抽象隨需求變化。使得系統具有很強的擴充套件性和可維護性。黎克特制代換原則 任何基類可以出現的地方,...