版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate反射DAO模式在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久层框架中,因为它不是像JDBC那样简单的增删改查的编写,而是要针对实体类映射配置文件来对照数据库表字段进行操作,而且操作是面向对象的查询,不是简单的sql语句的查询,这样我们的通用DAO模式就不能是简单的JDBC思路了。试想,项目底层的通用DAO接口方法,是适用于所有实体类对象应用的,而且数据库读取的所有实体类集合也是一个通用的类模型。这样,和简单的JDBC模
2、式不同的基础上,hibernate通用的DAO模型,就需要我们利用反射序列化的技术机制来完成。因此无论是插入的类对象和读取的类模型信息,通过反射序列化来获取。具体的操作流程如下:首先,在我们的通用DAO接口中,体现出所有通用功能的方法名外,我们需要定义的另外一个技术,就是泛型类编程模式,我们需要给类加上类型,也就是给类加上泛型模式编程。另外,在泛型中,需要定义两个属性,1是给类加一个继承序列化的变量,和给主键ID继承的一个序列化。因此反射DAO接口如下:public interface IGenericDao<T extends Serializable,ID extends Seria
3、lizable>另外,所有的功能方法名,随之也会有所更改,例如我们添加一条信息时候,之前的参数是需要具体的实体类对象,而现在则是泛型的属性为实体类的对象,如下:public T create(T entity);返回值也是一样。因此在通用DAO接口如图:具体的类实现中,除了实现该通用的DAO接口外,还需要自身的泛型编程和继承HibernateDaoSupport父类,因此实现类的方法名为:public class GenericHibernateDao<T extends Serializable,ID extends Serializable> extends Hibern
4、ateDaoSupport implements IGenericDao<T, ID>。因此例如在插入数据时候实现类代码则是:Overridepublic T create(T entity) return (T) this.getHibernateTemplate().save(entity);这里反射序列化的类对象T,作为通用Dao接口的实现类实体类通用类型,但是在实现类的查询中,也就是读取中,我们也需要获取一个反射序列化的通过实体类对象模型,这就是需要反射的Class实例对象了,因此在通用DAO接口的实现类中,我们需要创建一个Class实例对象,这个对象中我们需要的泛型类型是
5、反射序列化的实体类对象模型T,因此这个对象为Class<T> persistentClass;但是我们还需要这个Class实例对象来获取反射序列化的具体对象模型,这就需要我们通过java底层对象类型来获取了,具体为this.persistentClass=(Class<T>)(ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()0;这里面1. getClass().getGenericSuperclass():获取java最底层类对象 2. (ParameterizedT
6、ype)getClass().getGenericSuperclass():转换为可序列化类型3. .getActualTypeArguments()0 反射出第一个参数对象信息,也就是获取类泛型中T extends Serializable4. (Class<T>):强转为当前类对象通过这些复杂的过程,我们可以获取反射序列化的具体Class实例类型,这样就可以通过该Class实例来获取具体查询的结果集合。因此实现类的代码大致如下:public class GenericHibernateDao<T extends Serializable,ID extends Serial
7、izable> extends HibernateDaoSupport implements IGenericDao<T, ID> Class<T> persistentClass;public GenericHibernateDao() / 强转为当前类对象,转换为可序列化类型, 获取java最底层类对象 反射出第一个参数对象信息 this.persistentClass=(Class<T>) (ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()0;
8、public Class<T> getPersistentClass() return persistentClass;public void setPersistentClass(Class<T> persistentClass) this.persistentClass = persistentClass;Overridepublic T create(T entity) return (T) this.getHibernateTemplate().save(entity);Overridepublic void delete(ID id) /删除通用方法 参数为要
9、删除的实体类对象System.out.println("IDD "+id);this.getHibernateTemplate().delete(this.findById(id);Overridepublic void update(T entity) this.getHibernateTemplate().update(entity);Overridepublic T findById(ID id) return this.getHibernateTemplate().get(persistentClass, id);Overridepublic List<T&g
10、t; findAll() return this.getHibernateTemplate().loadAll(persistentClass);Overridepublic List<T> findByObject(String hql, Object param) return this.getHibernateTemplate().find(hql, param);Overridepublic PageBean findByPageBean(final String hql,final Object param,final int currentpage,final int
11、pageSize) return this.getHibernateTemplate().execute(new HibernateCallback<PageBean>() Overridepublic PageBean doInHibernate(Session session)throws HibernateException, SQLException /创建pagebean对象PageBean pb=new PageBean();/通过Query对象来获取所需要页的数据Query qu=session.createQuery(hql);/赋值参数if(param.lengt
12、h>0)for (int i = 0; i < param.length; i+) qu.setParameter(i, parami);/为Query对象,赋值从第几行到第几行参数,也就是最大最小页数值qu.setFirstResult(currentpage-1)*pageSize);qu.setMaxResults(pageSize);/给PageBean对象,赋值list参数pb.setData(qu.list();/获取总行数 qu=session.createQuery("select count(*) "+hql.substring(hql.toL
13、owerCase().indexOf("from");/赋值获取总行数参数if(param.length>0) for (int j = 0; j < param.length; j+) qu.setParameter(j, paramj); /Pagebean赋值总行数参数pb.setTotalRows(Integer.parseInt(qu.uniqueResult().toString();/Pagebean赋值当前页参数pb.setCurrentPage(currentpage);/Pagebean赋值每页大小参数pb.setPageSize(pageS
14、ize);/返回pagebean对象return pb;);Overridepublic void bulkUpdate(String bulk, Object param) this.getHibernateTemplate().bulkUpdate(bulk,param);Overridepublic Integer countByObject(final String hql,final Object param) return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() /获取hibernateSessionFactory接口方法 Overridepublic Integer doInHibernate(Session session)throws HibernateException, SQLException /通过HIbernateQuery方法来获取count值Query qu=sessi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 励志之星个人主要事迹(6篇)
- 水环境风险评估与管理研究-洞察分析
- 星际作战理论框架-洞察分析
- 委托单风险防控策略-洞察分析
- 《spice使用方法》课件
- 人教版小学数学课件《重叠问题》
- 创新驱动的绿色能源产业发展策略
- 农业科技创新驱动下的商业机遇挖掘
- 健康饮食习惯的培养对学生长期影响研究报告
- 2025出口商品收购合同书
- 人教版二年级语文上册期末考试卷及答案下载
- 《中国古代寓言》导读(课件)2023-2024学年统编版语文三年级下册
- 2024至2030年中国铝棒行业市场发展监测及投资前景展望报告
- 2024年人教版七年级下册体育第二单元课后练习3(含答案和概念)
- 汽车用冷却风扇等注塑产品项目环评报告表
- 全国青岛版初中信息技术第四册第二单元第9课《初识物联网》教学设计
- AQ/T 1023-2006 煤矿井下低压供电系统及装备通 用安全技术要求(正式版)
- 康复科发展规划方案(2篇)
- 内容营销策划管理合同
- 2024河北工业职业技术大学教师招聘考试笔试试题
- 国际物流运输管理智慧树知到期末考试答案章节答案2024年上海海事大学
评论
0/150
提交评论