JavaEE笔记——BaseDao的使用

在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方法了,但是,我们在使用这些方法时的名称就是固定的了,不要用错

时间: 2024-12-30 18:57:35

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

JavaEE笔记(十四)

#SSH配置文件整合笔记实例 spring-BaseBean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="htt

javaee笔记之web.xml文件内的标签到底什么意思

随笔,javaee web.xml文件里得核心标签作用

JavaEE笔记(十三)

#单一职责原则 一个类只做一件事 #开闭原则 拓展开,修改源码闭 #动态代理 1 基于接口的方式 jdk的动动代理2 基于类的方式 cglib的代理 #SSH整合 1.spring(容器)    1>导入jar包    2>测试spring是否能够正常运行2.hibernate(持久层)    1>导入jar包    2>测试hibernate是否能够正常运行    3>整合到spring中[spring将接管hibernate]        要把hibernate.cfg

JavaEE笔记(十)

#Spring 为了配置bean对象和维护bean对象之间关系的一个容器框架 #三种注入方法 1 Setter注入2 构造参数注入3 注解注入(原理同1) #自动装配(autowire) 模式 说明 no 不使用自动装配.必须通过ref元素指定依赖,这是默认设置.由于显式指定协作者可以使配置更灵活.更清晰,因此对于较大的部署配置,推荐采用该设置.而且在某种程度上,它也是系统架构的一种文档形式. byName 根据属性名自动装配.此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性

JavaEE笔记(六)

实现Action的几种方法1. implements Action2. extends ActionSupport3. 也可以不继承任何父类不实现任何借口 #当一个类有多个方法 package com.struts.test; import com.opensymphony.xwork2.ActionSupport; public class Test extends ActionSupport { private static final long serialVersionUID = 1L;

JavaEE笔记(三)

缓存是通过map储存的     hibernate中一对一关系配置 // 如果A中有B 或者B中有A,那么为单项关联 // 如果A和B互有,那么为双向关联(最常用) class A{ private int id; private String name; private B b; } class B{ private int id; private String name; private A a; } 主键关联 <!-- 两个对象必须确认它们被赋予相同的标识符 B 配置文件的id配置参数 -

JavaEE笔记(九)

List.Map.Set的配置 bean package com.spring.bean; import java.util.List; import java.util.Map; import java.util.Set; public class People { private String name; // 姓名 private Set<City> cities; // 去过的城市 private List<Examine> examines; // 考核成绩 privat

JavaEE笔记(十一)

Spring beans使用参数占位符(JDBC配置读取示例) beans.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:co

JavaEE笔记(五)

version 必须配置在id后面 缓存文件在映射文件后面 一级缓存:session回话级别 Session缓存的作用 (1)减少访问数据库的频率.应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能. (2)保证缓存中的对象与数据库中的相关记录保持同步.当缓存中持久化对象的状态发生了变化,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,