DAO
類
+
通用持久類,實現數據增、刪、改、查
?
標題中“
DAO
類”指
net.newxy.dbm.BaseDAO
或其子類,“通用持久類”指
net.newxy.dbm.DynaDto
。
利用
newxy(
新坐標
)DAO
類及通用持久類對數據進行增、刪、改操作可以不依賴于
struts
,運用系統不一定要支持
struts
,方法極其簡便。
一、通用持久類簡介:
1
.
net.newxy.dbm.DynaDto
類圖
2
.
net.newxy.dbm.DynaDto
在數據操作中作為方法的參數
對數據的增、刪、改都是以通用持久類對象為參數調用
net.newxy.dbm.DBM
的方法來完成的。如:
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();
dynaDto.set_table(“table1”);//
設置數據庫表名
dynaDto.set(“field1”,“value1”);//
為字段
field1
賦值
……
插入或更新記錄:
dao.update(dynaDto);
……
刪除記錄:
dao.remove(dynaDto);
……
獲取某條記錄:
dao.load(dynaDto);
通用持久類
net.newxy.dbm.DynaDto
在
newxy(
新坐標
)
框架中起作重要作用。
3
.
net.newxy.dbm.DynaDto
的
public void set(String name, Object value)
方法中
value
數據類型
DynaDto.set(“field1”,”value”)
為字段
field1
賦值,調用了
DynaDto
的
public void set(String name, Object value)
方法,
value
值應是數據庫字段類型對應的
java
類型,或它們的
.toString()
字符串符。如字段類型是
int
,
value
可以是
Integer
類型或字符串型,如在
sybase
里字段類型是
smalldatetime
類型,
value
應是
java.sql.Timestamp
類型或字符串型。
4.newxy(
新坐標
)
對數據庫表主關鍵字段的處理及對主關鍵字段的設計建議
(1)???
表的主關鍵字段沒有其它意義,只作為記錄的唯一標志;
(2)???
只用一個字段作為主關鍵字段;
(3)???
主關鍵字段用數字類型或字符型,這樣
newxy(
新坐標
)
可以自動為其賦值;
(4)???
對多字段聯合構成主關鍵段,或非數字型非字符型字段,
newxy(
新坐標
)
不能自動為其賦值,開發者需解決為主關鍵字段賦值問題;
(5)???
如果沒有主關鍵字段,
newxy(
新坐標
)
會假設第一個字段作為主關鍵字段;
(6)???
dao.update(dynaDto)
方法會檢測主關鍵字段是由一個還是多字段組成,如果是一個字段,還會檢是否可以保存數字串。如果主關鍵段只有一個
(
也可能是沒有主鍵字段時默認的第一個字段
)
,而且可以賦給數字串,
newxy(
新坐標
)
會為其賦值,否則如果沒有利用
dynaDto.set(String name,Object value)
方法為主關鍵字段賦值,
dao.update(dynaDto)
方法會拋出異常。
?
二、
DAO
類簡介:
newxy(
新坐標
)
最終對數據的操作是通過
net.newxy.dbm.DBM
的一些方法實現的。操作數據時對數據庫連接采用遲連接,早釋放的原則。
net.newxy.dbm.BaseDAO
繼承自
net.newxy.dbm.DBM,
實現了
DBM
類的唯一抽象方法
Connection getConnection(String dsJndi) throws Exception
。
1
.
DAO
類及相關類的類圖
???
2
.
net.newxy.dbm.BaseDAO
類獲取數據庫連接的方法
BaseDAO
以
jdbc/default
為數據源的資源名。如果沒有
jdbc/default
資源名,以
WEB-INF/classes/
下的
newxy.properties
文件中定義的
ds.default
的屬性值為數據源的資源名,如果通過這樣的資源名還是得不到數據庫連接,
BaseDAO
嘗試在
WEB-INF/classes/
下的
newxy.properties
中得到
drvier
、
url
、
user
、
pass
四屬性值來獲取數據庫連接。但開發者可以通過繼承
net.newxy.dbm.DBM
或
net.newxy.dbm..BaseDAO
,過載
Connection getConnection(String dsJndi) throws Exception
方法,通過寫代碼的方法獲取數據庫連接。如果前述方法得不到數據庫連接,
DAO
類實例就會調用開發者寫的獲取數據庫連接方法。
請參考:
newxy.properites,數據庫連接、字符編碼、DAO類的配置文件
3
.開發者需要關心的
DAO
類幾個方法
Object findBySql(String sql) throws Exception; //result type is DynaFormBean
Object findBySql(String sql,boolean refresh,boolean cache,long interval) throws Exception;??
Object findByPrimaryKey(Object parms) throws Exception;
Object callByMethodName(String callByMethodName, Object parms) throws Exception;
List list(String sql) throws Exception;
Object load(Object dto) throws Exception;//*
Object update(Object dto) throws Exception;//*
void remove(Object dto) throws Exception;//*
void prepareStatement(String sql) throws SQLException;
void prepareCall(String sql) throws Exception;
Object prepareCall(Class c,String sql,Object[] params) throws Exception;
本篇只講解三個帶
*
的方法,它們與持久類有關。
?
三、
DAO
類
+
通用持久類完成對數據庫的操作:
newxy(
新坐標
)
在設計數據插入與更新的方法時采用了
Delphi
及
C++Builder
數據更新策略,
DataSet
有個方法
ApplyUpdates
,如果是在組件中新增一行,作插入操作,如果是對組件中某條記錄數據更改,作更新操作。
newxy(
新坐標
)net.newxy.dbm.DBM
用個
update(Object dto)
方法,如果持久類對象不含主關鍵字段值,作插入操作,如果含有的主關鍵字段值表中已存在,作更新操作。
1.
數據插入:
Object update(Object dto) throws Exception;
舉例:
??? try{
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();
??????? dynaDto.set_table("table1");//
設置表名
??????? dynaDto.set(“field1”,”……”);//
為字段
field1
賦值
??????? dynaDto.set(“field2”,”……”);//
為字段
field2
賦值
???????
Object result=dao.update(dynaDto);
??? }catch(Exception e){
??????? ......
}
例中兩字段
field1
、
field2
不是主關鍵字段,不用設置主關鍵段值,主關鍵字段值會自動得到,是原有最大值加一。
如果設置主關鍵字段值,如:
dynaDto.set(“id”,”100”);newxy(
新坐標
)
會檢查賦給的主關鍵字值是否已存在,如果存在,作更新
(update)
操作,如果不存在,作插入
(insert)
操作。
判斷是更新還是插入操作,可以根據返回的
result
值來判斷,如果
result
值為空,是作更新操作,如果
result
不空是作插入操作。
Object result=dao.update(dynaDto);
如果想需要知道自動賦給的主關鍵字段值,可以用如下方法:
??????? Object result=dao.update(dynaDto);
??????? Object idValue=null;
??????? If(result!=null)
idValue=((DynaDto)result).get(“id”);
???????????
idValue
就是自動賦給的主關鍵字段值。
2.
數據更新:
??
?try{
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();
??????? dynaDto.set_table("table1");//
設置表名
???????
dynaDto.set(“id”,”……”);//
為主關鍵字段賦值
??????? dynaDto.set(“field1”,”……”);//
為字段
field1
賦值
??????? dynaDto.set(“field2”,”……”);//
為字段
field2
賦值
???????
Object result=dao.update(dynaDto);
??? }catch(Exception e){
??????? ......
}
與數據插入相比增加了
dynaDto.set(“id”,value)
,
作用是為主關鍵字段賦值。
需注意:如果
dynaDto.set(“id”,value)
賦給的
value
在數據庫表中已存在,
dao.update(dynaDto)
方法仍然作更新操作。
3.
數據刪除
??
?try{
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();
??????? dynaDto.set_table("table1");//
設置表名
???????
dynaDto.set(“id”,”……”);//
為主關鍵字段賦值
???????
dao.remove(dynaDto);
??? }catch(Exception e){
??????? ......
}
4.
單條記錄查詢
??
?try{
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();
??????? dynaDto.set_table("table1");//
設置表名
???????
dynaDto.set(“id”,”……”);//
為主關鍵字段賦值
??????? Object result=dao.load(dynaDto);
???????
org.apache.commons.beanutils.DynaBean bean=( org.apache.commons.beanutils.DynaBean)result;
??????? Object field1Value=bean.get(“field1”);//
獲取字段
field1
的值;
??????? Object field2Value=bean.get(“field2”); //
獲取字段
field2
的值
??? }catch(Exception e){
??????? ......
}
注意:
newxy(
新坐標
)
獲取數據結果類型分兩種:
org.apache.commons.beanutils.BasicDynaBean
類型和
List
類型,而
List
方法
get(int item)
返回的也是
org.apache.commons.beanutils.BasicDynaBean
類型。
org.apache.commons.beanutils.DynaBean
及
org.apache.commons.beanutils.BasicDynaBean
類圖:
org.apache.commons.beanutils.DynaBean
及
org.apache.commons.beanutils.BasicDynaBean
是開源項目的一個類和一個接口。
org.apache.commons.beanutils.DynaBean
接口正是
struts
動態表單類
DynaActionForm
實現的接口。也是
newxy(
新坐標
)
通用持久類
net.newxy.dbm.DynaDto
及通用動態
formBean
類
net.newxy.struts_faces.DynaFormBean
實現的接口。
newxy(新坐標)技術網站:http://www.newxy.net