BaseDao 接口
// 以后所有的 Dao 接口都需要继承 BaseDao 接口;
// 自定义泛型接口
public interface BaseDao<T>{
public void save(T t);
public void delete(T t);
public void update(T t);
public T findById(Long id);
public List<T> findAll();
// 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);
}
// 以后所有的 XxxDaoImpl 都可以继承 BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
// 定义成员属性,代表的是某个实体的类型
private Class<T> entityClass;
// 有参构造方法
public BaseDaoImpl(Class<T> entityClass){
this.entityClass = entityClass;
}
// 添加方法
public void save(T t){
this.getHibernateTemplate().save(t);
}
// 删除方法
public void delete(T t){
this.getHibernateTemplate().delete(t);
}
// 修改方法
public void update(T t){
this.getHibernateTemplate().update(t);
}
// 按主键查找
public T findById(Long id){
return (T)this.getHibernateTemplate().get(entityClass,id);
}
// 查询所有
public List<T> findAll(){
return (List<T>)this.getHibernateTemplate().find("from "+ entityClass.getSimpleName());
}
// 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria){
// 创建分页对象
PageBean<T> page = new PageBean<T>();
// 给其各个属性赋值
page.setPageCode(pageCode);
page.setPageSize(pageSize);
// 设置聚合函数, 此时,SQL 语句已经变成 select count(*) from
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>)this.getHibernateTemplate().fingByCriteria(criteria);
if(list != null && list.size() > 0){
int totalCount = list.get(0).intValue();
// 设置总记录数
page.setTotalCount(totalCount);
}
// 重置 SQL 语句, select * from
criteria.setProjection(null);
List<T> beanList = (List<T>)this.getHibernateTemplate().findByCriteria(
criteria,(pageCode - 1)*pageSize, pageSize
);
page.setBeanList(beanList);
return page;
}
}
// 具体应用
// customer 的接口
public interface CustomerDao extends BaseDao<Customer>{ }
// customer 的实现类
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao{
// 解决按主键查找时, 需要 clazz 类的问题
public CustomerDaoImpl(){
// 调用父类的有参构造方法
super(Customer.class);
}
}
// 第二种解决 clazz 类的问题
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
// 定义成员属性
private Class<T> clazz;
// 当启动服务器时, applicationContext.xml 加载;
// CustomerDaoImpl 类创建对象, 加载父类, 父类也创建
// 父类中的空参构造方法执行
public BaseDaoImpl(){
// this 表示子类, c表示 CustomerDaoImpl 的 Class 对象
// 1. 即得到当前运行类的 Class
Class c = this.getClass();
// 因为 CustomerDaoImpl extends BaseDaoImpl<Customer>
// 2. 获取到运行类的 父类的参数化类型: BasDaoImpl<Customer>
// type 是接口, java.lang.reflect.Type 包中
Type type = c.getGenericSuperclass();
// 3. 转换成子接口 ParameterizedType
// java.lang.reflect.ParameterizedType;
ParameterizedType ptype = (ParameterizedType) type;
// 得到实际类型参数: <Customer> 里面的 Customer
// 例如Map<key,value>, 返回的类型中可能有多个值,所以类型为数组
Type[] types = ptype.getActualTypeArguments();
// type 接口的实现类是 Class
// 赋值给成员属性
this.clazz = (Class<T>)types[0];
}
// 按主键查找
public T findById(Long id){
return (T)this.getHibernateTemplate().get(clazz,id);
}
// 查询所有
public List<T> findAll(){
// 使用 Class 里面getSimpleName(), 得到类名称
// 注意: from 后面需要加空格
return (List<T>)this.getHibernateTemplate().find("from "+ clazz.getSimpleName());
}
}
BaseDao 接口的更多相关文章
- ssm框架整合抽取BaseDao接口
import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...
- 【01-05】hibernate BaseDao
BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...
- OA项目笔记-从建立接口 dao impl action jsp等框架实现crud
1,设计 BaseDao 与 BaseDaoImpl 1,设计接口 BaseDao 1,每个实体都应有一个对应的Dao接口,封装了对这个实体的数据库操作.例 实体 Dao接口 实现类 ======== ...
- Hibernate的BaseDao辅助类
1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...
- JAVAEE——SSH项目实战02:客户列表和BaseDao封装
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...
- BaseDAO使用
BaseDao接口的过人之处在于:一般是提供从数据库 增加.删除.修改记录.查询所有记录.查询符合某个条件记录.取得某条记录等方法的底层数据操作自定义类.由于我们可能操作多个数据库表,这样就需要为每个 ...
- 使用HibernateDaoSupport抽取BaseDao
在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以 ...
- BaseDao的编写:实现 增,删,改,查,分页这些公共方法的编写
1.BaseDao接口 package com.learning.crm.base; import java.io.Serializable; import java.util.List; publi ...
- java的SSH的baseDao,巧用泛型
BaseDao接口: import java.util.List; public interface BaseDao<T,PK> { public void add(T t); publi ...
随机推荐
- Java并发编程(六):Java里实现对象安全发布的四种方式
接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final
- unity的自带特性
2016/9/24补充: unity官方有一篇文章对菜单扩展讲的不错 https://unity3d.com/cn/learn/tutorials/topics/interface-essential ...
- [转]c++ virtual public的含义和作用
我在写基于MICO的CORBA程序的时候遇到的,上网查了一下 转自:http://bbs.seu.edu.cn/pc/pccon.php?id=872&nid=16822 Question:父 ...
- vue 过渡状态
vue的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,例: 数字和运算 颜色的显示 svg节点的位置 元素的大小和其他的属性 所有的原始数字都被事先存储起来, ...
- 数据泵导出oracle 10g数据库
首先连接sqlplus: sqlplus /nolog conn system/manager (或者连接其他用户) 1.创建whboa目录,用于存放导出的dmp文件(需要提前手动创建目录“E:\or ...
- Windows下安装Django【转】
Windows下安装Django及WEB服务启动 如果使用的是 Linux 或 Mac OS X ,系统可能已经预装了 Python .在命令提示符下 (或 OS X 的终端中) 输入python ...
- VM下redhat9.0不能上网
近期本人在学习linux时,安装Red Hat Linux9后,可是上不了网,弄得查资料还得切换到虚拟机上去,特耗时间.还好没有疯掉! 首先,测试下你的linux看是否是这类问题,输入ping www ...
- 解决linux下/etc/rc.local开机器不执行的原因
前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙,调试完给了技术支持人员,也没去注意过. 到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做 ...
- C语言 函数指针三(反向调用)
动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...
- SpringBoot启动过程原理
最近这两年springboot突然火起来了,那么我们就来看看springboot的运行原理. 一.springboot的三种启动方式: 1.运行带有main方法的2.通过命令 Java -jar命令3 ...