用友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的一个关键字和相应的值。

● BeanProcessor 值对象处理器,返回一个JavaBean,结果集中只有一行数据,该处理

器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为”name”的字段,那么只要该java对象中有getName()方法就能把结果集合中”name”对应的值映射到对象中。

●BeanProcessor 值对象集合处理器,返回一个ArrayList集合,集合中的每一个元素是

一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanProcess同理。

●ColumnProcessor 列值处理器,返回一个Java对象,结果集中只有一行数据,该对象

对应与结果集中某一列的值,该处理器通过结果集列的序号或名称来确定列。

●BeanMappingListProcessor:值对象集合处理器,根据映射信息返回一个ArrayList

集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanMappingProcess同理

●BeanMappingProcessor:值对象处理器,根据映射信息返回一个JavaBean,结果集中

只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为”name”的字段,那么只要该java对象中有getName()方法就能把结果集合中”name”对应的值映射到对象中

上述的默认实现并不能满足所有的业务需求,在开发过程中还需要实现自定义的结果集处理器。如:
用友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
仅用于学习。