<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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新坐標 閱讀(252) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 91香蕉国产线在线观看免费| 久久精品无码一区二区三区免费| 亚洲人成色777777在线观看| 久久精品免费观看| 久久亚洲精品中文字幕| 最近2019年免费中文字幕高清| 亚洲第一成年网站大全亚洲| 国产成人免费网站| 最新亚洲人成无码网www电影| 亚洲?V乱码久久精品蜜桃 | 亚洲人成网站看在线播放| 成熟女人特级毛片www免费| 亚洲另类无码专区首页| 免费中文字幕一级毛片| 中文字幕的电影免费网站| 亚洲福利在线视频| 九九九精品成人免费视频| 亚洲AV网一区二区三区| 77777亚洲午夜久久多人| 日韩插啊免费视频在线观看| 亚洲综合久久一本伊伊区| 伊在人亚洲香蕉精品区麻豆| a国产成人免费视频| 亚洲国产精品张柏芝在线观看| 国产高清在线精品免费软件| kk4kk免费视频毛片| 内射少妇36P亚洲区| 日本特黄特色aa大片免费| 99免费在线视频| 亚洲一区二区免费视频| 亚洲AV成人潮喷综合网| 一级毛片免费播放| 亚洲av成人一区二区三区观看在线 | 91免费福利精品国产| 亚洲A∨精品一区二区三区下载| 亚洲自偷自偷在线制服 | 亚洲香蕉久久一区二区| 亚洲视频在线免费| 国产在线观看免费观看不卡| a级毛片免费观看在线| 亚洲嫩草影院在线观看|