在Hibernate框架中使用BaseDao主要的作用是减少冗余代码,在对Dao的操作中CRUD可以说是最普通最常见的操作了,基本上面对不同的数据表都会有类似的CRUD操作,BaseDao的思想就是把这些冗余的操作抽取出来,所以不需要在spring框架的applicationContext.xml中注册,这可能是与其他Dao不同之处。作为一个抽象出来的类,使用这个BaseDao可以使我们的代码更优雅

第一步:和普通Dao一样,先创建个接口

接口中实现的方法有add(添加),update(更新),delete(删除),findOne(根据id查询),findAll(查询所有)。其实,可以不局限于这几个方法,只要是Dao中都有的操作,都可以抽取进去,这里只进行基本方法的抽取,这里使用泛型,T代表所有类型。

import java.util.List;

public interface BaseDao<T> {

    public void add(T t);

    public void update(T t);

    public void delete(T t);

    public T findOne(int id);

    public List<T> findAll();

}

第二步:实现这个接口,写方法的具体逻辑

这个类还要继承HibernateDaoSupport,这样在具体的Dao类中就可以不继承HibernateDaoSupport,只要继承于我们编写BaseDaoImpl就行了。BaseDaoImpl类使用了反射和泛型。

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import cn.lynu.dao.BaseDao; public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class pClass; public BaseDaoImpl() {
//第一步,得到当前运行类的class
Class clazz = this.getClass();
//第二步,得到运行类的父类的参数化类型
Type type = clazz.getGenericSuperclass();
ParameterizedType pType=(ParameterizedType) type;
//第三步,得到实际类型参数
Type[] types = pType.getActualTypeArguments();
Class tClass= (Class) types[0];
this.pClass=tClass;
} //添加
public void add(T t) {
this.getHibernateTemplate().save(t);
} //更新
public void update(T t) {
this.getHibernateTemplate().update(t);
} //删除
public void delete(T t) {
this.getHibernateTemplate().delete(t);
} //根据Id查询
public T findOne(int id) {
return (T) this.getHibernateTemplate().get(pClass, id);
} //查询所有(使用getSimpleName得到简称类名,否则,将会使用类的全路径从而出错)
public List<T> findAll() {
return (List<T>) this.getHibernateTemplate().find("from "+pClass.getSimpleName());
} }

第三步:把所有Dao接口继承于BaseDao,所有的Dao实现类继承于BasedaoImpl

看这个Dao接口的实现(别忘了泛型):

再看DaoImpl类的实现(不用继承HibernateDaoSupport):

注意:这样我们就不用在UserDao中再写CRUD和findOne,findAll方法了,但是,我们在使用这些方法时的名称就是固定的了,不要用错

JavaEE笔记——BaseDao的使用的更多相关文章

  1. JavaEE笔记(十四)

    #SSH配置文件整合笔记实例 spring-BaseBean.xml <?xml version="1.0" encoding="UTF-8"?> ...

  2. [JavaEE笔记]Cookie

    引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...

  3. JavaEE笔记(十三)

    #单一职责原则 一个类只做一件事 #开闭原则 拓展开,修改源码闭 #动态代理 1 基于接口的方式 jdk的动动代理2 基于类的方式 cglib的代理 #SSH整合 1.spring(容器)    1& ...

  4. JavaEE笔记(十二)

    代理的三种配置 beans配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

  5. JavaEE笔记(十一)

    Spring beans使用参数占位符(JDBC配置读取示例) beans.xml配置文件 <?xml version="1.0" encoding="UTF-8& ...

  6. JavaEE笔记(十)

    #Spring 为了配置bean对象和维护bean对象之间关系的一个容器框架 #三种注入方法 1 Setter注入2 构造参数注入3 注解注入(原理同1) #自动装配(autowire) 模式 说明 ...

  7. JavaEE笔记(九)

    List.Map.Set的配置 bean package com.spring.bean; import java.util.List; import java.util.Map; import ja ...

  8. JavaEE笔记(八)

    第一个Spring Student(学生) bean package com.my.bean; import java.io.Serializable; public class Student im ...

  9. JavaEE笔记(七)

    Struts获取如何获取请求响应和回话 //获取HttpServletRequest HttpServletRequest request = ServletActionContext.getRequ ...

随机推荐

  1. vue2项目中better-scroll 插件使用时候页面不滚动

    参考这里 1.外面包裹层的高度没有设置或者条目的高度没有超过外面包裹层的高度 2.初始化BetterScroll的时机不对,当前元素还没有正常渲染出来,导致BetterScroll的高度的计算错误

  2. sql日期函数总结

    sql 时间转换格式 convert(varchar(10),字段名,转换格式)   convert(varchar(10),字段名,转换格式) CONVERT(nvarchar(10),count_ ...

  3. 2017.10.30 Epicor -ERP

    1 公司新用ERP系统,做使用培训,mark... This course reviews the project management flow in the Epicor application. ...

  4. c#中绝对路径和相对路径

    文件操作涉及一个非常重要的概念——文件路径.文件路径是指用来标识系统中文件存放位置的字符串.如:D:\\test.txt,表示在D盘根目录下存入test.txt文件. 文件路径分为绝对路径和相对路径. ...

  5. java学习网站推荐

    推荐大家一个好的java学习网站: http://www.programcreek.com/java-api-examples/index.php 可以找到api对应的开源项目使用的代码.

  6. Android数据读取之Sqlite数据库操作

    咱们书接上文,继续来说说Android数据读取,这回,我们要讲的是Sqlite数据库的相关操作.以一个实例开始吧: 首先,上图,看看做成后的效果: 大概描述:类似于浏览器的收藏夹,网站名称,网站地址, ...

  7. 2017年国内已经开设机器人工程专业(080803T)高校名单

    相关资料来源于教育部公布的2014年度和2016年度普通高等院校本科专业备案或审批结果的通知: 2014年批次 http://www.moe.edu.cn/publicfiles/business/h ...

  8. 对结合BDD进行DDD开发的一点思考和整理

    引言 二十年前的我,还在学校里抱着一台DIY机(德州486+大众主板+16M内存+3.5inch软驱+昆腾320M硬盘,当时全校最快主机没有之一),揣着一本<Undocumented DOS&g ...

  9. linux基础【文件夹含义】

    linux文件目录是一个树状的目录 bin -->可执行文件 boot-->操作系统引导文件,系统内核,启动信息 dev -->device,设备信息,计算机硬件设备信息 etc - ...

  10. 如何加快MyEclipse的启动速度

    学习java开发的朋友对Myeclipse应该不陌生,MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的 ...