hibernate ---- 通过泛型配置 DAO

原创 2018年04月16日 17:02:13

来源于自己的一些见解,与网上所找到的一些解释,可能注释的理解部分并不会很全面和正确

package com.test.dao;

import java.io.Serializable;
import java.util.List;

/**
 * 基础dao接口
 * @author Ming
 * @date 2017/11/16 12:46
 */
 // 一个entity user,其主键 id 为 Integer 类型,那么这里就可以BaseDao<user ,Integer>
public interface BaseDao<T, PK extends Serializable> {

    /**
     * 根据主键进行查询
     * @param id
     * @return
     */
    T get(PK id);

    /**
     * 查询所有
     * @return
     */
    List<T> getAll();

    /**
     * 保存
     * @param entity
     */
    void save(T entity);

    /**
     * 根据主键删除
     * @param id
     */
    void delete(PK id);

    /**
     * 修改
     * @param entity
     */
    void update(T entity);

    /**
     * 修改or新增
     * @param entity
     */
    void saveOrUpdate(T entity);

    /**
     * 数据条数
     * @param hql
     * @return
     */
    Integer getSize(String hql);
}
package com.test.dao.impl;


import com.test.dao.BaseDao;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 *继承dao的实现
 * @author Ming
 * @date 2017/11/16 12:46
 */
@Repository
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {

//    DAO 层继承 HibernateDaoSupport , 因为 HibernareDaoSupport 有个属性就是 sessionFactory
//    把sessionfactory赋给HibernateDaoSupprot中的sessionfactory,只有这样我们才能任意的使用HibernateDaoSupport中的任何方法
    @Resource
    private SessionFactory sessionFactory;
    //实际类型的Class对象
    private Class<T> entityClass;

    public BaseDaoImpl() {
//        返回一个包含某些 Class 对象,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。
        Class clz = getClass();
//        返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
        Type type = clz.getGenericSuperclass();
//        instanceof进行类型检查规则是:你属于该类吗?或者你属于该类的派生类吗?而通过getClass获得类型信息采用==来进行检查是否相等的操作是严格的判断。不会存在继承方面的考虑
//        ParameterizedType 表示参数化类型,如 Collection<String>。
        if (type instanceof ParameterizedType) {
            //获取实际参数类型的数组
            Type[] types = ((ParameterizedType) type).getActualTypeArguments();
            entityClass = (Class<T>) types[0];
        }
    }

    /**
     * 获取Session的方法
     * 使用sessionFactory.getCurrentSession(),需要将使用的方法加入事务管理中。
     * 当调用getCurrentSession(),hibernate将session绑定到当前线程,事务结束后,hibernate将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession()时,将得到一个新的session,并重新开始这一系列工作。
     * @return
     */
    public Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public T get(PK id) {
        return (T) getSession().get(entityClass, id);
    }

    @Override
    public List<T> getAll() {
        Query query = getSession().createQuery("from " + entityClass.getName());//from TableName
        return (List<T>) query.list();
    }

    @Override
    public void save(T entity) {
        getSession().save(entity);
        getSession().flush();
    }

    @Override
    public void saveOrUpdate(T entity) {
        getSession().saveOrUpdate(entity);
    }

    /**
     * .fiush() 清理缓存,执行SQL。
     * @param entity
     */
    @Override
    public void delete(PK id) {
        T entity = get(id);
        getSession().delete(entity);
        getSession().flush();
    }

    @Override
    public void update(T entity) {
        getSession().update(entity);
        getSession().flush();
    }

    @Override
    public Integer getSize(String hql) {
        Query query = getSession().createQuery(hql);
        return query.list().size();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38637558/article/details/79961191

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我...
  • u013433821
  • u013433821
  • 2015年09月25日 11:59
  • 3880

Hibernate DAO层 的BaseDao泛型写法

package com.app.base; import java.lang.reflect.ParameterizedType; import java.sql.Connection; impor...
  • qq_24505127
  • qq_24505127
  • 2016年09月11日 17:12
  • 1816

详细介绍 Hibernate 泛型 DAO 及其使用方法

  编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao。查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现...
  • azheng270
  • azheng270
  • 2008年03月31日 09:29
  • 32883

springmvc+hibernate泛型抽取基础Dao与Service

利用泛型抽象出来的dao和service,一开根据网上方法一直想获取泛型T,后来发现是不可行的,需要传递你的pojo.class类package com.xll.dao; import java.ut...
  • xia744510124
  • xia744510124
  • 2016年07月10日 18:22
  • 1878

常用的hibernate泛型dao

import java.io.Serializable; import java.util.List; import com.java1234.entity.PageBean; /** ...
  • ldy944758217
  • ldy944758217
  • 2016年08月10日 14:23
  • 336

Hibernate泛型Dao编写

http://blog.csdn.net/azheng270/article/details/2232044 编写spring+hibernate框架下的应用,总是离不了编写一个通用的泛型Gen...
  • snakeMoving
  • snakeMoving
  • 2017年03月16日 22:30
  • 235

泛型Hibernate DAO实现基本操作

一个泛型hibernate DAO,用了spring的HibernateDaoSupport。提供基本的CRUD操作,支持分页查询,可使用HQL、Criteria和DetachedCriteria. ...
  • laukicn
  • laukicn
  • 2017年05月26日 16:03
  • 318

spring mvc高级篇(六):Spring+SpringMVC+Hibernate整合(采用泛型+注解优化)

6.1整合思路分析 Java Web应用开发经过多年的发展,已经形成了一套成熟的程序结构。一个典型的使用了SpringMVC和Hibernate框架的应用,其结构如下图所示。 SpringM...
  • wx5040257
  • wx5040257
  • 2017年08月13日 01:25
  • 223

<<项目架构那点儿事>>——hibernate泛型Dao,让持久层简洁起来 ...

原文:http://ajava.org/article-156-1.html · 【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的...
  • fenzaiway
  • fenzaiway
  • 2011年12月17日 00:22
  • 3152

基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之三:hibernate4泛型dao的应用

首先将aop代理设置为CGLib动态代理方式,在spring-hibernate.xml里面加上:    一般比较理想的做法,将dao基类定义为泛型,并带有泛型的接口,在controller/s...
  • rocklee
  • rocklee
  • 2016年06月16日 17:08
  • 1049
收藏助手
不良信息举报
您举报文章:hibernate ---- 通过泛型配置 DAO
举报原因:
原因补充:

(最多只允许输入30个字)