<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 + 通用持久類,實現(xiàn)數(shù)據(jù)增、刪、改、查

    ?

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

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

    一、通用持久類簡介:

    1 net.newxy.dbm.DynaDto 類圖

    net.newxy.dbm.DynaDto類圖

    2 net.newxy.dbm.DynaDto 在數(shù)據(jù)操作中作為方法的參數(shù)

    對數(shù)據(jù)的增、刪、改都是以通用持久類對象為參數(shù)調(diào)用 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”);// 設(shè)置數(shù)據(jù)庫表名

    dynaDto.set(“field1”,“value1”);// 為字段 field1 賦值

    ……

    插入或更新記錄: dao.update(dynaDto);

    ……

    刪除記錄: dao.remove(dynaDto);

    ……

    獲取某條記錄: dao.load(dynaDto);

    通用持久類 net.newxy.dbm.DynaDto newxy( 新坐標(biāo) ) 框架中起作重要作用。

    3 net.newxy.dbm.DynaDto public void set(String name, Object value) 方法中 value 數(shù)據(jù)類型

    DynaDto.set(“field1”,”value”) 為字段 field1 賦值,調(diào)用了 DynaDto public void set(String name, Object value) 方法, value 值應(yīng)是數(shù)據(jù)庫字段類型對應(yīng)的 java 類型,或它們的 .toString() 字符串符。如字段類型是 int value 可以是 Integer 類型或字符串型,如在 sybase 里字段類型是 smalldatetime 類型, value 應(yīng)是 java.sql.Timestamp 類型或字符串型。

    4.newxy( 新坐標(biāo) ) 對數(shù)據(jù)庫表主關(guān)鍵字段的處理及對主關(guān)鍵字段的設(shè)計建議

    (1)??? 表的主關(guān)鍵字段沒有其它意義,只作為記錄的唯一標(biāo)志;

    (2)??? 只用一個字段作為主關(guān)鍵字段;

    (3)??? 主關(guān)鍵字段用數(shù)字類型或字符型,這樣 newxy( 新坐標(biāo) ) 可以自動為其賦值;

    (4)??? 對多字段聯(lián)合構(gòu)成主關(guān)鍵段,或非數(shù)字型非字符型字段, newxy( 新坐標(biāo) ) 不能自動為其賦值,開發(fā)者需解決為主關(guān)鍵字段賦值問題;

    (5)??? 如果沒有主關(guān)鍵字段, newxy( 新坐標(biāo) ) 會假設(shè)第一個字段作為主關(guān)鍵字段;

    (6)??? dao.update(dynaDto) 方法會檢測主關(guān)鍵字段是由一個還是多字段組成,如果是一個字段,還會檢是否可以保存數(shù)字串。如果主關(guān)鍵段只有一個 ( 也可能是沒有主鍵字段時默認(rèn)的第一個字段 ) ,而且可以賦給數(shù)字串, newxy( 新坐標(biāo) ) 會為其賦值,否則如果沒有利用 dynaDto.set(String name,Object value) 方法為主關(guān)鍵字段賦值, dao.update(dynaDto) 方法會拋出異常。

    ?

    二、 DAO 類簡介:

    newxy( 新坐標(biāo) ) 最終對數(shù)據(jù)的操作是通過 net.newxy.dbm.DBM 的一些方法實現(xiàn)的。操作數(shù)據(jù)時對數(shù)據(jù)庫連接采用遲連接,早釋放的原則。 net.newxy.dbm.BaseDAO 繼承自 net.newxy.dbm.DBM, 實現(xiàn)了 DBM 類的唯一抽象方法 Connection getConnection(String dsJndi) throws Exception

    1 DAO 類及相關(guān)類的類圖

    ??? net.newxy.dbm.BaseDAO及相關(guān)類的類圖

    2 net.newxy.dbm.BaseDAO 類獲取數(shù)據(jù)庫連接的方法

    BaseDAO jdbc/default 為數(shù)據(jù)源的資源名。如果沒有 jdbc/default 資源名,以 WEB-INF/classes/ 下的 newxy.properties 文件中定義的 ds.default 的屬性值為數(shù)據(jù)源的資源名,如果通過這樣的資源名還是得不到數(shù)據(jù)庫連接, BaseDAO 嘗試在 WEB-INF/classes/ 下的 newxy.properties 中得到 drvier url user pass 四屬性值來獲取數(shù)據(jù)庫連接。但開發(fā)者可以通過繼承 net.newxy.dbm.DBM net.newxy.dbm..BaseDAO ,過載 Connection getConnection(String dsJndi) throws Exception 方法,通過寫代碼的方法獲取數(shù)據(jù)庫連接。如果前述方法得不到數(shù)據(jù)庫連接, DAO 類實例就會調(diào)用開發(fā)者寫的獲取數(shù)據(jù)庫連接方法。

    請參考: newxy.properites數(shù)據(jù)庫連接、字符編碼、DAO類的配置文件

    3 .開發(fā)者需要關(guān)心的 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;

    本篇只講解三個帶 * 的方法,它們與持久類有關(guān)。

    ?

    三、 DAO + 通用持久類完成對數(shù)據(jù)庫的操作:

    newxy( 新坐標(biāo) ) 在設(shè)計數(shù)據(jù)插入與更新的方法時采用了 Delphi C++Builder 數(shù)據(jù)更新策略, DataSet 有個方法 ApplyUpdates ,如果是在組件中新增一行,作插入操作,如果是對組件中某條記錄數(shù)據(jù)更改,作更新操作。 newxy( 新坐標(biāo) )net.newxy.dbm.DBM 用個 update(Object dto) 方法,如果持久類對象不含主關(guān)鍵字段值,作插入操作,如果含有的主關(guān)鍵字段值表中已存在,作更新操作。

    1. 數(shù)據(jù)插入: 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");// 設(shè)置表名

    ??????? dynaDto.set(“field1”,”……”);// 為字段 field1 賦值

    ??????? dynaDto.set(“field2”,”……”);// 為字段 field2 賦值

    ??????? Object result=dao.update(dynaDto);

    ??? }catch(Exception e){

    ??????? ......

    }

    例中兩字段 field1 field2 不是主關(guān)鍵字段,不用設(shè)置主關(guān)鍵段值,主關(guān)鍵字段值會自動得到,是原有最大值加一。

    如果設(shè)置主關(guān)鍵字段值,如: dynaDto.set(“id”,”100”);newxy( 新坐標(biāo) ) 會檢查賦給的主關(guān)鍵字值是否已存在,如果存在,作更新 (update) 操作,如果不存在,作插入 (insert) 操作。

    判斷是更新還是插入操作,可以根據(jù)返回的 result 值來判斷,如果 result 值為空,是作更新操作,如果 result 不空是作插入操作。

    Object result=dao.update(dynaDto);

    如果想需要知道自動賦給的主關(guān)鍵字段值,可以用如下方法:

    ??????? Object result=dao.update(dynaDto);

    ??????? Object idValue=null;

    ??????? If(result!=null)

    idValue=((DynaDto)result).get(“id”);

    ??????????? idValue 就是自動賦給的主關(guān)鍵字段值。

    2. 數(shù)據(jù)更新:

    ?? ?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");// 設(shè)置表名

    ??????? dynaDto.set(“id”,”……”);// 為主關(guān)鍵字段賦值

    ??????? dynaDto.set(“field1”,”……”);// 為字段 field1 賦值

    ??????? dynaDto.set(“field2”,”……”);// 為字段 field2 賦值

    ??????? Object result=dao.update(dynaDto);

    ??? }catch(Exception e){

    ??????? ......

    }

    與數(shù)據(jù)插入相比增加了 dynaDto.set(“id”,value) 作用是為主關(guān)鍵字段賦值。

    需注意:如果 dynaDto.set(“id”,value) 賦給的 value 在數(shù)據(jù)庫表中已存在, dao.update(dynaDto) 方法仍然作更新操作。

    3. 數(shù)據(jù)刪除

    ?? ?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");// 設(shè)置表名

    ??????? dynaDto.set(“id”,”……”);// 為主關(guān)鍵字段賦值

    ??????? 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");// 設(shè)置表名

    ??????? dynaDto.set(“id”,”……”);// 為主關(guān)鍵字段賦值

    ??????? 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( 新坐標(biāo) ) 獲取數(shù)據(jù)結(jié)果類型分兩種: 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 動態(tài)表單類 DynaActionForm 實現(xiàn)的接口。也是 newxy( 新坐標(biāo) ) 通用持久類 net.newxy.dbm.DynaDto 及通用動態(tài) formBean net.newxy.struts_faces.DynaFormBean 實現(xiàn)的接口。

    newxy(新坐標(biāo))技術(shù)網(wǎng)站:http://www.newxy.net

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 麻豆国产入口在线观看免费| 国产又大又粗又长免费视频| 亚洲成a人片在线播放| 亚洲一卡2卡3卡4卡5卡6卡 | 永久黄网站色视频免费直播| 国产亚洲精品成人AA片| 成**人免费一级毛片| 亚洲av色香蕉一区二区三区| 成人永久免费福利视频网站| 国产成人亚洲午夜电影| 亚洲第一页日韩专区| 精品国产污污免费网站入口在线| 伊人久久大香线蕉亚洲五月天| 永久免费A∨片在线观看| 77777亚洲午夜久久多喷| 成年女人免费视频播放77777| 亚洲男同gay片| 亚洲国产精品自产在线播放| 丝袜足液精子免费视频| 91久久亚洲国产成人精品性色| 国产情侣激情在线视频免费看| 亚洲精品无码久久久久久| 亚洲第一网站男人都懂| 99久久久国产精品免费牛牛| 亚洲黄页网在线观看| 亚洲精品A在线观看| 久久精品私人影院免费看| 久久精品国产亚洲AV久| 亚洲福利精品一区二区三区 | 日韩精品久久久久久免费| 亚洲成a人片毛片在线| 国产一区二区视频免费| 99在线免费视频| 亚洲一区二区三区在线观看蜜桃 | 国产精品高清全国免费观看| 美女无遮挡拍拍拍免费视频| 亚洲综合免费视频| 亚洲 另类 无码 在线| 91视频免费网址| 一级毛片人与动免费观看| 亚洲视频在线观看地址|