轉載于:http://www.wendangku.net/doc/4da658764b73f242326c5f3c.html
僅用于學習。
NC資料庫持久化學習
1、案例的應用場景概述:
在NC的開發中可以直接通過JDBC程式設計來通路資料庫。JDBC可以說是JAVA通路關系資料庫的最原始、最直接的方法。這種方式的優點是運作效率高,缺點是在Java程式代碼中嵌入大量SQL語句,備援是不可避免的,開發人員常常發現自己在一次又一次地編寫相同的普通代碼,如獲得連接配接、準備語句、循環結果集以及其他一些 JDBC 特定元素,使得項目難以維護。特别是當涉及到非常多的關系資料表、需要在多個不同類型的關系資料庫系統中使用時,通過在程式中使用JDBC開發實施起來更加困難。
是以引入對象-關系映射是提高開發效率、提升軟體産品的可維護、擴充性的現實需要。實踐表明,在基于資料處理為主的企業級應程式開發中,通過引入對象-關系映射中間件,可以節省與對象持久化有關的程式設計工作量,同時提升軟體産品可維護及易擴充性,提升軟體産品品質。是以,在NC的業務開發中必要通過引入對象-關系映射系統中間件,實作資料庫的快速開發。目前NC可以通過JDBC開發了單獨的持久化層,把資料庫通路操作封裝起來,提供簡潔的API,供業務層統一調用,實作了自己的ORM系統。
通過NC資料庫通路架構可以把記憶體中的對象持久化到資料庫、把資料庫中的關系資料加載到記憶體中,同時保證了系統頻繁地通路資料庫的性能,降低通路資料庫的頻率。
2、具體解決方案(描述):
2.1通過JDBC FrameWork通路資料庫
2.1.1 JdbcSession的建立
2.1.2結果集合的處理,即查詢結果集合說明
對查詢結果集合的處理,主要由ResultSetProcessor類來實作,這是一個接口ResultSetProcessor包含有一個簡單的方法,不同的ResultSetProcessor實作傳回不同的結果對象。系統提供了一系列常用的預設實作。
用友NCV6.1 NC資料庫持久化學習
●ArrayProcessor 數組處理器,傳回一個對象數組,結果集中隻有一行資料,其中結果集中每一列對應數組的一個元素。
●ArrayListProcessor 數組集合處理器,傳回一個ArrayList集合,集合中的每一個元素是一個數組,每個數組對應結果集中的一行資料,其中結果集中每一列對應數組的一個元素。
●MapProcessor HashMap處理器,傳回一個HashMap, 結果集中隻有一行資料,其中結果集合中每一列的列名和列值對應HashMap的一個關鍵字和相應的值。
●MapListProcessor HashMap集合處理器,傳回一個ArrayList集合,集合中的每一個元素是一個HashMap,每個HashMap對應結果集中的一行資料, 其中結果集合中每一列的列名和列值對應HashMap的一個關鍵字和相應的值。
●BeanListProcessor 值對象集合處理器,傳回一個ArrayList集合,集合中的每一個元素是一個javaBean,每個javaBean對應結果集合中一行資料,其中每個JavaBean中的資料映射關系和BeanProcess同理。
● BeanProcessor 值對象處理器,傳回一個JavaBean,結果集中隻有一行資料,該處理器能自動把結果集中的值按列的名稱映射到javaBean中,如結果集中有名稱為”name”的字段,那麼隻要該java對象中有getName()方法就能把結果集合中”name”對應的值映射到對象中。
●ColumnProcessor 列值處理器,傳回一個Java對象,結果集中隻有一行資料,該對象對應與結果集中某一列的值,該處理器通過結果集列的序号或名稱來确定列。
●ColumnListProcessor 列值處理器,傳回一個阿ArrayList對象,結果集中有多行資料,該對象對應與結果集中某一列的值,該處理器通過結果集列的序号或名稱來确定列
●BeanMappingProcessor:值對象處理器,根據映射資訊傳回一個JavaBean,結果集中隻有一行資料,該處理器能自動把結果集中的值按列的名稱映射到javaBean中,如結果集中有名稱為”name”的字段,那麼隻要該java對象中有getName()方法就能把結果集合中”name”對應的值映射到對象中
●BeanMappingListProcessor:值對象集合處理器,根據映射資訊傳回一個ArrayList集合,集合中的每一個元素是一個javaBean,每個javaBean對應結果集合中一行資料,其中每個JavaBean中的資料映射關系和BeanMappingProcess同理
上述的預設實作并不能滿足所有的業務需求,在開發過程中還需要實作自定義的結果集處理器。如:
2.1.3更新的實作
I)無參數更新資料
II)帶參數更新資料
III)批量帶參數更新資料
IV)批量無參數更新
2.2通過BaseDAO進行對象的持久化
2.2.1普通Java Bean的持久化
I)對象定義
Person.java
在定義了Person類以後,需要将Person類映射成資料表,需要注意的是目前的持久層對Java Bean和資料表之間的關系有一定限制,如一個Java Bean隻能映射成一個資料表。下面這個例子,我們使用一個簡單的表,将一個表映射成一個Java Bean,Java Bean 和表是一對一的關系。
Person.sql
II)構造資料映射對象
負責定義資料庫與javaBean的映射資訊的接口定義如下:
根據ImappingMeta接口的定義,可以知道任何實作了ImappingMeta接口的對象映射中繼資料類都必須提供Java bean對應的資料庫表名稱、主鍵名稱、字段名稱,以及和資料庫字段一一對應的Java bean對象的屬性名稱。根據前面的例子我們可以定義Person.java的對象映射中繼資料類PersonVOMeta.java
注意對象映射中繼資料類命名規範為nc.vo.xxx.XXXVOMeta
在完成了對象映射中繼資料類後,就剩下的應用的編碼工作了。為簡化這個工作,在NC 系統中提供了nc.bs.dao.BaseDAO,該類是資料庫通路幫助類封裝了常用的持久層通路操作,提供了IUAPQueryBS和IVOPersistence以及superDMO中的所有方法。建議新的代碼都使用BaseDAO。
BaseDAO dao=new BaseDAO()//使用預設的資料源
BaseDAO dao=new BaseDAO(dataSource)//使用指定的資料源
III)對象讀取
BaseDAO對象已完成初始化,就可以友善地使用它了。首先,我們用它從資料庫中讀取一個Person對象。(在本例中,假設PERSON表中已存在10條記錄,ID從1到10)。要從資料庫中得到一個Person對象,隻需要BaseDAO執行個體。讓我們讀入ID是5的Person對象。
IV)對象寫入
現在建立一個Person對象,并将它寫入資料庫。
如果想要保留Person類中的主鍵并插入到資料表中應該使用
dao.insertObjectWithPK(person,meta);
V)對象更新
現在利用Person對象,更新資料庫中的ID=4的對應資料
VI)對象删除
現在利用Person對象,删除資料庫中的ID=4的對應資料
3、個人學習總結及使用經驗:
在資料庫開發時,JDBC FrameWork及BaseDAO兩種方式都有各自的用途,下面說一下我對這兩種方式的使用心得:
JDBC FrameWork的方式針對操作SQL比較靈活,且對結果集的不同類型處理友善了對結果集資料的使用,其實作模式針對接口程式設計也是被推崇的程式設計模式,值得開發人員學習。對于結果集的處理方式也與Apache的資料庫操作元件Common Dbutils相似,對于資料表的讀操作,Common Dbutils可以把結果轉換成List,Array,Set等java 集合。
BaseDAO更展現ORM的思想,友善VO的映射,對資料模型的操控比較便捷。ORM思想早已深入每個開發人員的程式設計思想,有效的提高了資料庫操作的高效性。在單據開發時,因為大多定義了中繼資料模型,應用BaseDAO可以很友善地進行單據的CURD操作。
另外,除上述的資料庫操作方式外,我也會通過繼承NC中的DataManageObject,擷取資料庫連接配接後,編寫自己的JDBC操作,例如:
轉載于:http://www.wendangku.net/doc/4da658764b73f242326c5f3c.html
僅用于學習。