1.DAO层使用泛型类,主要是定义一些通用的增删改查,然后其他DAO的类都来继承该类,通过构造方法将class对象传给该泛型类

定义泛型接口

package sanitation.dao;

import java.util.List;/** * * @param <T>*/

public interface GenericDAO <T>{/**     * 通过ID获得实体对象     *      * @param id实体对象的标识符     * @return 该主键值对应的实体对象*/    T findById(int id);

/**     * 将实体对象持久化     *      * @param entity 需要进行持久化操作的实体对象     * @return 持久化的实体对象*/    T makePersitent(T entity); 

/**     * 将实体变为瞬态     *      * @param entity需要转变为瞬态的实体对象*/void makeTransient(T entity);

/**     * 将一系列的实体变为瞬态,使用本地sql     *      * @param hql*/void makeTransientByIds(String sql);

/**     *      * 使用hql语句进行分页操作     *      * @param hql         * @param offset    第一条记录索引     * @param pageSize    每页需要显示的记录数     * @return    查询的记录*/    List<T> findByPage(final String hql,final int offset,final int pageSize);

/**     * 使用hql 语句进行分页查询操作     *      * @param hql 需要查询的hql语句     * @param value 如果hql有一个参数需要传入,value就是传入的参数     * @param offset 第一条记录索引     * @param pageSize 每页需要显示的记录数     * @return 当前页的所有记录*/    List<T> findByPage(final String hql , final Object value ,final int offset, final int pageSize);

/**     * 使用hql 语句进行分页查询操作     *      * @param hql 需要查询的hql语句     * @param values 如果hql有一个参数需要传入,value就是传入的参数     * @param offset 第一条记录索引     * @param pageSize 每页需要显示的记录数     * @return 当前页的所有记录*/    List<T> findByPage(final String hql, final Object[] values,final int offset, final int pageSize);

/**     * 使用sql 语句进行分页查询操作     *      * @param sql     * @param offset     * @param pageSize     * @return*/    List findByPageSQL(final String sql, final int offset, final int pageSize);

/**     * 根据语句查找总数     * @param hql hql语句     * @return 对应的数目*/    Integer getCount(String hql);

void updateObj(final String hql,final Object[] values);}

定义实现类

package sanitation.dao.impl;

import java.sql.SQLException;import java.util.List;

import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import sanitation.dao.GenericDAO;

public class GenericHibernateDAO<T> extends HibernateDaoSupport implements GenericDAO<T>{

private Class<T> persistentClass;

public GenericHibernateDAO(Class<T> persistentClass){this.persistentClass=persistentClass;    }

public Class<T> getPersistentClass(){return persistentClass;    }

    @SuppressWarnings("unchecked")public T findById(int id) {return (T)getHibernateTemplate().get(getPersistentClass(), id);    }

    @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final int offset, final int pageSize){        List<T> list= getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(final Session session)throws HibernateException, SQLException{                    Query query=session.createQuery(hql);if(!(offset==0 && pageSize==0)){                        query.setFirstResult(offset).setMaxResults(pageSize);                    }                    List<T> result = query.list();return result;                }            });return list;    }

    @SuppressWarnings("unchecked")public List findByPageSQL(final String sql, final int offset, final int pageSize){        List list= getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(final Session session)throws HibernateException, SQLException{                    Query query=session.createSQLQuery(sql);if(!(offset==0 && pageSize==0)){                        query.setFirstResult(offset).setMaxResults(pageSize);                    }                    List result = query.list();return result;                }            });return list;    }

    @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final Object value, final int offset, final int pageSize) {        List<T> list = getHibernateTemplate().executeFind(new HibernateCallback()        {public Object doInHibernate(Session session)throws HibernateException, SQLException            {                Query query=session.createQuery(hql).setParameter(0, value);if(!(offset==0 && pageSize==0)){                    query.setFirstResult(offset).setMaxResults(pageSize);                }                List<T> result = query.list();return result;            }        });return list;    }

    @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final Object[] values, final int offset,final int pageSize) {        List<T> list = getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{                Query query=session.createQuery(hql);for (int i = 0 ; i < values.length ; i++){                    query.setParameter( i, values[i]);                }if(!(offset==0 && pageSize==0)){                    query.setFirstResult(offset).setMaxResults(pageSize);                }                List<T> result = query.list();return result;            }        });return list;    }

public void updateObj(final String hql, final Object[] values) {        getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{                Query query=session.createQuery(hql);for(int i=0;i<values.length;i++){                    query.setParameter( i, values[i]);                }                query.executeUpdate();return null;                }        });    }

public Integer getCount(String hql) {        Integer count;//iterate方法与list方法的区别是list取出全部,iterator取出主键,迭代的时候才取出数据        count = ((Long)getHibernateTemplate().iterate(hql).next()).intValue();return count;    }

public T makePersitent(T entity) {        getHibernateTemplate().saveOrUpdate(entity);return entity;    }

public void makeTransient(T entity) {        getHibernateTemplate().delete(entity);    }

public void makeTransientByIds(final String sql) {        getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{                Query query=session.createQuery(sql);                query.executeUpdate();return null;            }        });    }

}

2.而有时我们为了方便起见,对于一些简单的项目,DAO的操作很单一,不会有很复杂的操作,那么我们直接用泛型方法类代替泛型类,主要就不需要写其他的DAO来继承,

整个DAO层就一个DAO类。

接口:

package com.xidian.dao;

import java.util.List;

import com.xidian.bean.Admin;import com.xidian.bean.HostIntroduce;import com.xidian.bean.Reply;

public interface CommonDAO {public <T> void sava(T entity);                                        //保存用户,无返回值;    public <T> void remove(T entity);                                    //删除用户    public <T> void update(T entity);                                    //更新用户    public <T> T findById(Class<T> entityClass, Integer id);            //通过id来查找某一个用户;    public <T> List<T> findAll(Class<T> entityclass);                    //使用范型List<>,查询所有的用户信息

}

实现类:

package com.xidian.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.xidian.bean.Admin;import com.xidian.bean.HostIntroduce;import com.xidian.bean.Reply;import com.xidian.dao.CommonDAO;

public class CommonDAOImpl extends HibernateDaoSupport implements CommonDAO {    @SuppressWarnings("unchecked")    @Overridepublic <T> List<T> findAll(Class<T> entityclass) {//String name = entity.getClass().getName();        String hql = "from "+entityclass.getName()+" as aaa order by aaa.id desc";return this.getHibernateTemplate().find(hql);    }

    @SuppressWarnings("unchecked")    @Overridepublic <T> T findById(Class<T> entityClass, Integer id) {return (T) this.getHibernateTemplate().get(entityClass, id);    }

    @Overridepublic <T> void remove(T entity) {this.getHibernateTemplate().delete(entity);    }

    @Overridepublic <T> void sava(T entity) {this.getHibernateTemplate().save(entity);    }

    @Overridepublic <T> void update(T entity) {this.getHibernateTemplate().update(entity);    }

}

使用泛型可以使代码大大的精简

转载于:https://www.cnblogs.com/shenliang123/archive/2012/04/05/2433134.html

DAO层使用泛型的两种方式相关推荐

  1. VUE实现点击头像出现遮罩层的功能的两种方式

    本文是为了解决点击头像,出现一个遮罩层,显示上传头像.先说一下思路,第一种是用动画的方式来移动位置,但是ie9不支持动画,ie8一下直接不支持位置移动.所以某就研究了第二种方式,就是利用相对位置的固定 ...

  2. java native函数库_Java 层调用 Native 层函数的两种方式

    概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...

  3. ue4输出id层的两种方式

    这里记录下id层输出的方式 id层通常是影视动画中方便后期调节 第一种方式就是普通方式 首先ue4内部custom render passes并没有直接的id层选择,id层输出需要靠Custom  s ...

  4. Spring系列教程八: Spring实现事务的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 一. Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的 ...

  5. easyui treegrid实现的两种方式

    感觉easyui官方的treegrid文档不是很清晰,当时使用的时候查了许多资料才做出来,现在总结一下两种实现方式的思路: 两种方式前台都一样: $('#tree').treegrid({url:&q ...

  6. Spring中进行事务管理的两种方式

    1.Spring中事务管理的API 事务是指逻辑上要么全部成功.要么全部失败的一组操作.例如用户A给用户B转账,则用户A账户余额减少.用户B账户增加这两个操作就是一组事务,必须全部成功或失败撤回操作, ...

  7. mybatis一对多关联查询两种方式

    mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...

  8. java提交数据到另一个页面_JS实现把一个页面层数据传递到另一个页面的两种方式...

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  9. [原][osg][gdal]两种方式修改tiff高程

    因为对于globalmap不熟悉,不怎么怎么修改高程,好像也没有这功能. 干脆自己手动修改了高程图tiff了 由于自身一直使用osg的 自己使用了osgDB直接读取tiff,修改后保存的. 同事小周一 ...

最新文章

  1. 通用解题法——回溯算法(理解+练习)
  2. 哈夫曼树(最优二叉树)(c/c++)
  3. cent 8.0 安装tomcat 9.0_JDK-TOMCAT-MYSQL安装
  4. 【Echarts 3.x】填坑记
  5. 智慧城市这份试卷 国外城市怎么答题?
  6. solr mysql 自动同步_MongoDB和Solr的整合以及实现数据同步功能
  7. 基于深度学习和支持向量机的4种苜蓿叶部病害图像识别
  8. android zxing 自动对焦,Zxing中的camera
  9. matlab r2014a 序列号,Matlab R2014a 免费版
  10. linux下Js加载so,JavaScript文件加载器LABjs API详解
  11. speedoffice(Word)文档中如何插入图片
  12. ORACLE表空间和表碎片分析及整理方法
  13. 秒云获得阿里云首批产品生态集成认证,携手阿里云共建云原生智能运维生态服务
  14. mysql pdo 端口_链接Mysql的api mysqli和pdo
  15. Kiner算法刷题记(二十一):字典树与双数组字典树(数据结构基础篇)
  16. 北邮邮箱与Win10自带邮箱相连接
  17. RAC 中GES/GCS原理
  18. 2023年房企数字化预算该往哪些场景投?(附爱分析报告下载)
  19. python天天向上续。尽管每天坚持,但人的能力发展并不是无限的,它符合特定模型。实例1的修改。改造实例代码1.1。回文数。
  20. concat、concatenate、add

热门文章

  1. 足够应付面试的Spring事务源码阅读梳理
  2. 漫画科普 | 5G到底是个什么玩意儿?
  3. 如何使用 Redis 实现大规模的帖子浏览计数
  4. 埋在 MySQL 数据库应用中的17个关键问题!
  5. 分布式领域架构师要掌握的技术
  6. Spring Cloud Gateway(限流)
  7. 一个简单案例,5 分钟看懂 Java Lamdba 表达式
  8. SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
  9. 模拟二:STEMA 考试选择题模拟练习试卷(中级组) 及答案 + 解题后期更新
  10. Spring Boot—SpringMVC自动配置原理以及扩展和全面接管SpringMVC