軟體設計 DAO層該如何設計

2021-05-24 01:28:40 字數 4599 閱讀 2020

關於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 軟體設計的最大原則 這個原則說的是 對擴充套件開放,對修改關閉。其實意思是說,給系統新增新的功能,但不修改原有 如果能做到呢,關鍵在於抽象化,也就是封裝變化,抽象層不變,讓具體實現依賴抽象隨需求變化。使得系統具有很強的擴充套件性和可維護性。黎克特制代換原則 任何基類可以出現的地方,...