




已阅读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届八下数学期末综合测试模拟试题含解析
- 2024年宁夏开放大学辅导员考试真题
- 2025届福建省南安市柳城义务教育小片区八年级数学第二学期期末质量跟踪监视试题含解析
- 2024年黑龙江省体育局下属事业单位真题
- 黑龙江省七台河市名校2025届八下数学期末教学质量检测模拟试题含解析
- 2025年四川省成都市锦江区中考二诊物理试题(含答案)
- 储能产业研究白皮书2025摘要版
- 曲靖市社区工作者招聘真题2024
- 2024年新疆阿合奇县事业单位公开招聘村务工作者笔试题带答案
- 基层应急管理能力提升与建设
- 小学生脱口秀课件
- 混凝土配合比试验设计方案
- 抖音陪跑合同协议
- 高三尖子生、边缘生辅导方案2
- 湖北省武汉市2025届高中毕业生四月调研考试政治试题及答案(武汉四调)
- 海鲜门店管理制度
评论
0/150
提交评论