




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于hibernate持久层设计方案1.持久层概述1.1. 持久层功能概述持久层主要负责与数据库的交互,是一组软件服务,将应用程序与其使用的数据源分离,是业务逻辑层与数据库的桥梁。1.2. 设计目标我们设计持久层要达到的目标:l 将数据持久逻辑与表示和业务逻辑分开的整洁机制l 使数据所在的数据库平台对于框架的应用程序完全隐藏起来l 抽象数据库中存储数据的物理细节和数据库实体之间存在的关系l 简化开发过程,隐藏打开数据库连接,事务管理等细节基于以上目标,我们这里采用对象-关系型数据库映射(ORM)的方法来操作数据库。1.3. 使用持久层开发基本过程基于框架,持久层的基本开发过程如下:l 编写持久层环境配置文件(persistence.xml)。l 编写bo(Bussiness Object)实现业务功能和业务描述。l 编写bo和数据库表之间的映射关系描述(annotation)。l 使用dao对象对bo执行持久化操作。2. 持久层环境2.1. 概述使用框架的持久层开发之前,我们要先做一些准备,搭建好持久层的环境,也就是编写持久层环境配置文件persistence.xml。2.2. 编写persistence.xmlpersistence.xml文件是持久层与数据库连接属性的配置文件,可以直接使用weblogic的数据源。我们现在使用weblogic的数据源OracleDS,配置文件的代码如下: weblogic.jndi.WLInitialContextFactory t3:/:8001 OracleDS org.hibernate.dialect.Oracle9Dialect true org.hibernate.connection.DatasourceConnectionProvider 50 25 GBK 3. 实现O-R映射3.1. 创建bo(Bussiness Object)我们使用bo来实现业务描述创建bo的步骤:l bo须继承某一bo的基类(此基类可以根据具体项目来具体封装,但一定要继承类SwordBaseBO)。l 为bo的每个属性添加get和set方法l 在set方法中添加support.firePropertyChange()方法l 为bo添加注释l 在关系数据库中建立相应的表下面我们来使用一个具体的例子来说明创建一个bo的过程。下面是LeaveBO.java的部分源代码public class LeaveBO extends SwordBaseBO private Integer id; private String name; public Integer getId() return id; public void setId(Integer id) support.firePropertyChange(id, this.id, id); this.id = id; public String getName() return name; public void setName(String name) support.firePropertyChange(name, , name); = name; .注意:l bo一定要继承类SwordBaseBOl 对于每个属性添加get和set方法。l 在set方法里注册firePropertyChange方法3.2. 设置标注EntityTable(name = T_LEAVE)public class LeaveBO extends SwordBaseBO private Integer id; private String name; Id GeneratedValue(generator = system-increment) GenericGenerator(name = system-increment, strategy = increment) Column(name = ID, length = 0, nullable = false) public Integer getId() return id; public void setId(Integer id) support.firePropertyChange(id, this.id, id); this.id = id; Column(name = NAME, length = 20) public String getName() return name; public void setName(String name) support.firePropertyChange(name, , name); = name; .3.3. 在关系数据库中创建表我们在oracal数据库中创建表student,执行的sql为:create table T_LEAVE( ID NUMBER not null, NAME VARCHAR2(20) not null, DAYS NUMBER, BEGINDATE DATE, ENDDATE DATE, DEPARTMENT VARCHAR2(20), TYPE VARCHAR2(10), TELEPHONE VARCHAR2(15), REASON VARCHAR2(40), SHENPI1 VARCHAR2(10), SHENPI2 VARCHAR2(10),);alter table T_LEAVE add constraint PK_ID primary key (ID)4. 使用持久层操作数据库持久层的关键就是类型为IPersistenceDAO的对象,我们对数据库的操作都是通过这个对象来实现的,所以下面主要讲解如何在环境中获得和使用IPersistenceDAO对象。4.1. 获得IPersistenceDAO对象可以使用以下代码获得IPersistenceDAO对象:IPersistenceDAO dao = this.getPersistenceDAO();4.2. 新增操作4.2.1. public void saveBO(IDaoBusinessObject bo)l 说明:a) saveBO方法用来对数据库中的一张表执行插入操作b) 该方法仅仅用来对一张表插入一条记录c) 当数据库中有初始值的时候,使用此方法会将数据库的初始值覆盖为null,所以数据库有初始值时请使用execute方法l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建一个新的BO对象,用来执行插入操作LeaveBO bo = new LeaveBO();bo.setId(1);bo.setName(test); dao.saveBO(bo);4.2.2. public void saveBO(List bos)l 说明:a) 批量的对一批BO进行数据库对应表的新增,List中的BO类型可以是不同的,但他们都必须实现IDaoBusinessObject 接口。b) saveBO方法用来批量的执行一组insert语句 l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建10个BO对象,用来进行批量的插入List bos = new ArrayList();for (int i = 1; i 11; i+) LeaveBO bo = new LeaveBO(); bo.setId(i); bo.setName(test+i); bos.add(bo); dao.saveBO(bos);4.3. 删除操作4.3.1. public void deleteBO(IDaoBusinessObject bo)l 说明:a) 从数据库中删除该BO所对应的记录,该方法是根据BO的主键来进行匹配删除的b) 该方法内部使用hibernate的session进行操作l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建一个新的BO对象,用来执行删除操作LeaveBO bo = new LeaveBO();/*需要注意的是,该方法其实就是根据主键条件进行删除的方法,因此被删除的BO必须要设置主键值*/bo.setId(1);dao.deleteBO(bo);4.3.2. public void deleteBO(List bos)l 说明:a) 批量的删除一匹BO对象b) BO对象可以是不同类型的,但是在删除之前必须要确保它们与其他BO之间已经没有任何关联关系c) 该方法不会自动的删除BO与其他BO之间的关系l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建10个BO对象,用来进行批量的删除List bos = new ArrayList();for (int i = 1; i 11; i+) LeaveBO bo = new LeaveBO(); bo.setId(i); bos.add(bo); dao.deleteBO(bos);4.4. 更新操作4.4.1. public int updateBO(IDaoBusinessObject bo)l 说明:a) updateBO方法用来对数据库中的一张表执行更新操作b) 该方法仅仅用来对一张表更新一条记录 c) 在执行更新操作的时候,该方法只识别set后的属性d) set方法中要有对应的this.firePropertyChange()方法,否则不执行更新操作l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建一个新的BO对象,用来执行更新操作LeaveBO bo = new LeaveBO();/*需要注意的是,该方法其实就是根据主键条件进行更新的方法,因此被更新的BO必须要设置主键值*/bo.setId(1);bo.setName(111);dao.updateBO(bo);4.4.2. public int updateBO(List bos)l 说明:a) 批量的更新一匹BO对象b) 在执行更新操作的时候,该方法只识别set后的属性c) set方法中要有对应的this.firePropertyChange()方法,否则不执行更新操作l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO();/创建10个BO对象,用来进行批量的更新List bos = new ArrayList();for (int i = 1; i 11; i+) LeaveBO bo = new LeaveBO();/*需要注意的是,该方法其实就是根据主键条件进行更新的方法,因此被更新的BO必须要设置主键值*/bo.setId(i);bo.setName(11);bos.add(bo); dao.updateBO(bos);4.5. 查询操作4.5.1. List query(Class boClass, String sqlStr,List sqlParams)l 说明:a) 该方法一次性查询出满足条件的bo集合b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询只支持前台分页,即在前台点击上下页时不再从后台查询d) boClass要查询的BO对象的类型e) sqlStr 要查询的SQL语句,是一个完整的语句。例select * from t_leave where name=? order by id desc f) sqlParams该属性中填充where条件中的参数值l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ? order by id desc ;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(112); /进行查询List results = dao.query(LeaveBO.class , sqlStr, sqlParams); 4.5.2. CachedRowSet query(String sqlStr,List sqlParams)l 说明:a) 通过SQL一次性查询出满足条件的记录,查询结果存入CachedRowSet中b) 该分页查询只支持前台分页,即在前台点击上下页时不再从后台查询c) sqlStr 要查询的SQL语句,是一个完整的语句。例select * from t_leave where name=? order by id desc d) sqlParams该属性中填充where条件中的参数值l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ? order by id desc ;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(112); /进行查询CachedRowSet results = dao.query( sqlStr, sqlParams); 4.5.3. List queryByKey(Class boClass, String sqlKey, List sqlParams) l 说明:a) 该方法一次性查询出满足条件的bo集合b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询只支持前台分页,即在前台点击上下页时不再从后台查询d) boClass要查询的BO对象的类型e) sqlKey 要查询的SQL语句所对应的key,需要在sql-*.xml中声明f) sqlParams该属性中填充where条件中的参数值l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(112); /进行查询List results = dao.queryByKey(LeaveBO.class , test, sqlParams); l sql-org.xml:select * from t_leave where name=?4.5.4. CachedRowSet queryByKey(String sqlKey, List sqlParams) l 说明:a) 通过SQL一次性查询出满足条件的记录,查询结果存入CachedRowSet中b) 该分页查询只支持前台分页,即在前台点击上下页时不再从后台查询c) sqlKey 要查询的SQL语句所对应的key,需要在sql-*.xml中声明d) params该属性中填充where条件中的参数值l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(112); /进行查询CachedRowSet results = dao.queryByKey(test, sqlParams); l sql-org.xml:select * from t_leave where name=?4.5.5. CachedRowSet queryPageBySQL(StringsqlStr, ListsqlParams, inttotalNum, intpageNum) l 说明:a) 标准的分页查询,通过totalNum*pageNum标明查询的起始位置,通过totalNum标明每次查询的数据总数,查询结果存入CachedRowSet中b) 该分页查询只支持前台分页,即在前台点击上下页时不再从后台查询c) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name=? order by id desc d) sqlParams该属性中填充where条件中的参数值e) totalNum每次获取数据总数f) pageNum页数,从0开始g) totalNum*pageNum代表查询数据的起始行l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ? order by id desc ;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(112); /进行查询,查询结果为第2条到第3条(条数从0开始)CachedRowSet results = dao.queryPageBySQL ( sqlStr, sqlParams,2,1 ); 4.5.6. List pageQuery(Class boClass, String widgetName, String sqlStr)l 说明:a) 后台分页查询,默认每次获取20条数据,此时前台页面rows属性不再起作用b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询支持后台分页,即在前台点击上下页时从后台查询d) boClass要查询BO对象的类型e) widgetName前台表格组件名称f) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= 11 order by id desc l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = 11;/进行查询,默认每次获取20条数据List results = dao.pageQuery(LeaveBO.class,leaveGrid,sqlStr); l 页面4.5.7. CachedRowSet pageQuery(String widgetName, String sqlStr)l 说明:a) 后台分页查询,默认每次获取20条数据,此时前台页面rows属性不再起作用,查询结果存入CachedRowSet中b) 该分页查询支持后台分页,即在前台点击上下页时从后台查询c) widgetName前台表格组件名称d) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= 11 order by id desc l 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = 11;/进行查询,默认每次获取20条数据CachedRowSet results = dao.pageQuery(leaveGrid,sqlStr); l 页面4.5.8. List pageQuery(ClassboClass, StringwidgetName, StringsqlStr, ListsqlParams, inttotalNum, intpageNum, StringsortName, PaginationManager.SortFlagsf) l 说明:a) 后台分页查询,此时前台页面rows属性不再起作用,通过totalNum*(pageNum-1)标明查询的起始位置,通过totalNum标明每次查询的数据总数b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询支持后台分页,即在前台点击上下页时从后台查询d) boClass要查询BO对象的类型e) widgetName前台表格组件名称f) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= ? g) sqlParams该属性中填充where条件中的参数值h) totalNum每页获取数据总数i) pageNum页数,从1开始j) sortName排序字段名k) sf排序方式 PaginationManager.SortFlag.asc或者PaginationManager.SortFlag.descl 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ?;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(11); /进行查询,查询结果为第10条到第19条(条数从0开始)List results = dao.pageQuery(LeaveBO.class,leaveGrid, sqlStr, sqlParams,10,2,id, PaginationManager.SortFlag.desc);l 页面4.5.9. CachedRowSet pageQuery(StringwidgetName, StringsqlStr, ListsqlParams, inttotalNum, intpageNum, StringsortName, PaginationManager.SortFlagsf) l 说明:a) 后台分页查询,此时前台页面rows属性不再起作用,通过totalNum*(pageNum-1)标明查询的起始位置,通过totalNum标明每次查询的数据总数,查询结果存入CachedRowSet中b) 该分页查询支持后台分页,即在前台点击上下页时从后台查询c) widgetName前台表格组件名称d) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= ? e) sqlParams该属性中填充where条件中的参数值f) totalNum每页获取数据总数g) pageNum页数,从1开始h) sortName排序字段名i) sf排序方式 PaginationManager.SortFlag.asc或者PaginationManager.SortFlag.descl 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ?;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(11); /进行查询,查询结果为第10条到第19条(条数从0开始)CachedRowSet results = dao.pageQuery(leaveGrid, sqlStr, sqlParams,10,2,id, PaginationManager.SortFlag.desc);l 页面4.5.10. List pageQuery(ClassboClass, StringwidgetName, StringsqlStr, ListsqlParams, StringsortName, PaginationManager.SortFlagsf)l 说明:a) 后台分页查询,默认每次获取20条数据,此时前台页面rows属性不再起作用 b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询支持后台分页,即在前台点击上下页时从后台查询d) boClass要查询BO对象的类型e) widgetName前台表格组件名称f) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= ? g) sqlParams该属性中填充where条件中的参数值h) sortName排序字段名i) sf排序方式 PaginationManager.SortFlag.asc或者PaginationManager.SortFlag.descl 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ?;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(11); /进行查询,默认每次获取20条数据List results = dao.pageQuery(LeaveBO.class,leaveGrid, sqlStr, sqlParams,id, PaginationManager.SortFlag.desc);l 页面4.5.11. CachedRowSet pageQuery(StringwidgetName, StringsqlStr, ListsqlParams, StringsortName, PaginationManager.SortFlagsf) l 说明:a) 后台分页查询,默认每次获取20条数据,此时前台页面rows属性不再起作用,查询结果存入CachedRowSet中b) 该分页查询支持后台分页,即在前台点击上下页时从后台查询c) widgetName前台表格组件名称d) sqlStr要查询的SQL语句,是一个完整的语句。例select * from t_leave where name= ? e) sqlParams该属性中填充where条件中的参数值f) sortName排序字段名g) sf排序方式 PaginationManager.SortFlag.asc或者PaginationManager.SortFlag.descl 示例代码:/使用getPersistenceDAO来获得IPersistenceDAO对象IPersistenceDAO dao = this.getPersistenceDAO(); /*本次查询所使用的sql语句,注意,这里的sql语句是完整的sql语句,而不是一个片断*/String sqlStr = select * from t_leave where name = ?;/*使用List容器来传递参数,参数按照SQL语句中的“?”顺序,被放入到List容器中*/List sqlParams = new ArrayList(); /这个值将取代第一个 “?”sqlParams.add(11); /进行查询,默认每次获取20条数据CachedRowSet results = dao.pageQuery(leaveGrid, sqlStr, sqlParams,id, PaginationManager.SortFlag.desc);l 页面4.5.12. List pageQuery(Class boClass, String widgetName, String sqlStr, List sqlParams) l 说明:a) 后台分页查询,默认每次获取20条数据,此时前台页面rows属性不再起作用b) 查询数据库中的字段名称要与bo中的属性名称符合规范,否则将无法正确将数据装入bo中Example:字段名称: JG_DM NAME 对应Bo属性: jgDm namec) 该分页查询支持后台分页,即在前台点击上下页时从后台查询d) boClass要查询BO对象的类型e) widgetName前台表格组件名称f) sqlStr要查询的SQL语句,是一个完整的语句。例select * f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外延工国庆节后复工安全考核试卷含答案
- 纸张整饰工中秋节后复工安全考核试卷含答案
- 船体装配工中秋节后复工安全考核试卷含答案
- 房屋租房协议书
- 家长对学生校服采购意见征询表范本
- 二年级语文教学工作计划与安排
- 九年级语文课文教学设计范例
- 供热生产调度工国庆节后复工安全考核试卷含答案
- 餐饮行业新产品研发策划书
- 制药灭菌发酵工节假日前安全考核试卷含答案
- 云南学法减分题库及答案
- 幼儿园大班数学活动《4的分解与组合》课件
- 三级医师查房制度考试题(含答案)
- 文旅公司考试试题及答案
- 2025秋七年级开学新生家长会《启幕新篇章携手创辉煌》【课件】
- 2025至2030年中国公立医院行业发展监测及市场发展潜力预测报告
- GJB3243A-2021电子元器件表面安装要求
- 2025年全国翻译专业资格(水平)考试土耳其语三级笔译试卷
- 人工智能技术在网络安全威胁检测中的应用
- 2025内蒙古民族大学招聘管理助理、教学助理50人笔试模拟试题及答案解析
- 2025年麻醉、第一类精神药品管理培训考核试题及答案(护士卷)
评论
0/150
提交评论