// 以后所有的 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 接口的更多相关文章

  1. ssm框架整合抽取BaseDao接口

    import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...

  2. 【01-05】hibernate BaseDao

    BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...

  3. OA项目笔记-从建立接口 dao impl action jsp等框架实现crud

    1,设计 BaseDao 与 BaseDaoImpl 1,设计接口 BaseDao 1,每个实体都应有一个对应的Dao接口,封装了对这个实体的数据库操作.例 实体 Dao接口 实现类 ======== ...

  4. Hibernate的BaseDao辅助类

    1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...

  5. JAVAEE——SSH项目实战02:客户列表和BaseDao封装

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...

  6. BaseDAO使用

    BaseDao接口的过人之处在于:一般是提供从数据库 增加.删除.修改记录.查询所有记录.查询符合某个条件记录.取得某条记录等方法的底层数据操作自定义类.由于我们可能操作多个数据库表,这样就需要为每个 ...

  7. 使用HibernateDaoSupport抽取BaseDao

            在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以 ...

  8. BaseDao的编写:实现 增,删,改,查,分页这些公共方法的编写

    1.BaseDao接口 package com.learning.crm.base; import java.io.Serializable; import java.util.List; publi ...

  9. java的SSH的baseDao,巧用泛型

    BaseDao接口: import java.util.List; public interface BaseDao<T,PK> { public void add(T t); publi ...

随机推荐

  1. hdu 3304 Interesting Yang Yui Triangle

    hdu 3304 Interesting Yang Yui Triangle 题意: 给出P,N,问第N行的斐波那契数模P不等于0的有多少个? 限制: P < 1000,N <= 10^9 ...

  2. SMARTY 变量

    变量 模板变量以美元符号$开头,由字母.数组和下划线组成,和 PHP variable相似. 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等. 配置变量 是例外的,它不是以美元符号$开头, ...

  3. 天猫 小游戏 24 point

    游戏规则:给你四个整数,当然他给的是有解的,然后用' +  -  *   /   (  )   ,这几种符号任意组合,使运算结果等于24; 用代码快速解决问题,呵呵... #include<io ...

  4. The Definitive Guide To Django 2 学习笔记(二) 第二个View 动态内容

    “Hello World”只是简单的展现了Django 基本的工作机制,但它不是动态的网页.第二个View我们将创建一个动态的网页,该页面上将展现当前的时间和日期. 该View需要做两件事,第一,计算 ...

  5. 【Java】之static静态方法与非static静态方法区别

    1.A.class:没有static public class A { public String getText(){ } B.class调用A的方法时 public class B { publi ...

  6. SpringBoot 获取前端页面参数的集中方式总结

    SpringBoot的一个好处就是通过注解可以轻松获取前端页面的参数,之后尅将参数经过一系列处理传送到后台数据库,前端时间正好用到.大致分为一下几种: 1.指定前端URL请求参数名称与方法名称一致,这 ...

  7. ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...

  8. 【R】自定义描述统计函数-从均值到峰度偏度

    data_show<-function(x) { n<-length(x) m<-mean(x) v<-var(x) s<-sd(x) me<-median(x) ...

  9. cout显示Mat类对象报错Access Violation

    AV(Access Violation)错误:非法访问. image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation 程 ...

  10. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...