// 以后所有的 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());
}
}

最新文章

  1. HTML 学习笔记 JQuery(选择器)
  2. 支付宝通知页面notify_url、返回页面return_url
  3. html 输入框验证
  4. servlet&amp;jsp高级:第五部分
  5. JDOM方法实现对XML文件的解析
  6. javascript创建对象(一)
  7. iOS打电话、发邮件、发短信、打开浏览器
  8. 新手必看:如何快速看懂VC++项目
  9. 四种JavaScript隐式类型转换的总结
  10. HTML5图片居中的问题
  11. iOS 10.0之前和之后的Local Notification有神马不同
  12. wtforms-表单生成及验证
  13. hg和git命令对照表
  14. [总结]其他杂项数学相关(定理&amp;证明&amp;板子)
  15. Cisco DHCP 配置方法
  16. Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)
  17. Android基础(五) Service全解析----看不见的Activity
  18. 在一个gradle 的maven property 里添加多个URL
  19. Comet:基于 HTTP 长连接的“服务器推”技术(转载)
  20. webpack 分析

热门文章

  1. [k8s]k8s架构图解
  2. 基于numpy的随机数构造
  3. 0053 用注解方式配置Spring MVC
  4. CCNA2.0笔记_动态路由
  5. 截图工具gsnap
  6. FastDFS安装详解
  7. [Django] 问题记录追踪表
  8. 什么是AOP和OOP,IOC和DI有什么不同?
  9. 【vijos】1447 开关灯泡(高精度+特殊的技巧)
  10. 【BZOJ】3299: [USACO2011 Open]Corn Maze玉米迷宫(bfs)