在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久层框架中,因为它不是像JDBC那样简单的增删改查的编写,而是要针对实体类映射配置文件来对照数据库表字段进行操作,而且操作是面向对象的查询,不是简单的sql语句的查询,这样我们的通用DAO模式就不能是简单的JDBC思路了。

试想,项目底层的通用DAO接口方法,是适用于所有实体类对象应用的,而且数据库读取的所有实体类集合也是一个通用的类模型。这样,和简单的JDBC模式不同的基础上,hibernate通用的DAO模型,就需要我们利用反射序列化的技术机制来完成。因此无论是插入的类对象和读取的类模型信息,通过反射序列化来获取。具体的操作流程如下:

首先,在我们的通用DAO接口中,体现出所有通用功能的方法名外,我们需要定义的另外一个技术,就是泛型类编程模式,我们需要给类加上类型,也就是给类加上泛型模式编程。另外,在泛型中,需要定义两个属性,1是给类加一个继承序列化的变量,和给主键ID继承的一个序列化。因此反射DAO接口如下:

publicinterface IGenericDao<T extends Serializable,ID extends Serializable>

另外,所有的功能方法名,随之也会有所更改,例如我们添加一条信息时候,之前的参数是需要具体的实体类对象,而现在则是泛型的属性为实体类的对象,如下:

public T create(T entity);返回值也是一样。

因此在通用DAO接口如图:

具体的类实现中,除了实现该通用的DAO接口外,还需要自身的泛型编程和继承HibernateDaoSupport父类,因此实现类的方法名为:

publicclass GenericHibernateDao<T extends Serializable,ID extends Serializable> extends HibernateDaoSupportimplements IGenericDao<T, ID>。

因此例如在插入数据时候实现类代码则是:

@Override

public T create(T entity) {

return (T) this.getHibernateTemplate().save(entity);

}

这里反射序列化的类对象T,作为通用Dao接口的实现类实体类通用类型,但是在实现类的查询中,也就是读取中,我们也需要获取一个反射序列化的通过实体类对象模型,这就是需要反射的Class实例对象了,因此在通用DAO接口的实现类中,我们需要创建一个Class实例对象,这个对象中我们需要的泛型类型是反射序列化的实体类对象模型T,因此这个对象为

Class<T> persistentClass;

但是我们还需要这个Class实例对象来获取反射序列化的具体对象模型,这就需要我们通过java底层对象类型来获取了,具体为

this.persistentClass=

(Class<T>)(ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

这里面1. getClass().getGenericSuperclass():获取java最底层类对象

2. (ParameterizedType)getClass().getGenericSuperclass()):转换为可序列化类型

3. .getActualTypeArguments()[0]反射出第一个参数对象信息,也就是获取类泛型中T extends Serializable

4. (Class<T>):强转为当前类对象

通过这些复杂的过程,我们可以获取反射序列化的具体Class实例类型,这样就可以通过该Class实例来获取具体查询的结果集合。

因此实现类的代码大致如下:

publicclass GenericHibernateDao<T extends Serializable,ID extends Serializable>

extends HibernateDaoSupportimplements IGenericDao<T, ID> {

Class<T> persistentClass;

public GenericHibernateDao() {

//强转为当前类对象,转换为可序列化类型,获取java最底层类对象反射出第一个参数对象信息

this.persistentClass=(Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

}

public Class<T> getPersistentClass() {

returnpersistentClass;

}

publicvoid setPersistentClass(Class<T> persistentClass) {

this.persistentClass = persistentClass;

}

@Override

public T create(T entity) {

return (T) this.getHibernateTemplate().save(entity);

}

@Override

publicvoid delete(ID id) {

//删除通用方法参数为要删除的实体类对象

System.out.println("IDD "+id);

this.getHibernateTemplate().delete(this.findById(id));

}

@Override

publicvoid update(T entity) {

this.getHibernateTemplate().update(entity);

}

@Override

public T findById(ID id) {

returnthis.getHibernateTemplate().get(persistentClass, id);

}

@Override

public List<T> findAll() {

returnthis.getHibernateTemplate().loadAll(persistentClass);

}

@Override

public List<T> findByObject(String hql, Object[] param) {

returnthis.getHibernateTemplate().find(hql, param);

}

@Override

public PageBean findByPageBean(final String hql,finalObject[] param,finalint currentpage,finalint pageSize) {

returnthis.getHibernateTemplate().execute(new HibernateCallback<PageBean>() {

@Override

public PageBean doInHibernate(Session session)throws HibernateException, SQLException {

//创建pagebean对象

PageBean pb=new PageBean();

//通过Query对象来获取所需要页的数据

Query qu=session.createQuery(hql);

//赋值参数

if(param.length>0){

for (int i = 0; i < param.length; i++) {

qu.setParameter(i, param[i]);

}

}

//为Query对象,赋值从第几行到第几行参数,也就是最大最小页数值

qu.setFirstResult((currentpage-1)*pageSize);

qu.setMaxResults(pageSize);

//给PageBean对象,赋值list参数

pb.setData(qu.list());

//获取总行数

qu=session.createQuery("select count(*) "+hql.substring(hql.toLowerCase().indexOf("from")));

//赋值获取总行数参数

if(param.length>0){

for (int j = 0; j < param.length; j++) {

qu.setParameter(j, param[j]);

}

}

//Pagebean赋值总行数参数

pb.setTotalRows(Integer.parseInt(qu.uniqueResult().toString()));

//Pagebean赋值当前页参数

pb.setCurrentPage(currentpage);

//Pagebean赋值每页大小参数

pb.setPageSize(pageSize);

//返回pagebean对象

return pb;

}

});

}

@Override

publicvoid bulkUpdate(String bulk, Object[] param) {

this.getHibernateTemplate().bulkUpdate(bulk,param);

}

@Override

public Integer countByObject(final String hql,final Object[] param) {

returnthis.getHibernateTemplate().execute(new HibernateCallback<Integer>() {

//获取hibernateSessionFactory接口方法

@Override

public Integer doInHibernate(Session session)throws HibernateException, SQLException {

//通过HIbernateQuery方法来获取count值

Query qu=session.createQuery(hql);

for (int i = 0; i < param.length; i++) {

qu.setParameter(i, param[i]);

}

return Integer.parseInt(qu.uniqueResult().toString());

}

});

}

}

以上是反射DAO模式的实现类及接口的核心代码,通过具体的实体类对象来获取具体的类对象集合,就可以实现具体的通过DAO反射序列化的接口及实现类的效果。

作者:中软卓越天津ETC

转载于:https://blog.51cto.com/zretc/1252401

Hibernate反射DAO模式相关推荐

  1. Java Dao模式通过JDBC连接数据库的操作

    Java程序访问数据库: 1.获取数据库厂商提供的驱动(jdbc接口的实现类) 如ojdbc14.jar--Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin ...

  2. Hibernate通用Dao实现

    Hibernate通用Dao实现 @(Hibernate)[dao, hibernate, 反射] Hibernate通用Dao实现 BaseDao接口 BaseDao接口实现类 命名Query在映射 ...

  3. Java EE结构理解 与Dao模式 no7.

    什么是 JavaEE JavaEE 概念 Java EE,Java 平台企业版(Java Platform Enterprise Edition),之前称为Java 2 Platform, Enter ...

  4. JavaWeb——Spring 的操作数据库的 DAO模式

    JavaWeb--Spring 系列 四.Spring AOP的 DAO 1.DAO 介绍 DAO,Data Access Object,顾名思义适用于操作数据库的.Spring 的 DAO 是 O/ ...

  5. Hibernate的DAO实现

    10.7  Hibernate的DAO实现 DAO对象是模块化的数据库访问组件,DAO对象通常包括:对持久化类的基本CRUD操作(插入.查询.更新.删除)操作.Spring对Hibernate的DAO ...

  6. 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结

    工厂模式也用了不少,特别是MS的petshop中对数据库的访问,通过工厂模式可以达到自由切换SQL 和 Oracle 数据库.近来也在看设计模式的书,发现工厂模式还是有不少的扩展.结合书中的知识和我自 ...

  7. 024_jdbc-mysql的Dao模式

    1. 新建一个JDBCDao工程, 使用我们之前的JDBCUtil.java和jdbc.properties属性文件 2. Dao模式: Data Access Object数据访问对象. 3. 新建 ...

  8. 持久层是什么意思_软件项目实训及课程设计指导—如何在数据持久层中应用DAO模式...

    软件项目实训及课程设计指导--如何在J2EE应用系统数据持久层中应用DAO模式 1.为什么要在软件应用系统中提供数据持久层 软件应用系统中的数据持久层主要为整个软件应用系统提供数据访问功能服务,从而可 ...

  9. JDBC之二:DAO模式

    JDBC之二:DAO模式 @(JAVA)[java] 详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database f ...

  10. java mysql dao_Java DAO 模式

    哈哈哈哈哈...呃~参考文章 DAO 模式 DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问.通俗来讲,就是将数据库操作都封装起来. ...

最新文章

  1. 国外十大最流行PHP框架排名
  2. java default locale_Java JSON.defaultLocale方法代码示例
  3. 加一—leetcode66
  4. 洞仙歌·冰肌玉骨 [宋] 苏轼
  5. python多线程下载多个文件_python多线程下载文件 练习1
  6. Guava学习笔记(一):Guava新增集合类型-Multimap
  7. IE11怎么设置默认以IE8的方式解析
  8. 简述网卡的作用和工作原理_网卡的工作原理(要简短的)
  9. 令人期待的大戏:千亿百度
  10. SLAM AR 技术与应用
  11. 用断点续存实现视频快速上传
  12. SDN和NFV的关系?
  13. 美的发布行业首支说唱MV,打造懂年轻人的美的微晶冰箱
  14. C/C++语言100题练习计划 87——火柴棒等式(枚举实现)
  15. 我为什么看衰 钱方好近 等餐饮支付合作商
  16. java序列化指的是什么,java的序列化是什么
  17. vscode报错ERROR in node_modules/@types/node/ts3.5/globals.global.d.ts:1:13 - error TS2403: Subsequent
  18. JeecgBoot学习
  19. Hadoop Shell
  20. 东软 内部员工离职述说

热门文章

  1. 做.NET开发解决Extjs4智能感知
  2. 软件构架师之路[转帖]
  3. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
  4. Linux批量清空当前目录中的日志文件
  5. JS实现类似QQ好友头像hover时显示资料卡的效果
  6. Sublime Text各种插件使用方法
  7. 编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器...
  8. int 占一个机器字长
  9. 2012/7/26给Extjs grid中的列自定义渲染方式
  10. LLBL Gen 元数据编程 LLBL Gen Meta-data Programming