欢迎来到天天文库
浏览记录
ID:40747670
大小:55.35 KB
页数:6页
时间:2019-08-07
《Hibernate反射DAO模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Hibernate反射DAO模式在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久层框架中,因为它不是像JDBC那样简单的增删改查的编写,而是要针对实体类映射配置文件来对照数据库表字段进行操作,而且操作是面向对象的查询,不是简单的sql语句的查询,这样我们的通用DAO模式就不能是简单的JDBC思路了。试想,项目底层的通用DAO接口方法,是适用于所有实体类对象应用的,而且数据
2、库读取的所有实体类集合也是一个通用的类模型。这样,和简单的JDBC模式不同的基础上,hibernate通用的DAO模型,就需要我们利用反射序列化的技术机制来完成。因此无论是插入的类对象和读取的类模型信息,通过反射序列化来获取。具体的操作流程如下:首先,在我们的通用DAO接口中,体现出所有通用功能的方法名外,我们需要定义的另外一个技术,就是泛型类编程模式,我们需要给类加上类型,也就是给类加上泛型模式编程。另外,在泛型中,需要定义两个属性,1是给类加一个继承序列化的变量,和给主键ID继承的一个序列化。因此反射DAO接口如下:pub
3、licinterfaceIGenericDao另外,所有的功能方法名,随之也会有所更改,例如我们添加一条信息时候,之前的参数是需要具体的实体类对象,而现在则是泛型的属性为实体类的对象,如下:publicTcreate(Tentity);返回值也是一样。因此在通用DAO接口如图:具体的类实现中,除了实现该通用的DAO接口外,还需要自身的泛型编程和继承HibernateDaoSupport父类,因此实现类的方法名为:publicclassGen
4、ericHibernateDaoextendsHibernateDaoSupportimplementsIGenericDao。因此例如在插入数据时候实现类代码则是:@OverridepublicTcreate(Tentity){return(T)this.getHibernateTemplate().save(entity);}这里反射序列化的类对象T,作为通用Dao接口的实现类实体类通用类型,但是在实现类的查询中,也就是读取
5、中,我们也需要获取一个反射序列化的通过实体类对象模型,这就是需要反射的Class实例对象了,因此在通用DAO接口的实现类中,我们需要创建一个Class实例对象,这个对象中我们需要的泛型类型是反射序列化的实体类对象模型T,因此这个对象为ClasspersistentClass;但是我们还需要这个Class实例对象来获取反射序列化的具体对象模型,这就需要我们通过java底层对象类型来获取了,具体为this.persistentClass=(Class)(ParameterizedType)getClass().getG
6、enericSuperclass()).getActualTypeArguments()[0];这里面1.getClass().getGenericSuperclass():获取java最底层类对象2.(ParameterizedType)getClass().getGenericSuperclass()):转换为可序列化类型3..getActualTypeArguments()[0]反射出第一个参数对象信息,也就是获取类泛型中TextendsSerializable4.(Class):强转为当前类对象通过这些复杂的过程
7、,我们可以获取反射序列化的具体Class实例类型,这样就可以通过该Class实例来获取具体查询的结果集合。因此实现类的代码大致如下:publicclassGenericHibernateDaoextendsHibernateDaoSupportimplementsIGenericDao{ClasspersistentClass;publicGenericHibernateDao(){//强转为当前类对象,转换为可序列化类型
8、,获取java最底层类对象反射出第一个参数对象信息this.persistentClass=(Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]
此文档下载收益归作者所有