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 ...
随机推荐
- hdu 3304 Interesting Yang Yui Triangle
hdu 3304 Interesting Yang Yui Triangle 题意: 给出P,N,问第N行的斐波那契数模P不等于0的有多少个? 限制: P < 1000,N <= 10^9 ...
- SMARTY 变量
变量 模板变量以美元符号$开头,由字母.数组和下划线组成,和 PHP variable相似. 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等. 配置变量 是例外的,它不是以美元符号$开头, ...
- 天猫 小游戏 24 point
游戏规则:给你四个整数,当然他给的是有解的,然后用' + - * / ( ) ,这几种符号任意组合,使运算结果等于24; 用代码快速解决问题,呵呵... #include<io ...
- The Definitive Guide To Django 2 学习笔记(二) 第二个View 动态内容
“Hello World”只是简单的展现了Django 基本的工作机制,但它不是动态的网页.第二个View我们将创建一个动态的网页,该页面上将展现当前的时间和日期. 该View需要做两件事,第一,计算 ...
- 【Java】之static静态方法与非static静态方法区别
1.A.class:没有static public class A { public String getText(){ } B.class调用A的方法时 public class B { publi ...
- SpringBoot 获取前端页面参数的集中方式总结
SpringBoot的一个好处就是通过注解可以轻松获取前端页面的参数,之后尅将参数经过一系列处理传送到后台数据库,前端时间正好用到.大致分为一下几种: 1.指定前端URL请求参数名称与方法名称一致,这 ...
- ASP.NET中常用的26个优化性能方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...
- 【R】自定义描述统计函数-从均值到峰度偏度
data_show<-function(x) { n<-length(x) m<-mean(x) v<-var(x) s<-sd(x) me<-median(x) ...
- cout显示Mat类对象报错Access Violation
AV(Access Violation)错误:非法访问. image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation 程 ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...