博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对Java泛型的简单理解,并对Hibernate Dao重构
阅读量:6457 次
发布时间:2019-06-23

本文共 2255 字,大约阅读时间需要 7 分钟。

hot3.png

引用维基百科的定义:

    泛型的定义主要有以下两种:

  1. 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
  2. 在程序编码中一些包含参数的。其参数可以代表类或对象等等。(现在人们大多把这称作模板)

        泛型的好处是在编译的时候检查,并且所有的都是自动和隐式的,提高代码的重用率。

泛型只不过是java中的类型而已,继承自Type接口。

泛型的意义在于:在抽象的时候泛化,在具体的时候细化,在编译的时候就可以决定泛化的值。通俗得讲,可以将泛型看做是类或者接口带了一个参数,这个参数可以在属性、方法的参数、方法的返回值中使用使用。

ParameterizedType有如下几个方法:

 [] () 
          返回表示此类型实际类型参数的 Type 对象的数组。
  () 
          返回 Type 对象,表示此类型是其成员之一的类型。
  () 
          返回 Type 对象,表示声明此类型的类或接口。

actualTypeArguments指类的参数

rawType指带了参数的类或者接口

了解这些之后,就可以对使用了Hibernate的Dao进行一次CRUD的重构。

import java.lang.reflect.ParameterizedType;import java.util.Collection;import javax.annotation.Resource;import org.hibernate.Query;import org.hibernate.SessionFactory;/** * 超类dao实现,专门用于继承 */@SuppressWarnings("unchecked")public abstract class BaseDaoImpl
implements BaseDao
{ //注入会话工厂 @Resource(name="sessionFactory") private SessionFactory sf ; private Class
clazz ; /** * 1、this代表该类的子类 * 2、this.getClass().getGenericSuperclass()代表该类 * 3、type.getActualTypeArguments()[0]就是T * 4、type.getRawType()就是BaseDaoImpl */        public BaseDaoImpl(){ ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); clazz = (Class
) type.getActualTypeArguments()[0]; } public void saveEntity(T t) { sf.getCurrentSession().save(t); } public void updateEntity(T t) { sf.getCurrentSession().update(t); } public void saveOrUpdateEntity(T t) { sf.getCurrentSession().saveOrUpdate(t); } public void deleteEntity(T t) { sf.getCurrentSession().delete(t); } //批量更新 public void batchEntityByHQL(String hql, Object... objects) { Query q = sf.getCurrentSession().createQuery(hql); for(int i = 0 ; i < objects.length ; i ++){ q.setParameter(i, objects[i]); } q.executeUpdate(); } public T getEntity(Integer id) { return (T) sf.getCurrentSession().get(clazz, id); } public T loadEntity(Integer id) { return (T) sf.getCurrentSession().load(clazz, id); } public Collection
findEntityByHQL(String hql, Object... objects) { Query q = sf.getCurrentSession().createQuery(hql); for(int i = 0 ; i < objects.length ; i ++){ q.setParameter(i, objects[i]); } return q.list(); }}

其他的dao只要继承此类即可。

另外推荐两篇文章:

转载于:https://my.oschina.net/mlongbo/blog/90778

你可能感兴趣的文章
利用网易获取所有股票数据
查看>>
移动铁通宽带上网设置教程
查看>>
Python算法(含源代码下载)
查看>>
利用Windows自带的Certutil查看文件MD5
查看>>
通过原生js添加div和css
查看>>
简单的导出表格和将表格下载到桌面上。
查看>>
《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
查看>>
JAVA - 大数类详解
查看>>
查询指定名称的文件
查看>>
Python 嵌套列表解析
查看>>
[GXOI/GZOI2019]旧词——树链剖分+线段树
查看>>
anroid 广播
查看>>
AJAX POST&跨域 解决方案 - CORS
查看>>
关于最小生成树中的kruskal算法中判断两个点是否在同一个连通分量的方法总结...
查看>>
开篇,博客的申请理由
查看>>
Servlet 技术全总结 (已完成,不定期增加内容)
查看>>
[JSOI2008]星球大战starwar BZOJ1015
查看>>
CountDownLatch与thread-join()的区别
查看>>
centos 7 部署LDAP服务
查看>>
揭秘马云帝国内幕:马云的野心有多大
查看>>