




已閱讀5頁,還剩18頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
此文件受到UFIDA的保護, 并已在保護中心注冊, 外泄必糾!UFIDA GUID13AEF1E69-B33F-02DC-7A9D-A9F89BB24BDDUFIDA GUID16CD90F67-283F-D8D4-6A8A-A821CF9A4C79持久層技術紅皮書NC-UAP 5.0用友NC-UAP2020-01-111第 頁目 錄第一章前言11.NC數據訪問層特點1第二章JDBC FrameWork31.JdbcSession的創建:32.數據訪問異常的處理43.結果集合的處理44.更新的實現64.1無參數更新數據64.2帶參數更新數據74.3批量帶參數更新數據84.4批量無參數更新85.JdbcSession中特殊參數類型9第三章對象的持久化121.普通Java Bean的持久化121.1對象定義121.2構造數據映射對象131.3對象讀取151.4對象寫入151.5對象更新161.6對象刪除162.SuperVO的持久化16第四章常用的API的使用181PersistenceManager182IVOPersistence持久化機制接口193IUAPQueryBS接口194結果集的控制20附錄211.常見問題解析21第 21 頁第一章 前言在NC的開發中可以直接通過JDBC編程來訪問數據庫。JDBC可以說是JAVA訪問關系數據庫的最原始、最直接的方法。這種方式的優點是運行效率高,缺點是在Java程序代碼中嵌入大量SQL語句,冗余是不可避免的,開發人員常常發現自己在一次又一次地編寫相同的普通代碼,如獲得連接、準備語句、循環結果集以及其他一些 JDBC 特定元素,使得項目難以維護。特別是當涉及到非常多的關系數據表、需要在多個不同類型的關系數據庫系統中使用時,通過在程序中使用JDBC開發實施起來更加困難。所以引入對象關系映射是提高開發效率、提升軟件產品的可維護、擴展性的現實需要。實踐表明,在基于數據處理為主的企業級應程序開發中,通過引入對象-關系映射中間件,可以節省與對象持久化有關的差不多40%的編程工作量,同時提升軟件產品可維護及易擴展性,提升軟件產品質量。因此,在NC的業務開發中必要通過引入對象-關系映射系統中間件,實現數據庫的快速開發。目前NC可以通過JDBC開發了單獨的持久化層,把數據庫訪問操作封裝起來,提供簡潔的API,供業務層統一調用,實現了自己的ORM系統。 通過NC數據庫訪問框架可以把內存中的對象持久化到數據庫、把數據庫中的關系數據加載到內存中,同時保證了系統頻繁地訪問數據庫的性能,降低訪問數據庫的頻率。 1. NC數據訪問層特點具有透明性 業務對象在不知道數據訪問實現的具體細節情況下,可以使用數據源。由于實現細節隱藏在數據訪問層的內部,所以訪問是透明的。 易于遷移 數據訪問層使應用程序很容易遷移到其他數據庫實現。業務對象不了解底層的數據實現,所以遷移僅僅涉及到修改數據訪問層。減少業務對象中代碼復雜性 因為數據訪問層管理著所有的數據訪問復雜性,所以它可以簡化業務對象和使用數據訪問層的其他數據客戶端的代碼。數據訪問層,含有許多與實現相關的代碼(例如SQL語句)。這樣給開發人員帶來了更高的效率、更好的可維護性、提高了代碼的可讀性等一系列好處。 易于維護和管理把所有的數據訪問集中在單獨的層上,由于所有的數據訪問操作現在都委托給數據訪問層,集中化管理數據訪問。這種集中化可以使應用程序易于維護和管理。 第二章 JDBC FrameWorkNC系統與數據庫進行交互需要反復地調用SQL語句、連接管理、事務生命周期、結果處理和異常處理。這些操作都是很常見的;不過這個重復的使用并不是必要的。通過新數據訪問框架可以解決與一個兼容JDBC的數據庫的重復交互問題。Jdbc Framework特點:1. 靈活2. 簡潔3. 高的容錯性4. 異常的統一處理利用JdbcSession執行一個SQL,幾乎不需要代碼。你所需要的全部僅僅是一個數據源和一個JdbcSession。 一旦你得到了它們,你將可以使用JdbcSession提供的大量方便的方法1. JdbcSession的創建:PersistenceManager sessionManager= PersistenceManager. getInstance ();try JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 相關業務操作 catch (DbException e) finally sessionManager. release ();/需要關閉會話2. 數據訪問異常的處理DbException是一個抽象異常類, 它被用來處理SQLException和我們的數據訪問異常之間的轉換。在數據訪問框架中提供了不同數據庫對不同DbException的實現并對每種數據庫的SQLErrorCode進行了處理,統一轉化成不同的方法,通過DbException能夠精確的指定出數據訪問過程中所出現的問題。try 數據訪問過程 catch (DbException e) /根據數據庫的不同統一異常處理if(e.isBadSQLGrammar()/如果是語法錯誤 /to do 相關處理 if(e.isDataIntegrityViolation()/如果是數據一致性錯誤 /to do 相關處理finally /關閉會話3. 結果集合的處理對查詢結果集合的處理,主要由ResultProcessor類來實現,這是一個接口 ResultProcessor包含有一個簡單的方法,不同的ResultProcessor實現返回不同的結果對象。系統提供了一系列常用的默認實現。l ArrayProcessor 數組處理器,返回一個對象數組,結果集中只有一行數據,其中結果集中每一列對應數組的一個元素。l ArrayListProcessor 數組集合處理器,返回一個ArrayList集合,集合中的每一個元素是一個數組,每個數組對應結果集中的一行數據,其中結果集中每一列對應數組的一個元素。l MapProcessor HashMap處理器,返回一個HashMap, 結果集中只有一行數據,其中結果集合中每一列的列名和列值對應HashMap的一個關鍵字和相應的值。l MapListProcessor HashMap集合處理器,返回一個ArrayList集合,集合中的每一個元素是一個HashMap,每個HashMap對應結果集中的一行數據, 其中結果集合中每一列的列名和列值對應HashMap的一個關鍵字和相應的值。l BeanProcessor 值對象處理器,返回一個JavaBean,結果集中只有一行數據,該處理器能自動把結果集中的值按列的名稱映射到javaBean中,如結果集中有名稱為”name”的字段,那么只要該java對象中有getName()方法就能把結果集合中”name”對應的值映射到對象中。l BeanProcessor 值對象集合處理器,返回一個ArrayList集合,集合中的每一個元素是一個javaBean,每個javaBean對應結果集合中一行數據,其中每個JavaBean中的數據映射關系和BeanProcess同理。l ColumnProcessor 列值處理器,返回一個Java對象,結果集中只有一行數據,該對象對應與結果集中某一列的值,該處理器通過結果集列的序號或名稱來確定列。l BeanMappingListProcessor:值對象集合處理器,根據映射信息返回一個ArrayList集合,集合中的每一個元素是一個javaBean,每個javaBean對應結果集合中一行數據,其中每個JavaBean中的數據映射關系和BeanMappingProcess同理l BeanMappingProcessor:值對象處理器,根據映射信息返回一個JavaBean,結果集中只有一行數據,該處理器能自動把結果集中的值按列的名稱映射到javaBean中,如結果集中有名稱為”name”的字段,那么只要該java對象中有getName()方法就能把結果集合中”name”對應的值映射到對象中上述的默認實現并不能滿足所有的業務需求,在開發過程中還需要實現自定義的結果集處理器。如:public class CustomProcessor extends BaseProcessor public Object processResultSet(ResultSet rs) throws SQLException 自定義實現 4. 更新的實現4.1 無參數更新數據PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql = update bd_invmandoc set pk_invmandoc =0001AA10000000000DDD where pk_invmandoc=0001AA10000000000DDD ; session.executeUpdate(sql); catch (DbException e) finally if(sessionManager!=null) sessionManager. release ();/需要關閉會話4.2 帶參數更新數據PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話String sql = update bd_invmandoc set pk_invmandoc =0001AA10000000000DDD where pk_invmandoc=?”; SQLParameter parameter = new SQLParameter(); 構造參數對象 parameter.addParam(0001AA10000000000DDD);添加參數,JdbcSession會將參數對象中的每個對象放入到預處理對象的相應位置 session.executeUpdate(sql,parameter); catch (DbException e) finally if(sessionManager!=null) sessionManager. release ();/需要關閉會話4.3 批量帶參數更新數據PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql = update bd_invmandoc set pk_invmandoc =0001AA10000000000DDD where pk_invmandoc=? ; SQLParameter parameter = new SQLParameter(); parameter.addParam(0001AA10000000000DDD); session.addBatch(sql, parameter); int rows = session.executeBatch(); catch (DbException e) finally if(sessionManager!=null)sessionManager. release ();/需要關閉會話4.4 批量無參數更新PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql = update bd_invmandoc set pk_invmandoc =0001AA10000000000DDD where pk_invmandoc= 0001AA10000000000DDD ; session.addBatch(sql); int rows = session.executeBatch(); catch (DbException e) finally if(sessionManager!=null)sessionManager. release ();/需要關閉會話5. JdbcSession中特殊參數類型在JdbcSession中有3中特殊的參數特性Null,Blob,Clob;使用Null參數類型PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql =更新或插入Null字段的SQL語句 SQLParameter parameter = new SQLParameter(); parameter. addNullParam (Types.INTEGER); session.addBatch(sql, parameter); int rows = session.executeBatch(); catch (DbException e) finally if(sessionManager!=null)sessionManager. release ();/需要關閉會話 使用Blob參數類型PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql =更新或插入Blob字段的SQL語句 SQLParameter parameter = new SQLParameter(); parameter. addBlobParam (new Object(); session.addBatch(sql, parameter); int rows = session.executeBatch(); catch (DbException e) finally if(sessionManager!=null)session.closeAll();/關閉會話使用Clob參數類型SessionManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/開始jdbc會話 String sql =更新或插入Clob字段的SQL語句 SQLParameter parameter = new SQLParameter(); parameter. addClobParam (new String(); session.addBatch(sql, parameter); int rows = session.executeBatch(); catch (DbException e) finally if(sessionManager!=null)session.closeAll();/關閉會話第三章 對象的持久化通過持久層框架可以很方便的實現把內存中的對象持久化到數據庫、把數據庫中的關系數據加載到內存中。作為入門的一個例子,我們使用一個簡單的Java Bean Person類(注意需要進行持久化的VO類必須符合Java Bean規范) 1. 普通Java Bean的持久化1.1 對象定義Person.java/imports implied. public class Person private int id; private String name; int age;public int getId () return id; public void setId (int id) this.id = id; 在定義了Person類以后,需要將Person類映射成數據表,需要注意的是目前的持久層對Java Bean和數據表之間的關系有一定限制,如一個Java Bean只能映射成一個數據表。下面這個例子,我們使用一個簡單的表,將一個表映射成一個Java Bean,Java Bean和表是一對一的關系。 Person.sql CREATE TABLE PERSON( ID NUMBER (5, 0) NOT NULL, NAME VARCHAR (40) NOT NULL, AGE NUMBER (3, 0) NOT NULL,PRIMARY KEY (ID) )1.2 構造數據映射對象負責定義數據庫與javaBean的映射信息的接口定義如下:public interface IMappingMeta /* * 得到該數據庫表的主鍵名稱 * return 主鍵名稱 */ public abstract String getPrimaryKey(); /* * 得到值對象對應的表名 * return 表名 */ public abstract String getTableName(); /* * 得到值對象的屬性數組 * return */ public abstract String getAttributes(); /* * 得到值對象的屬性數組一一對應的表的列名數組 * return */ public abstract String getColumns();根據ImappingMeta接口的定義,可以知道任何實現了ImappingMeta接口的對象映射元數據類都必須提供Java bean對應的數據庫表名稱、主鍵名稱、字段名稱,以及和數據庫字段一一對應的Java bean對象的屬性名稱。根據前面的例子我們可以定義Person.java的對象映射元數據類PersonVOMeta.java注意對象映射元數據類命名規范為nc.vo.xxx.XXXVOMetaimport nc.jdbc.framework.mapping.IMappingMeta;public class PersonVOMeta implements IMappingMeta private String attributes = new String id, name, age ;private String columns = new String ID, NAME, AGE ;public String getPrimaryKey() return ID;public String getTableName() return Person;public String getAttributes() return attributes;public String getColumns() return columns; 在完成了對象映射元數據類后,就剩下的應用的編碼工作了。為簡化這個工作,在NC系統中提供了nc.bs.dao.BaseDAO,該類是數據庫訪問幫助類封裝了常用的持久層訪問操作,提供了IUAPQueryBS和IVOPersistence以及superDMO中的所有方法。建議新的代碼都使用BaseDAO。BaseDAO daonew BaseDAO()/使用默認的數據源BaseDAO dao=new BaseDAO(dataSource)/使用指定的數據源1.3 對象讀取BaseDAO對象已完成初始化,就可以方便地使用它了。首先,我們用它從數據庫中讀取一個Person對象。(在本例中,假設PERSON表中已存在10條記錄,ID從1到10)。 要從數據庫中得到一個Person對象,只需要BaseDAO實例。讓我們讀入ID是5的Person對象。BaseDAO dao=new BaseDAO();PersonVOMeta meta=new PersonVOMeta();dao.retrieveByClause(Person.class,meta,id=5);1.4 對象寫入現在創建一個Person對象,并將它寫入數據庫。 BaseDAO dao=new BaseDAO();Person person=new Person();person.setName(“tom”);person.setAge(“20”);PersonVOMeta meta=new PersonVOMeta();dao.insertObject(person,meta);/默認會自動為Person對象生成主鍵如果想要保留Person類中的主鍵并插入到數據表中應該使用dao.insertObjectWithPK(person,meta);1.5 對象更新 現在利用Person對象,更新數據庫中的ID=4的對應數據BaseDAO dao=new BaseDAO();Person person=new Person();Person.setId(4);person.setName(“tom”);person.setAge(“20”);PersonVOMeta meta=new PersonVOMeta();dao.updateObject(person,meta); 1.6 對象刪除 現在利用Person對象,刪除數據庫中的ID=4的對應數據BaseDAO dao=new BaseDAO();Person person=new Person();Person.setId(“4”);PersonVOMeta meta=new PersonVOMeta();dao.deleteObject (person,meta);BaseDAO針對Java Bean的持久化(CRUD操作)提供了各種應用不同的方法,具體使用方法和功能請參考BaseDAO的JavaDoc。2. SuperVO的持久化 SuperVO是NC系統中比較特殊的值對象,該值對象自身已經包涵了值對象到數據庫中的映射信息,所以SuperVO的持久化更為簡單方便,無需構造對象映射元數據類,可以直接對VO進行持久化操作。查詢操作:BaseDAO dao=new BaseDAO();Collection vos=dao. retrieveAll (XXXSuperVO.class);/查詢數據表中所有數據到對象集合中更新操作BaseDAO dao=new BaseDAO();XXXSuperVO vo=new XXXSuperVO();dao. updateVO (vo) ;刪除操作BaseDAO dao=new BaseDAO();XXXSuperVO vo=new XXXSuperVO();dao. deleteVO (vo); 插入操作BaseDAO dao=new BaseDAO();XXXSuperVO vo=new XXXSuperVO();dao. insertVO (vo); BaseDAO針對SuperVO的持久化(CRUD操作)提供了各種應用不同的方法,具體使用方法和功能請參考BaseDAO的JavaDoc第四章 常用的API的使用1 PersistenceManager該類主要解決復雜數據的查詢(聯查)和復用數據庫連接的方式,該類能在一個復雜業務中復用一個連接,需要最后在業務結束的時候手動的關閉連接 ,使用該類的優點是在做復雜業務的時候復用連接能夠提高性能,缺點是需要人為關閉連接,如果在開發過程中忘記關閉了連接會導致連接泄露的系統問題。該類建議的使用方法如下:PersistenceManager persistence=null;try persistence= PersistenceManager.getInstance(數據源)JdbcSession session= persistence. getJdbcSession();/數據調用1Session.delete()/數據庫調用2Session.insert()/數據庫調用3Session. excuteQuery ()/或其它方法調用傳入SessionObject o=Call method(Session); catch (DAOException e) Throws new xxBusinessRunTimeException(“”);finalyPersistence. Release();PersistenceManager包括supervo及obj maping的查詢和持久化,PersistenceManager具體提供的方法和功能請參考PersistenceManager的JavaDoc.2 IVOPersistence持久化機制接口該接口提供基本的單表操作,分為支持SuperVO和普通Java Bean,對于通用持久化或泛化持久化,無任何業務邏輯的insert、update、delete操作強烈建議前臺使用該接口,需要業務邏輯的持久化操作必須使用具體的名稱來完成業務方法的Service聲明。IVOPersistence具體提供的方法和功能請參考IVOPersistence的JavaDoc.調用機制private IVOPersistence getVOPersistence() throws BusinessException if (iVOPersistence = null)try iVOPersistence = (IVOPersistence) NCLocator.getInstance().lookup(IVOPersistence.class.getName(); catch (ComponentException e) throw new SysInitException(IUAPQueryBS not found!);return iVOPersistence;3 IUAPQueryBS接口數據庫查詢接口,該接口提供基本的單表查詢操作,支持SuperVO和其它任何含有映射原數據的javaBean的實現機制, IUAPQueryBS具體提供的方法和功能請參考IUAPQueryBS的JavaDoc。調用機制private IUAPQueryBS getUAPQuery() throws BusinessException if (iIUAPQueryBS = null)try iIUAPQueryBS = (IUAPQueryBS) NCLocator.getInstance().lookup(IUAPQue
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子商務法與市場監管基礎知識測試試題及答案
- 2025年高等數學基礎知識應用能力考試試題及答案
- 2025年城市環境保護與可持續發展考核題及答案
- 檔案密集架采購招標文件
- 采購合同履行過程中的質量監控
- 叉車租賃押金擔保及維修服務合同
- 綜合性茶園資源利用與保護承包合同
- 豐收玉米活動方案
- 中考復習指導活動方案
- 醫用氣體使用管理制度
- ZJUTTOP100理工類學術期刊目錄(2018年版)
- F0值計算公式自動
- 《全國統一建筑工程基礎定額河北省消耗量定額》宣貫資料
- (最新整理)《跨文化溝通》PPT課件
- 道路交通事故現場勘查課件
- 門店電表記錄表
- 視頻監控巡查記錄
- 組態王雙機熱備
- 綠地圖繪制指南
- 山體植被恢復項目綠化工程施工組織設計
- 初級長拳現用圖解(第一路)
評論
0/150
提交評論