Dao层抽取BaseDao

结构图

BaseDao.java

import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;

public interface BaseDao<T> {

    //增
    void save(T t);
    //删
    void delete(T t);
    //删
    void delete(Serializable id);
    //改
    void update(T t);
    //查 根据id查询
    T getById(Serializable id);
    //查 查询总计路数
    Integer getTotalCount(DetachedCriteria dc);
    //查 查询分页数据
    List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
}

BaseDaoImpl.java

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import cn.itcast.dao.BaseDao;

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

    private Class clazz;//用于接收运行期泛型类型

    public BaseDaoImpl(){
        //获得当前类型的带有泛型类型的父类
        ParameterizedType pd = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class) pd.getActualTypeArguments()[0];
    }

    @Override
    public void save(T t) {
        getHibernateTemplate().save(t);
    }

    @Override
    public void delete(T t) {
        getHibernateTemplate().delete(t);
    }

    @Override
    public void delete(Serializable id) {
        T t = this.getById(id);
        getHibernateTemplate().delete(t);
    }

    @Override
    public void update(T t) {
        getHibernateTemplate().update(t);
    }

    @Override
    public T getById(Serializable id) {

        return (T) getHibernateTemplate().get(clazz.getClass(), id);
    }

    @Override
    public Integer getTotalCount(DetachedCriteria dc) {

        //设置查询的聚合函数,总计路数
        dc.setProjection(Projections.rowCount());
        List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
        //清空之前设置的聚合函数(防止再次使用dc)
        dc.setProjection(null);
        if(list!=null && list.size() > 0){
            Long count = list.get(0);
            return count.intValue();
        } else {
            return null;
        }
    }

    @Override
    public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {

        List<T> lsit = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
        return lsit;
    }

}

CustomerDao.java

public interface CustomerDao extends BaseDao<Customer> {
    //可以定义BaseDao中没有的方法,定义私有方法
}

CustomerDaoImpl.java

public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {

}

总结:这样定义BaseDao使得把所有dao上的共同方法抽取到一个dao上,减少了代码量,并且在每个dao上还可以定义私有的方法,用来实现BaseDao不能实现的功能。

时间: 2024-08-28 11:02:09

Dao层抽取BaseDao的相关文章

系统管理模块_部门管理_改进_抽取添加与修改JSP页面中的公共代码_在显示层抽取BaseAction_合并Service层与Dao层

系统管理模块_部门管理_改进1:抽取添加与修改JSP页面中的公共代码 commons.jspf <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <meta http-equiv="Conten

Javaee的Dao层的抽取

有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface LinkManDao { Integer findCount(DetachedCriteria detachedCriteria); List<LinkMan> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Int

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl

在spring+hibernate的web项目中,处理数据层通常会使用Spring框架提供的HibernateTemplate类提供的方法.通常的用法是每一个实体类对应的去写DAO层的接口和实现类.每个实现类中都写hibernateTemp.save(entity).hibernateTemp.update(entity).hibernateTemp.get(id)...这样写固然没错,但存在着大量的重复代码.所以懒惰的程序员烦了,他们要写一个通用的实现类来解决这个问题,让DAO层解放出来.如果

利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

想利用泛型抽取BaseDao层,简化操作时出现问题: @Transactional这个注解是可以继承的,于是就想写在抽取的BaseDao层上,让实现的类可以不用写@Transactional,就可开启事务. 问题描述: 由于偷懒,没给BaseDao抽接口,代码如下: package com.liang.ssh2.base; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.u

SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月6日 http://www.cnblogs.com/fanshuy

JavaWeb中Dao层的接口和基本功能简单抽取技巧

在dao层书写具体实现类的时候会将dao层功能抽取到接口中,然后去实现该接口,实现具体方法,书写具体功能代码. 抽取如图: 但是这种抽取不是很友好,由图可以看出,每个实现类中都要书写共同的增删改查方法,这样就是使得代码存再冗余,重复代码多次书写.此时就需要考虑将增删改查的代码再次抽取出来,写在一个类中. 抽取如图: 将增删改查的共用代码抽取到BaseDaoImpl中,提高代码的重用性,在具体的Dao调用共用方法时,指定泛型类型即可.

使用HibernateDaoSupport抽取BaseDao

在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以.Spring里面有个HibernateDaoSupport的类,这个类需要给他一个SessionFactory.有了SessionFactory后,他就可以做各种操作:最强大的功能是它可以getHibernateTemplate来获取一个HibernateTemplate.有了HibernateTemplate,

我的Dao层

Spring 为整合 Hibernate3 提供了两个工具类,分别是 HibernateTemplate 和 HibernateDaoSupport ,但是 Spring 不推荐使用这两个实现 Dao 层,因为操作复杂 CRUD 不是很灵活,而是推荐使用通过注入 SessionFactory 的方式,用过 getCurrentSession() 获取当前线程的 Session 对象,然后进行持久化. 下面是我在自己练手项目中实现的 Dao 层: 1 .  Dao层的顶层接口类: package

JAVA实现DAO层基本CRUD操作

随着shh2框架各种操作的便利性,越来越多的JAVA WEB开发人员选择通过加入这些框架以提高开发效率,但是,如果在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成很多没必要的资源浪费. 在项目开发中,对数据库的CRUD操作我们一般都是无法避免的操作,虽然hibernate封装的很完美,但是,由于本人对这个框架的底层原理不是很了解,每次使用的时候心里总觉得没底,代码一旦出现异常,很多时候都没法快速有效地解决,因此,为了让代码异常处理风险控制在自己的