天天看點

用友NCV6.1 NC資料庫持久化學習

轉載于: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的建立

用友NCV6.1 NC資料庫持久化學習
用友NCV6.1 NC資料庫持久化學習

2.1.2結果集合的處理,即查詢結果集合說明

對查詢結果集合的處理,主要由ResultSetProcessor類來實作,這是一個接口ResultSetProcessor包含有一個簡單的方法,不同的ResultSetProcessor實作傳回不同的結果對象。系統提供了一系列常用的預設實作。

用友NCV6.1 NC資料庫持久化學習

用友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同理

上述的預設實作并不能滿足所有的業務需求,在開發過程中還需要實作自定義的結果集處理器。如:

用友NCV6.1 NC資料庫持久化學習

2.1.3更新的實作

I)無參數更新資料

用友NCV6.1 NC資料庫持久化學習

II)帶參數更新資料

用友NCV6.1 NC資料庫持久化學習

III)批量帶參數更新資料

用友NCV6.1 NC資料庫持久化學習

IV)批量無參數更新

用友NCV6.1 NC資料庫持久化學習
用友NCV6.1 NC資料庫持久化學習

2.2通過BaseDAO進行對象的持久化

2.2.1普通Java Bean的持久化

I)對象定義

Person.java

用友NCV6.1 NC資料庫持久化學習

在定義了Person類以後,需要将Person類映射成資料表,需要注意的是目前的持久層對Java Bean和資料表之間的關系有一定限制,如一個Java Bean隻能映射成一個資料表。下面這個例子,我們使用一個簡單的表,将一個表映射成一個Java Bean,Java Bean 和表是一對一的關系。

Person.sql

用友NCV6.1 NC資料庫持久化學習
用友NCV6.1 NC資料庫持久化學習

II)構造資料映射對象

負責定義資料庫與javaBean的映射資訊的接口定義如下:

用友NCV6.1 NC資料庫持久化學習

根據ImappingMeta接口的定義,可以知道任何實作了ImappingMeta接口的對象映射中繼資料類都必須提供Java bean對應的資料庫表名稱、主鍵名稱、字段名稱,以及和資料庫字段一一對應的Java bean對象的屬性名稱。根據前面的例子我們可以定義Person.java的對象映射中繼資料類PersonVOMeta.java

注意對象映射中繼資料類命名規範為nc.vo.xxx.XXXVOMeta

用友NCV6.1 NC資料庫持久化學習

在完成了對象映射中繼資料類後,就剩下的應用的編碼工作了。為簡化這個工作,在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對象。

用友NCV6.1 NC資料庫持久化學習

IV)對象寫入

現在建立一個Person對象,并将它寫入資料庫。

用友NCV6.1 NC資料庫持久化學習

如果想要保留Person類中的主鍵并插入到資料表中應該使用

dao.insertObjectWithPK(person,meta);

V)對象更新

現在利用Person對象,更新資料庫中的ID=4的對應資料

用友NCV6.1 NC資料庫持久化學習

VI)對象删除

現在利用Person對象,删除資料庫中的ID=4的對應資料

用友NCV6.1 NC資料庫持久化學習
用友NCV6.1 NC資料庫持久化學習

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操作,例如:

用友NCV6.1 NC資料庫持久化學習
用友NCV6.1 NC資料庫持久化學習

轉載于:http://www.wendangku.net/doc/4da658764b73f242326c5f3c.html

僅用于學習。

nc

繼續閱讀