




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、NC数据库持久化学习 1、案例的应用场景概述:在NC的开发中可以直接通过JDBC编程来访问数据库。JDBC可以说是JAVA访问关系数据库的最原始、最直接的方法。这种方式的优点是运行效率高,缺点是在Java程序代码中嵌入大量SQL语句,冗余是不可避免的,开发人员常常发现自己在一次又一次地编写相同的普通代码,如获得连接、准备语句、循环结果集以及其他一些 JDBC 特定元素,使得项目难以维护。特别是当涉及到非常多的关系数据表、需要在多个不同类型的关系数据库系统中使用时,通过在程序中使用JDBC开发实施起来更加困难。所以引入对象关系映射是提高开发效率、提升软件产品的可维护、扩展性的现实需要。实践表明,
2、在基于数据处理为主的企业级应程序开发中,通过引入对象-关系映射中间件,可以节省与对象持久化有关的编程工作量,同时提升软件产品可维护及易扩展性,提升软件产品质量。因此,在NC的业务开发中必要通过引入对象-关系映射系统中间件,实现数据库的快速开发。目前NC可以通过JDBC开发了单独的持久化层,把数据库访问操作封装起来,提供简洁的API,供业务层统一调用,实现了自己的ORM系统。 通过NC数据库访问框架可以把内存中的对象持久化到数据库、把数据库中的关系数据加载到内存中,同时保证了系统频繁地访问数据库的性能,降低访问数据库的频率。2、具体解决方案(描述):2.1通过JDBC FrameWork访问数据
3、库2.1.1 JdbcSession的创建PersistenceManager sessionManager= PersistenceManager. getInstance ();try JdbcSession session = sessionManager. getJdbcSession ();/开始jdbc会话 相关业务操作 catch (DbException e) finally sessionManager. release ();/需要关闭会话2.1.2结果集合的处理对查询结果集合的处理,主要由ResultSetProcessor类来实现,这是一个接口 ResultSetPro
4、cessor包含有一个简单的方法,不同的ResultSetProcessor实现返回不同的结果对象。系统提供了一系列常用的默认实现。l ArrayProcessor 数组处理器,返回一个对象数组,结果集中只有一行数据,其中结果集中每一列对应数组的一个元素。l ArrayListProcessor 数组集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个数组,每个数组对应结果集中的一行数据,其中结果集中每一列对应数组的一个元素。l MapProcessor HashMap处理器,返回一个HashMap, 结果集中只有一行数据,其中结果集合中每一列的列名和列值对应HashMap的一
5、个关键字和相应的值。l MapListProcessor HashMap集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个HashMap,每个HashMap对应结果集中的一行数据, 其中结果集合中每一列的列名和列值对应HashMap的一个关键字和相应的值。l BeanProcessor 值对象处理器,返回一个JavaBean,结果集中只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为”name”的字段,那么只要该java对象中有getName()方法就能把结果集合中”name”对应的值映射到对象中。l BeanProcessor
6、值对象集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanProcess同理。l ColumnProcessor 列值处理器,返回一个Java对象,结果集中只有一行数据,该对象对应与结果集中某一列的值,该处理器通过结果集列的序号或名称来确定列。l BeanMappingListProcessor:值对象集合处理器,根据映射信息返回一个ArrayList集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中
7、的数据映射关系和BeanMappingProcess同理l BeanMappingProcessor:值对象处理器,根据映射信息返回一个JavaBean,结果集中只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为”name”的字段,那么只要该java对象中有getName()方法就能把结果集合中”name”对应的值映射到对象中上述的默认实现并不能满足所有的业务需求,在开发过程中还需要实现自定义的结果集处理器。如:public class CustomProcessor extends BaseProcessor public Object proc
8、essResultSet(ResultSet rs) throws SQLException 自定义实现 2.1.3更新的实现I) 无参数更新数据PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/开始jdbc会话 String sql = "update bd_invmandoc set pk_invmandoc ='0001
9、AA10000000000DDD' where pk_invmandoc='0001AA10000000000DDD' " session.executeUpdate(sql); catch (DbException e) finally if(sessionManager!=null) sessionManager. release ();/需要关闭会话II) 带参数更新数据PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance ()
10、; 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会
11、将参数对象中的每个对象放入到预处理对象的相应位置 session.executeUpdate(sql,parameter); catch (DbException e) finally if(sessionManager!=null) sessionManager. release ();/需要关闭会话III) 批量带参数更新数据PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. g
12、etJdbcSession ();/开始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.execu
13、teBatch(); catch (DbException e) finally if(sessionManager!=null)sessionManager. release ();/需要关闭会话IV) 批量无参数更新PersistenceManager sessionManager=null;try sessionManager =PersistenceManager. getInstance (); JdbcSession session = sessionManager. getJdbcSession ();/开始jdbc会话 String sql = "update bd_
14、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 ();/需要关闭会话2.2通过BaseDAO进行对象的持久化2.2.1普通Java Bean的
15、持久化I) 对象定义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 B
16、ean,Java Bean和表是一对一的关系。Person.sqlCREATE TABLE PERSON( ID NUMBER (5, 0) NOT NULL, NAME VARCHAR (40) NOT NULL, AGE NUMBER (3, 0) NOT NULL,PRIMARY KEY (ID) )II) 构造数据映射对象负责定义数据库与javaBean的映射信息的接口定义如下:public interface IMappingMeta /* * 得到该数据库表的主键名称 * return 主键名称 */ public abstract String getPrimaryKey();
17、/* * 得到值对象对应的表名 * return 表名 */ public abstract String getTableName(); /* * 得到值对象的属性数组 * return */ public abstract String getAttributes(); /* * 得到值对象的属性数组一一对应的表的列名数组 * return */ public abstract String getColumns();根据ImappingMeta接口的定义,可以知道任何实现了ImappingMeta接口的对象映射元数据类都必须提供Java bean对应的数据库表名称、主键名称、字段名称,以
18、及和数据库字段一一对应的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" ;p
19、rivate 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; 在完成了对象映射元数据类后,就剩下的
20、应用的编码工作了。为简化这个工作,在NC系统中提供了nc.bs.dao.BaseDAO,该类是数据库访问帮助类封装了常用的持久层访问操作,提供了IUAPQueryBS和IVOPersistence以及superDMO中的所有方法。建议新的代码都使用BaseDAO。BaseDAO daonew BaseDAO()/使用默认的数据源BaseDAO dao=new BaseDAO(dataSource)/使用指定的数据源III) 对象读取BaseDAO对象已完成初始化,就可以方便地使用它了。首先,我们用它从数据库中读取一个Person对象。(在本例中,假设PERSON表中已存在10条记录,ID从1到
21、10)。 要从数据库中得到一个Person对象,只需要BaseDAO实例。让我们读入ID是5的Person对象。BaseDAO dao=new BaseDAO();PersonVOMeta meta=new PersonVOMeta();dao.retrieveByClause(Person.class,meta,"id=5");IV) 对象写入现在创建一个Person对象,并将它写入数据库。 BaseDAO dao=new BaseDAO();Person person=new Person();person.setName(“tom”);person.setAge(“2
22、0”);PersonVOMeta meta=new PersonVOMeta();dao.insertObject(person,meta);/默认会自动为Person对象生成主键如果想要保留Person类中的主键并插入到数据表中应该使用dao.insertObjectWithPK(person,meta);V) 对象更新现在利用Person对象,更新数据库中的ID=4的对应数据BaseDAO dao=new BaseDAO();Person person=new Person();Person.setId(4);person.setName(“tom”);person.setAge(“20”
23、);PersonVOMeta meta=new PersonVOMeta();dao.updateObject(person,meta);VI) 对象删除现在利用Person对象,删除数据库中的ID=4的对应数据BaseDAO dao=new BaseDAO();Person person=new Person();Person.setId(“4”);PersonVOMeta meta=new PersonVOMeta();dao.deleteObject (person,meta);3、个人学习总结及使用经验:在数据库开发时,JDBC FrameWork及BaseDAO两种方式都有各自的用途
24、,下面说一下我对这两种方式的使用心得:JDBC FrameWork的方式针对操作SQL比较灵活,且对结果集的不同类型处理方便了对结果集数据的使用,其实现模式针对接口编程也是被推崇的编程模式,值得开发人员学习。对于结果集的处理方式也与Apache的数据库操作组件Common Dbutils相似,对于数据表的读操作,Common Dbutils可以把结果转换成List,Array,Set等java集合。BaseDAO更体现ORM的思想,方便VO的映射,对数据模型的操控比较便捷。ORM思想早已深入每个开发人员的编程思想,有效的提高了数据库操作的高效性。在单据开发时,因为大多定义了元数据模型,应用BaseDAO可以很方便地进行单据的CURD操作。另外,除上述的数据库操作方式外,我也会通过继承NC中的DataManageObject,获取数据库连接后,编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁省沈阳市大东区达标名校2024-2025学年初三第二次月考试卷含答案
- 未成年人思想道德建设体系与实践路径
- 2025年公务员面试考试试题及答案模拟题
- 文物保护儿童课件
- 四人抢答器数字电路设计
- 2025年中国油尺市场调查研究报告
- 2025年中国平式展示柜市场调查研究报告
- 2025年中国多能量X射线安全检查设备市场调查研究报告
- 2025年中国塑胶改质剂市场调查研究报告
- 2025年中国台式自动捆钞机市场调查研究报告
- GB/T 4909.2-2009裸电线试验方法第2部分:尺寸测量
- DB11-T 065-2022电气防火检测技术规范
- 09S304 卫生设备安装图集
- 肌肉注射操作评分标准
- 配电箱验收记录表
- DB11-T1788-2020技术转移服务人员能力规范
- 建设项目用地预审与选址意见课件讲解
- GB∕T 23524-2019 石油化工废铂催化剂化学分析方法 铂含量的测定 电感耦合等离子体原子发射光谱法
- 宝宝生日祝福可爱卡通电子相册PPT模板
- 盗窃案件现场勘查应注意的问题
- 用人单位职业健康监护档案(一人一档)
评论
0/150
提交评论