隨筆-39  評論-33  文章-0  trackbacks-0

          DAO + 通用持久類,實現數據增、刪、改、查

          ?

          標題中“ DAO 類”指 net.newxy.dbm.BaseDAO 或其子類,“通用持久類”指 net.newxy.dbm.DynaDto

          利用 newxy( 新坐標 )DAO 類及通用持久類對數據進行增、刪、改操作可以不依賴于 struts ,運用系統不一定要支持 struts ,方法極其簡便。

          一、通用持久類簡介:

          1 net.newxy.dbm.DynaDto 類圖

          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 類及相關類的類圖

          ??? net.newxy.dbm.BaseDAO及相關類的類圖

          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

          posted on 2006-07-06 08:46 newxy新坐標 閱讀(253) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阳城县| 泰安市| 绥棱县| 德阳市| 日喀则市| 天等县| 长乐市| 四会市| 广灵县| 浪卡子县| 辽阳县| 白朗县| 新源县| 浦东新区| 汝南县| 牙克石市| 黄浦区| 洞口县| 中江县| 湖南省| 南乐县| 安徽省| 丹阳市| 中超| 山阳县| 屏山县| 安乡县| 抚远县| 博乐市| 都江堰市| 稻城县| 鄄城县| 黎城县| 和平县| 临江市| 南宁市| 岑巩县| 略阳县| 闸北区| 怀宁县| 桃源县|