Arch4系统开发指南-数据操作篇_第1页
Arch4系统开发指南-数据操作篇_第2页
Arch4系统开发指南-数据操作篇_第3页
Arch4系统开发指南-数据操作篇_第4页
Arch4系统开发指南-数据操作篇_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 i 页 共 10 页 Arch4 系统开发指南 数据操作篇 技术平台组 Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 I 页 共 10 页 目目 录录 1前言 1 1 1文档编写目的 1 1 2文档适用范围 1 1 3修订历史 1 1 4参考资料 2 2领域层开发 3 2 1数据库操作 3 2 1 1条件查询 3 2 1 2执行 HQL 查询 5 2 1 3执行 SQL 查询 5 2 1 4使用 BLOB CLOB 数据 5 2 1 5如何实现 Sequence 主键生成策略 6 2 1 6获取数据库当前时间 7 2 1 7使用元数据的方式设置读级别 如脏读 7 2 1 8将连表查询变为子查询 7 2 1 9通过锁记录方式解决任务并发问题 8 2 1 10执行 SQL 操作 8 Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 I 页 共 10 页 1前言前言 本文档是 ARCH4 系统开发指南 数据操作篇 文档讲述的内容是基于 ARCH4 架构进行系统开发时进行数 据操作的指导依据 其中讲述的指导规范要求开发人员必须遵守 参与项目开发的任何开发人员如果对本文档讲述的内容有疑问 在开发前请询问项目经理 不允许任何开 发人员以任何理由违反本文档讲述的规范要求 1 1文档编写目的文档编写目的 规范开发思想 约束开发行为 明确系统各种功能的开发方法 1 2文档适用范围文档适用范围 本文档适用于使用 ARCH4 的所有成员 下表是对成员角色的最低要求 项目组成员是否必读要求程度 项目经理 是 否 了解文档结构 明白文档内容 透彻理解 系统分析师 业务 是 否 了解文档结构 明白文档内容 透彻理解 系统分析师 技术 是 否 了解文档结构 明白文档内容 透彻理解 高级程序员 是 否 了解文档结构 明白文档内容 透彻理解 开发工程师 是 否 了解文档结构 明白文档内容 透彻理解 质量保证工程师 是 否 了解文档结构 明白文档内容 透彻理解 对于项目经理 系统分析师 高级程序员和开发工程师 还需要阅读 ARCH4 系统架构设计说明书 和 ARCH4 系统开发规范 1 3修订历史修订历史 修订章节类型日期作者说明 全部创建2007 05 15周咸立ARCH4 架构系统开发指南 全部整理2011 06 27汪浩整理成 ARCH4 系统开发指南 数据操作篇 Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 2 页 共 10 页 1 4参考资料参考资料 参考资料如下 ARCH4 系统开发指南 开发规范篇 ARCH4 系统开发指南 环境搭建篇 ARCH4 系统开发指南 展现层篇 时间戳组件 ins platform history 使用手册 页面多行录入开发指南 Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 3 页 共 10 页 2领域层开发领域层开发 2 1数据库操作数据库操作 2 1 1条件查询条件查询 条件查询请使用架构中提供的方式 这种方式采用了数据库的预处理方式 可以提高执行效率 2 1 1 1 查询示例查询示例 QueryRule queryRule QueryRule getInstance queryRule addLike userName user getUserName queryRule addLike monicker user getMonicker queryRule addLike email user getEmail queryRule addBetween id fromId toId queryRule addBetween loginTime fromLogintime toLogintime queryRule addAscOrder id 调用Service的查询方法 Page page userService find queryRule pageNo pageSize 还有一种更简便的方法 QueryRule queryRule QueryRule getInstance addLike userName user getUserName addLike monicker user getMonicker Page page userService find queryRule pageNo pageSize 注意 userName等属性名必须和实体对象的属性名一致 传入的参数的类型和属性的类型一致 2 1 1 2 查询限制查询限制 QueryRule 是系统支持的帮助限制查询条件的工具类 通过使用它的静态 getInstance 方法来获得 QueryRule 的 一个实例 QueryRule queryRule QueryRule getInstance QueryRule 支持 Like In Between 等几种限制方式 下面将分别说明 2 1 1 2 1 Like Like 支持对单个属性的模糊查询 使用方式为 queryRule addLike userName J 表示查询userName以 J 开头的记录 queryRule addLike userName H 表示查询userName以 H 结尾的记录 queryRule addLike userName oh Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 4 页 共 10 页 表示查询userName包含 oh 字符的记录 注意 标准SQL中查询限制是使用 如果使用 程序将在内部将 自动转化成 所以也支持 H 的方 式 2 1 1 2 2 In QueryRule 提供了两个方法完成对 In 限制的支持 第一种 List idList new ArrayList idList add 1 idList add 3 idList add 5 queryRule addIn id idList 第二种 queryRule addIn id 1 3 9 queryRule addIn id 1 3 5 7 9 In 表示查询出 id 等于后边条件的所有记录 2 1 1 2 3 其它查询限制其它查询限制 Between 表示范围查询 queryRule addBetween id 1 10 此条件将查询出 id 在 1 和 10 之 间的记录 Equal 表示查询属性和指定值相等时的记录 queryRule addEqual userName haha NotEqual 表示查询属性和指定值不相等时的记录 queryRule addNotEqual userName haha GreaterThan 表示查询属性大于指定值时的记录 queryRule addGreaterThan id 3 GreaterEqual 表示查询属性大于等于指定值时的记录 queryRule addGreaterEqual id 3 LessThan 表示查询属性小于指定值时的记录 queryRule addLessThan id 10 LessEqual 表示查询属性小于等于指定值时的记录 queryRule addLessEqual id 10 直接使用 SQL 语句限制查询条件 queryRule addSql userName like hello 2 1 1 3 多条件查询多条件查询 QueryRule 支持对多个条件的叠加限制 多个条件之间是 AND 的关系 使用方式为 queryRule addLike userName oh queryRule addBetween id 1 10 2 1 1 4 查询排序查询排序 同样 QueryRule 提供了对查询记录进行排序的支持 支持升序和降序 例如 queryRule addAscOrder userName Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 5 页 共 10 页 queryRule addDescOrder monicker 述代码表示记录将按 userName 升序排列 同时按 monicher 降序排列 2 1 2执行执行 HQL 查询查询 我们也可以使用 HQL 语句进行查询 例如 List list userService findByHql from UtiUser user where user id between and order by id 1 15 注意 此操作由于直接访问表 不推荐对 UI 开放 一般只在 Service 层进行 2 1 3执行执行 SQL 查询查询 我们可以使用 SQL 语句进行查询 例如 String bizNo TDAA200711010800000002 String sql select count a proposalno from prptmain a where a proposalno List countList this findBySql sql bizNo int bizCount java math BigDecimal countList get 0 intValue 注意 此操作由于直接访问表 参数使用 传递 不推荐对 UI 开放 2 1 4使用使用 BLOB CLOB 数据数据 2 1 4 1 配置dataAccessContext hibernate xml 在 dataAccessContext hibernate xml 文件中加入 Bean lobHandler 1 加入 lobHandler 2 在 sessionFactory 中配置 lobHandler 2 1 4 2 操作操作 CLOB 数据数据 这里举一个简单的例子 在 Informix 数据库中新建表 student create table student id integer primary key name nchar 200 remark text Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 6 页 共 10 页 使用 hibernate tools 工具生成对应的 Pojo 对象时需要注意 在 hibernate reveng xml 文件 中需要在 CLOB 对象上做特殊配置 如下例中的 remark 属性所示 在生成的代码中 remark 的 getter 方法如下所示 Column name remark Basic fetch FetchType LAZY Type type org springframework orm hibernate3 support ClobStringType public String getRemark return this remark 在上述地方处理之后 就可以像使用基本类型一样使用 Clob 对象了 2 1 4 3 操作操作 BLOB 数据数据 同 CLOB 的操作 不同的地方有两点 1 在 POJO 中的数据类型为 byte 2 在hibernate reveng xml和POJO文件中的Type标签的type为 org springframework orm hibernate3 support BlobByteArrayType 2 1 52 1 5 如何实现 Sequence 主键生成策略 在数据库中建立 Sequence create sequence seq userid increment by 1 start with 1 修改 hibernate reveng xml 文件 设置 hibernate reveng xml 文件中主键 generator 的 class 设置为 sequence 然后 到源码里增加 seq userid 其中 custnum 是对应的序列 举例如下 seq userid Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 7 页 共 10 页 生成的 java 代码段如下 SequenceGenerator name generator sequenceName seq userid Id GeneratedValue strategy SEQUENCE generator generator Column name id unique true nullable false public Integer getId return this id 2 1 6获取数据库当前时间获取数据库当前时间 Hibernate 提供了 3 个方法用于获取数据库当前时间 分别为 current date 数据库当前日期 current time 数据库当前时间 current timestamp 数据库当前时间戳 其使用方式如下 select prpCmain from PrpCmain prpCmain where current date between startDate and endDate 注意 在 Informix 数据库上 以上语句会报字段 current date 不存在的错误 这是因为 Hibernate 提供的 InformixDialect 存在 Bug 没有添加以上 3 个方法的处理 所以需要将 applicationContext hibernate xml 中的方言 由 org hibernate dialect InformixDialect 改为 ins framework dialect InformixDialect 2 1 7使用元数据的方式设置读级别 如脏读 使用元数据的方式设置读级别 如脏读 ARCH4 架构系统支持元数据描述的事务方式 所以直接在对应方法上添加事务元数据即可 如下列代 码 Transactional isolation Isolation READ UNCOMMITTED public Page findUser QueryRule queryRule int pageNo int pageSize logger debug 获取员工信息列表 return super find queryRule pageNo pageSize 其中 isolation Isolation READ UNCOMMITTED 表示此方法采用的读取方式 本例中的方式表明一 个事务在提交前其变化对于其他事务来说是可见的 在这种级别下 脏读 不可重复的读 虚读都是允许的 使用得当时能够有效提高整个系统的执行效率 注意 由于 JUnit 默认的实现机制 此种方式在 JUnit 测试时不起作用 主要用于对结果要求不是很精确的查询功能界面 Oracle 不支持脏读 需要去掉脏读相关代码 2 1 8将连表查询变为子查询将连表查询变为子查询 对象 DemoMain 和 DemoType 为 1 对 1 关系 当我们根据 DemoType 中的属性查询 DemoMain 时 通常使 用如下 HQL 语句 selectselect o fromfrom DemoMain o wherewhere o demoType name like Arch4 系统开发指南 开发规范篇 中科软科技股份有限公司 第 8 页 共 10 页 实际 Hibernate 执行时将生成一个连表查询语句 形如 selectselect demomain0 id asas id44 demomain0 typeid asas typeid44 demomain0 inserttimeforhis asas insertti2 44 demomain0 operatetimeforhis asas operatet3 44 demomain0 remark asas remark44 demomain0 updatetime asas updatetime44 fromfrom demo main demomain0 demo type demotype1 wherewhere demomain0 typeid demotype1 id andand demotype1 name like 如果为多个表联合查询且相关类型表数据较少时 数据库可能优先走类型表的索引 从而导致整个 SQL 执 行效率低下 Informix 上发现 而将类型表的连表查询改为子查询能够有效改善效率 为此需要修改对应 hql 语句如下 selectselect o fromfrom DemoMain o wherewhere o demoType id inin selectselect id fromfrom DemoType o wherewhere o name like 实际 Hibernate 执行时将生成一个子查询语句 形如 selectselect demomain0 id asas id44 demomain0 typeid asas typeid44 demomain0 inserttimeforhis asas insertti2 44 demomain0 operatetimeforhis asas operatet3 44 demomain0 remark asas remark44 demomain0 updatetime asas updatetime44 fromfrom demo main demomain0 wherewhere demomain0 typeid inin selectselect demotype1 id fromfrom demo type demotype1 wherewhere demotype1 name like 2 1 9通过锁记录方式解决任务并发问题通过锁记录方式解决任务并发问题 在做与业务主表相关的更新操作的过程中 要确保不被其他用户干扰 这就需要解决并发问题 在一个事务中 做 update 操作前 先根据主键使用 select for update 语句锁住这条记录 然后判断这条记 录

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论