隨筆-39  評(píng)論-33  文章-0  trackbacks-0

          DAO + 通用持久類,實(shí)現(xiàn)數(shù)據(jù)增、刪、改、查

          ?

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

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

          一、通用持久類簡(jiǎn)介:

          1 net.newxy.dbm.DynaDto 類圖

          net.newxy.dbm.DynaDto類圖

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

          對(duì)數(shù)據(jù)的增、刪、改都是以通用持久類對(duì)象為參數(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ù)庫(kù)表名

          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ù)庫(kù)字段類型對(duì)應(yīng)的 java 類型,或它們的 .toString() 字符串符。如字段類型是 int value 可以是 Integer 類型或字符串型,如在 sybase 里字段類型是 smalldatetime 類型, value 應(yīng)是 java.sql.Timestamp 類型或字符串型。

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

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

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

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

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

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

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

          ?

          二、 DAO 類簡(jiǎn)介:

          newxy( 新坐標(biāo) ) 最終對(duì)數(shù)據(jù)的操作是通過 net.newxy.dbm.DBM 的一些方法實(shí)現(xiàn)的。操作數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)庫(kù)連接采用遲連接,早釋放的原則。 net.newxy.dbm.BaseDAO 繼承自 net.newxy.dbm.DBM, 實(shí)現(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ù)庫(kù)連接的方法

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

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

          3 .開發(fā)者需要關(guān)心的 DAO 類幾個(gè)方法

          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;

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

          ?

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

          newxy( 新坐標(biāo) ) 在設(shè)計(jì)數(shù)據(jù)插入與更新的方法時(shí)采用了 Delphi C++Builder 數(shù)據(jù)更新策略, DataSet 有個(gè)方法 ApplyUpdates ,如果是在組件中新增一行,作插入操作,如果是對(duì)組件中某條記錄數(shù)據(jù)更改,作更新操作。 newxy( 新坐標(biāo) )net.newxy.dbm.DBM 用個(gè) update(Object dto) 方法,如果持久類對(duì)象不含主關(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)鍵字段值會(huì)自動(dòng)得到,是原有最大值加一。

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

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

          Object result=dao.update(dynaDto);

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

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

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

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

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

          ??????????? idValue 就是自動(dòng)賦給的主關(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ù)庫(kù)表中已存在, 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 是開源項(xiàng)目的一個(gè)類和一個(gè)接口。 org.apache.commons.beanutils.DynaBean 接口正是 struts 動(dòng)態(tài)表單類 DynaActionForm 實(shí)現(xiàn)的接口。也是 newxy( 新坐標(biāo) ) 通用持久類 net.newxy.dbm.DynaDto 及通用動(dòng)態(tài) formBean net.newxy.struts_faces.DynaFormBean 實(shí)現(xiàn)的接口。

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 木兰县| 尼勒克县| 清水县| 双鸭山市| 昌平区| 阳春市| 涿鹿县| 清丰县| 晴隆县| 千阳县| 曲水县| 丘北县| 洪雅县| 仁寿县| 衡南县| 丰都县| 津市市| 云和县| 房产| 嘉禾县| 鹿邑县| 兴城市| 福泉市| 阆中市| 华蓥市| 泰来县| 特克斯县| 忻城县| 高碑店市| 新蔡县| 紫阳县| 正蓝旗| 利川市| 佛学| 青浦区| 建宁县| 遂川县| 商丘市| 临武县| 大悟县| 柘城县|