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方法了,但是,我们在使用这些方法时的名称就是固定的了,不要用错
JavaEE笔记——BaseDao的使用的更多相关文章
- JavaEE笔记(十四)
#SSH配置文件整合笔记实例 spring-BaseBean.xml <?xml version="1.0" encoding="UTF-8"?> ...
- [JavaEE笔记]Cookie
引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...
- JavaEE笔记(十三)
#单一职责原则 一个类只做一件事 #开闭原则 拓展开,修改源码闭 #动态代理 1 基于接口的方式 jdk的动动代理2 基于类的方式 cglib的代理 #SSH整合 1.spring(容器) 1& ...
- JavaEE笔记(十二)
代理的三种配置 beans配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...
- JavaEE笔记(十一)
Spring beans使用参数占位符(JDBC配置读取示例) beans.xml配置文件 <?xml version="1.0" encoding="UTF-8& ...
- JavaEE笔记(十)
#Spring 为了配置bean对象和维护bean对象之间关系的一个容器框架 #三种注入方法 1 Setter注入2 构造参数注入3 注解注入(原理同1) #自动装配(autowire) 模式 说明 ...
- JavaEE笔记(九)
List.Map.Set的配置 bean package com.spring.bean; import java.util.List; import java.util.Map; import ja ...
- JavaEE笔记(八)
第一个Spring Student(学生) bean package com.my.bean; import java.io.Serializable; public class Student im ...
- JavaEE笔记(七)
Struts获取如何获取请求响应和回话 //获取HttpServletRequest HttpServletRequest request = ServletActionContext.getRequ ...
随机推荐
- python学习笔记(生成xml)
想着给框架加些功能 首先想到的是生成测试报告 这里就涉及到了生成什么格式的文件 我这边就准备生成 xml 格式的文件 自己先学习了整理了下 代码如下: #!/usr/bin/env python # ...
- android开发环境:使用Android Studio搭建Android集成开发环境(图文教程)
开发环境情况: 物理机版本:Win 7旗舰版(64位) Java SDK版本:jdk1.8.0_25(64位) Android SDK版本:Android 7.1(API 25) Android St ...
- 解决Oracle数据库IP地址改变创建数据库的问题
方案一 查了相关的资料后才知道,只要修改安装Oracle的目录下面的listener.ora和tnsnames.ora里面的内容即可.看图看图 修改什么内容呢?看图看图. 就是HOST地址改一下就可 ...
- lucas定理学习
Lucas定理是用来求 c(n,m) mod p,p为素数的值. 表达式: C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p 当我们遇到求一个N,M很大的组合数的时候,递推法就显得很耗 ...
- 【Python】函数的参数对应
我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的参数传递方式. 回忆一下位置传递: def f(a,b,c): return ...
- canvas压缩图片成base64,传到后台解码需要注意的问题
去除压缩完后的头部标志,data:imge一直到,位置,然后看看有没有空格,有的就替换成+号,传送的时候+号被http协议去掉了
- Uncaught TypeError: Cannot read property 'decimalSeparator' of undefined
1.错误描述 jquery.jqGrid.min.js:477 Uncaught TypeError: Cannot read property 'decimalSeparator' of undef ...
- 如何回复在Git中误操作删除的文件?
不小心的操作,删除了某些文件 某天很高大地用上了git来管理版本,分布式版本管理工具,好是好,但是还不是很熟悉,结果某天一不小心就从本地仓库中删除了若干个文件,该如何找回这些文件呢? 调查现场 git ...
- 在linux中使用shell来分析统计日志中的信息
在运维工作中,要经常分析后台系统的日志,通过抓取日志中的关键字信息,对抓取结果进行统计,从而为监控结果提供基础数据.下面的shell演示了如何从大量的日志中取得想要的统计结果.其中展示了各种有趣的命令 ...
- js实现tab页面不同内容切换显示
效果 实现的思路如下: controller层同时把两个内容都查处理 前端html用js控制显示 (1)前端的tab代码 (2)tab内容的结构 (3)关键部分 js $(".hd ...