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