在WEB开发中,用到三层架构中经常会遇到代码抽取的情况,例如在dao层中,我们需要对数据库的基本操作进行抽取例如这样,在抽取之前我们需要定义抽取类的接口:

public interface BaseDao<T> {

	public void save(T obj);
public void delete(T obj);
public void update(T obj);
public List<T> getAll();
public T getById(Serializable id); }

接口定义玩后我们需要定义接口的实现类了:

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

	//该方法用于注解注入SessionFactory对象
@Resource
public void setMySessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
} @Override
public void save(T obj) {
this.getHibernateTemplate().save(obj);
} @Override
public void delete(T obj) {
this.getHibernateTemplate().delete(obj);
} @Override
public void update(T obj) {
this.getHibernateTemplate().update(obj);
} @Override
public List<T> getAll() {
String hql="from "+clazz.getSimpleName();
List<T> list = (List<T>) this.getHibernateTemplate().find(hql);
return list;
} @Override
public T getById(Serializable id) { }
}

在实现类中增、删、改的方法很容易实现,但由于HibernateTemplate的get方法必须传入目标对象的Class对象,也就是get(Class<?> clazz,Serializable),由于该类是使用泛型表示“需要查询的对象类型”,那我们如何获得该类泛型的Class对象成为了关键。(虽然getById()方法也可以像getAll()方法一样采用HQL查询,但我们为了演示这个问题,所以不采用这个方法)

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

	//该字段保存当前类泛型的Class对象
private Class<T> clazz; public BaseDaoImpl() { //返回表示此 Class 所表示的实体的直接超类的 Type
ParameterizedType genericSuperclass = (ParameterizedType)this.getClass().getGenericSuperclass();
//获得本类声明的泛型数组(实际上只有一个)
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); clazz = (Class<T>)actualTypeArguments[0];
} //为了简介,这里省略前面已经给出实现过程的方法
............ @Override
public T getById(Serializable id) {
T t = this.getHibernateTemplate().get(clazz,id);
return t;
}
}

Java中获取类声明泛型的Class对象(WEB开发Dao层的抽取)的更多相关文章

  1. Java中获取类的运行时结构

    获取运行时类的完整结构 通过反射获取运行时类的完整结构 Field(属性).Method(方法).Constructor(构造器).Superclass(父类).Interface(接口).Annot ...

  2. Java 中获取类路径 classpath 的方法

    System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("jav ...

  3. 095、Java中String类之不自动保存对象池操作

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. 093、Java中String类之字符串是匿名对象

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. Java中Class类详解、用法及泛化

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  6. Java中Class类及用法

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  7. 第四节:详细讲解Java中的类和面向对象思想

    前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...

  8. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  9. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  10. Java中String类为什么被设计为final?

    Java中String类为什么被设计为final   首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...

随机推荐

  1. HarmonyOS元服务开发实践:桌面卡片字典

     本文转载分享自华为开发者论坛<HarmonyOS元服务开发实践:桌面卡片字典>,作者:蛟龙腾飞   一.项目说明 1.DEMO创意为卡片字典. 2.不同卡片显示不同内容:微卡.小卡.中卡 ...

  2. 【直播预告】HarmonyOS 极客松赋能直播第六期:产品创新从哪里来?

  3. 前端vue+elementUI如何实现记住密码功能

    我们这回使用纯前端保存密码 既然是记住密码,前端也就是使用cookie保存,访问时用cookie读取 先来了解下cookie的基本使用吧 Cookie 所有的cookie信息都在document.co ...

  4. mysql 必知必会整理—数据库的维护[十八]

    前言 简单介绍一下数据库的维护. 正文 像所有数据一样,MySQL的数据也必须经常备份. 由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据. 但是,由于这些文件总是处 ...

  5. 轻松搭建基于 Serverless 的 ThinkPHP 应用

    ThinkPHP 是什么? ThinkPHP 是一个免费开源的,快速.简单的面向对象的轻量级 PHP 开发框架,是为了敏捷 WEB 应用开发和简化企业应用开发而诞生的.ThinkPHP 从诞生以来一直 ...

  6. 可观测告警运维系统调研——SLS告警与多款方案对比

    简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS.Azure.AWS.自建系统(ELK.Prometheus.TICK)等方案. 前言 本篇是SLS新版告警系列宣传与培训的第三篇,后续我 ...

  7. ARMS企业级场景被集成场景介绍

    简介: ARMS企业级场景被集成场景介绍 通过本次最佳实践内容,您可以看到ARMS OpenAPI可以灵活的被集成到客户链路监控场景,并对其进行可视化图形展示监控信息. 1. 背景信息 应用实时监控服 ...

  8. 移动云正式发布基于龙蜥 Anolis OS 的 BC-Linux V8.2 通用版操作系统

    简介: 2020年12月CentOS项目组宣布CentOS 8将于2021年12月31日结束支持,这意味着从2022年开始,使用CentOS 8的用户,将无法得到来自官方的新硬件支持.bug修复和安全 ...

  9. Jaeger插件开发及背后的思考

    ​简介: 本文主要介绍Jaeger最新的插件化后端的接口以及开发方法,让大家能够一步步的根据文章完成一个Jaeger插件的开发.此外SLS也推出了对于Jaeger的支持,欢迎大家试用. 随着云原生 + ...

  10. [Gin] 传统 for 循环中的语义通用化,在 golang 中使用分号 ; 替代 && 流程控制

    // gin.go // HandlerFunc defines the handler used by gin middleware as return value. type HandlerFun ...