想弄一个hibernate的通用dao,网上查了下资料.有的太复杂了,看不懂.有的简单的就觉得不太合理.
麻烦高手帮我列一下通用的dao的继承关系,每个dao该有什么方法(列举1,2),然后哪个dao是提供给service继承的.
谢谢了!!!

解决方案 »

  1.   

    通用接口吧- -!public interface BaseDao<T> {

    T get(Integer id);

    void update(T t);

    void save(T t);

    void delete(T t);

    List<T> findAll();
      

  2.   

    直接用myeclipse的hibernate插件来生成一批类。。就完全解决了
      

  3.   

    ....不用eclipse..
    idea 9我主要就是想要了解那些接口什么的之间的继承关系.service层调用时继承的是哪个
      

  4.   

    你可以先dao接口。然后在他的实现类里面完成dao接口里面的增删改查。service调用的是dao的接口,本人也经验不足,说出自己的看法,请参考。
      

  5.   

    dao层越通用以后出现越多问题
      

  6.   

    接口
    public interface AjCfDao { /**
     * 按照分页查询库房信息
     * @param pageNo
     * @return
     */
    public List searchAllCfInDao(int pageNo);

    /**
     * 根据案卷id查询其库房信息
     * @param ajid
     * @return
     */
    public Object getCfByAjIdInDao(int ajid);
    /**
     * 添加新的库房信息
     * @param ajcf
     */
    public void addCfInDao(OaAjcf ajcf);

    /**
     * 修改库房信息
     * @param ajcf
     */
    public void updateCfInDao(OaAjcf ajcf);
    /**
     * 根据库房id查询库房详细信息
     * @param cfid
     * @return
     */

    public Object getCfByCfIdInDao(int cfid);

    /**
     * 根据查询条件获取库房的列表信息
     * @param ajcf
     * @return
     */
    public List searchCfByConditionsInDao(OaAjcf ajcf,int pageNo);

    /**
     * 获得查询之后的总数据量
     * @param ajcf
     * @return
     */
    public int getCfCouontByConditionsInDao(OaAjcf ajcf);
    }
    package com.it.oa.dao.parent;import java.io.Serializable;
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;import org.hibernate.Criteria;
    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 com.it.oa.dao.BaseSpringHibDao;public class BaseSpringHibDaoImpl extends HibernateDaoSupport implements BaseSpringHibDao { /**
     * 添加新的对象
     */
    public boolean add(Object obj) {
    try {

    super.getHibernateTemplate().save(obj);

    return true;

    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }

    } /**
     * 根据id和类删除对象
     */
    public boolean del(Class clz,Serializable id) {
    Object itme = null;

    try {
    //获取到对象的实体
    itme = this.get(clz, id);

    super.getHibernateTemplate().delete(itme);
    return true;

    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }

    }
    /**
     * 根据对象删除
     * @param obj
     * @return
     */
    public boolean del(Object obj){

    try {

    super.getHibernateTemplate().delete(obj);
    return true;

    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }

    }

    /**
     * 在spring中使用delete语句进行删除并返回它的影响行数
     * @param hql
     * @return
     */
    public int deleteByHql(final String hql){

    Object number =  super.getHibernateTemplate().execute(
    new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {

    Query query = session.createQuery(hql);

    int num = query.executeUpdate();

    return num;
    }

    }
    );

    return Integer.parseInt(number.toString());
    }









    /**
     * 根据ID查询具体的详细信息
     */
    public Object get(Class clz,Serializable id) {

    Object item = null;
    try {

    item = super.getHibernateTemplate().get(clz, id);

    } catch (Exception e) {
    e.printStackTrace();
    }
    return item;
    } /**
     * 修改对象信息
     */
    public boolean update(Object obj) {
    try {

    super.getHibernateTemplate().update(obj);

    return true;

    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }

    } /**
     * 查询所有用户详细信息
     * 根据类的对象进行查询
     * 分页查询
     */
    public List search(final Class clz,final int pageNo ,final int pageSize) {

    return super.getHibernateTemplate().executeFind(
    new HibernateCallback(){ public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    //查询该类的所有信息
    Criteria c = session.createCriteria(clz);

    c.setFirstResult((pageNo-1)*pageSize);

    c.setMaxResults(pageSize);

    return c.list();
    }
    }
    );

    }


    /**
     * 根据类查询其所有信息
     */
    public List search(final Class clz) {

    return super.getHibernateTemplate().executeFind(
    new HibernateCallback(){ public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    //查询该类的所有信息
    Criteria c = session.createCriteria(clz);


    return c.list();
    }
    }
    );
    }

    /**
     * 根据hql语句进行查询
     * @param hql
     * @return
     */
    public List search(final String hql){
    return super.getHibernateTemplate().executeFind(
    new HibernateCallback(){ public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    //查询该类的所有信息
    Query q = session.createQuery(hql);

    return q.list();
    }
    }
    );
    } /**
     * 根据传递的hql执行查询
     * 分页查询,
     */ public List search(final String hql,final  int pageNo ,final int pageSize) {
    return super.getHibernateTemplate().executeFind(
    new HibernateCallback(){ public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    //查询该类的所有信息
    Query q = session.createQuery(hql);

    q.setFirstResult((pageNo-1)*pageSize);
    q.setMaxResults(pageSize);

    return q.list();
    }
    }
    );

    }
    /**
     * 获得表的总数据
     * @param tableName
     * @return
     */
    public int getRowCounts(String tableName){

    final String hql = "select count(table) from "+tableName+" as table"; List list = super.getHibernateTemplate().find(hql);
    int rows = Integer.parseInt(list.get(0).toString());
    return rows;

    }

    /**
     * 获得总页数
     * @param tableName
     * @param pageSize
     * @return
     */
    public int getPageCounts(String tableName,int pageSize){
    int count = this.getRowCounts(tableName);
    int pageCount = 0;
    if(count%pageSize==0){
    pageCount = count/pageSize;
    }
    else{
    pageCount = count/pageSize +1; 
    }
    return pageCount;
    }

    /**
     * 获得模糊查询的总数据量
     * @param hql
     * @return
     */
    public int getRowCountsByLike(String hql,Map map){

    List list = this.search(map, hql);

    return Integer.parseInt(list.get(0).toString()); 
    }

    /**
     * 使用map集合和hql语句进行分页查询
     * @param mapValue  集合 保存了类的属性名和对应该属性的值 当中的key等于hql中的属性
     * @param hql   执行的hql语句
     * @param pageNo 当前页数
     * @param pageSize 每页显示条数
     * @return 返回list集合
     */
    public List search(final Map mapValue,final String hql,final int pageNo,final int pageSize){
    return super.getHibernateTemplate().executeFind(
    new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {

    Query query = session.createQuery(hql);
    //取出map中的key  key等于hql语句中的属性名
    Set setkey = mapValue.keySet();

    Iterator it = setkey.iterator();

    while(it.hasNext()){
    //从集合中取出值
    String key = it.next().toString();
    //取出对应属性的值
    String value = mapValue.get(key).toString();
    query.setString(key, value);

    }
    query.setFirstResult((pageNo-1)*pageSize);
    query.setMaxResults(pageSize);

    return query.list();
    }


    }
    );

    }

    /**
     * 使用map集合和hql语句进行查询
     * @param mapValue  集合 保存了类的属性名和对应该属性的值 当中的key等于hql中的属性
     * @param hql   执行的hql语句
     * @return 返回list集合
     */
    public List search(Map mapValue,String hql){
    InHibernate hi = new InHibernate();
    hi.setHql(hql);
    hi.setMapValue(mapValue);
    return super.getHibernateTemplate().executeFind(
    new InHibernate()
    // new HibernateCallback(){
    //
    // public Object doInHibernate(Session session) throws HibernateException, SQLException {
    //
    // Query query = session.createQuery(hql);
    // //取出map中的key  key等于hql语句中的属性名
    // Set setkey = mapValue.keySet();
    //
    // Iterator it = setkey.iterator();
    //
    // while(it.hasNext()){
    // //从集合中取出值 这个值要对应到类的属性
    // String key = it.next().toString();
    // //取出对应属性的值
    // String value = mapValue.get(key).toString();
    // query.setString(key, value);
    //
    // }
    //
    // return query.list();
    // }
    //
    //
    // }
    );

    }
    }class InHibernate implements HibernateCallback{
        String hql;
        Map mapValue;
    public Object doInHibernate(Session session) throws HibernateException,
    SQLException {
    Query query = session.createQuery(hql);
    //取出map中的key  key等于hql语句中的属性名
    Set setkey = mapValue.keySet();

    Iterator it = setkey.iterator();

    while(it.hasNext()){
    //从集合中取出值 这个值要对应到类的属性
    String key = it.next().toString();
    //取出对应属性的值
    String value = mapValue.get(key).toString();
    query.setString(key, value);

    }

    return query.list();
    }
    public String getHql() {
    return hql;
    }
    public void setHql(String hql) {
    this.hql = hql;
    }
    public Map getMapValue() {
    return mapValue;
    }
    public void setMapValue(Map mapValue) {
    this.mapValue = mapValue;
    }

    }
      

  7.   

    package com.wonders.oa.common.dbbase.impl;import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.wonders.oa.common.dbbase.interfaces.IDBBase;
    /*
     *  作者:小侯
     *      功能:操作数据库的底层类
     *   方法:
     *   1) getList() → 用于得到list类型的结果
     *   2) getObject() → 用于得到一个对象类型的结果 得到的结果需要强制类型转换
     *   3) doUpdate() → 用于对数据库进行增、删、改getCount
     *          4) doUpdate() → 得到结果有多少行
     */
    public class DBBaseImpl extends HibernateDaoSupport implements IDBBase { /**
     * 根据hql语句查询集合
     */ public List getList(String hql) {
    try {
    return super.getHibernateTemplate().find(hql);
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return null;
    } /**
     * 分页查询 参数pageNo第几页,pageSize页面大小,hql查询语句 返回List集合
     */ public List getList(int pageNo, int pageSize, String hql) {
    Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    int index = pageSize * (pageNo - 1);
    query.setFirstResult(index);
    query.setMaxResults(pageSize);
    return query.list();
    } catch (Exception ex) {
    ex.printStackTrace();
    return null;
    } finally { session.close(); }
    } /**
     * 
     */
    public List getList(String hql, List list) { Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    if (list != null || list.size() > 0) {
    for (int i = 0; i < list.size(); i++) {
    query.setParameter(i, list.get(i));
    }
    }
    return query.list();
    } catch (Exception ex) {
    ex.printStackTrace();
    return null;
    } finally { session.close(); }
    } /**
     * 根据hql查询 传入代替语句中?值的数组
     */
    public List getList(String hql, Object[] obj) {
    Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    if (obj != null || obj.length > 0) {
    for (int i = 0; i < obj.length; i++) {
    query.setParameter(i, obj[i]);
    }
    }
    return query.list();
    } catch (Exception ex) {
    ex.printStackTrace();
    return null;
    } finally { session.close(); }
    } /**
     * 根据hql语句查询一条数据
     */
    public Object getObject(String hql) {
    try {
    return this.getList(hql).get(0);
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return null;
    } /**
     * 分页查询 参数pageNo第几页,pageSize页面大小,hql查询语句,list查询条件的参数集合 返回List集合
     */ public List getList(int pageNo, int pageSize, String hql, List list) {
    Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    if (list != null || list.size() > 0) {
    for (int i = 0; i < list.size(); i++) {
    query.setParameter(i, list.get(i));
    }
    }
    int index = pageSize * (pageNo - 1);
    query.setFirstResult(index);
    query.setMaxResults(pageSize);
    return query.list();
    } catch (Exception ex) {
    ex.printStackTrace();
    return null;
    } finally { session.close(); }
    } /**
     * 根据hql语句统计结果集中共有几条 返回int类型的条数
     */ public int getCount(String hql) {
    int count = 0;
    Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    count = Integer.parseInt(query.uniqueResult().toString());
    } catch (Exception ex) {
    ex.printStackTrace();
    } finally { session.close(); }
    return count; }

    public int getCount(String hql,List list) {
    int count = 0;
    Session session = super.getSession();
    try {
    Query query = session.createQuery(hql);
    if (list != null || list.size() > 0) {
    for (int i = 0; i < list.size(); i++) {
    query.setParameter(i, list.get(i));
    }
    }
    count = Integer.parseInt(query.uniqueResult().toString());
    } catch (Exception ex) {
    ex.printStackTrace();
    } finally { session.close(); }
    return count; } /**
     * 根据传如的hql语句进行删、改 传入hql语句和Object类型的数组数组用来存放hql中问号的值 返回boolean类型的值
     */
    public boolean doUpdate(String hql, Object[] obj) {
    boolean flag = false; Session session = super.getSession();
    Transaction trans = session.beginTransaction();
    try {
    Query query = session.createQuery(hql);
    if (obj != null || obj.length > 0) {
    for (int i = 0; i < obj.length; i++) {
    query.setParameter(i, obj[i]);
    }
    }
    int i = query.executeUpdate();
    if (i > 0) {
    trans.commit();
    flag = true;
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    trans.rollback();
    } finally { session.close(); }
    return flag;
    } /**
     * 根据entity添加 返回boolean
     */
    public boolean doAdd(Object entity) {
    boolean flag = false;
    try {
    super.getHibernateTemplate().saveOrUpdate(entity);
    flag = true;
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return flag;
    } /**
     * 根据entity修改 返回boolean
     */
    public boolean doUpdate(Object entity) {
    boolean flag = false; Session session = super.getSession();
    Transaction trans = session.beginTransaction();
    try {
    super.getHibernateTemplate().update(entity);
    flag = true;
    } catch (Exception ex) {
    ex.printStackTrace();
    trans.rollback(); } finally { session.close(); }
    return flag;
    } /**
     * 调用分页存储过程
     */
    public List getPageList(int pageSize, int page, String sql,
    String KeyFieid, String procName) {
    Session session = super.getSession(); // 获取数据库存储过程
    Query query = session.getNamedQuery(procName); // 给存储过程传参
    query.setInteger(0, pageSize);
    query.setInteger(1, page);
    query.setString(2, sql);
    query.setString(3, KeyFieid); List list = query.list();
    session.close();
    return list;
    } /**
     * 调用存储过程返回自动增长Id列
     */
    public String getIdentityStr(String tables, String columns, String bianhao) {
    Session session = super.getSession();
    String KeyId = "";
    Connection con = session.connection();
    try {
    // 得到Connection 对象 // 获得存储过程
    CallableStatement call = con
    .prepareCall("{call Get_Identity_Str(?,?,?,?)}"); // 设置存储过程的参数
    call.setString(1, tables);
    call.setString(2, columns);
    call.setString(3, bianhao); // 注册存储过程的输出参数
    call.setString(4, "id"); // 设置存储过程的输出参数
    call.registerOutParameter(4, java.sql.Types.VARCHAR);
    call.executeUpdate(); KeyId = call.getString(4); } catch (SQLException e) { e.printStackTrace();
    } finally { session.close(); }
    return KeyId;
    } public static void main(String[] args) {
    ApplicationContext cont = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
    IDBBase db = (DBBaseImpl) cont.getBean("dbbase");
    List list = db
    .getList("select bm.bmmc,ry.rymc from OaRy ry,OaBm bm where  bm.bmid=ry.bmid");
    Iterator it = list.iterator();
    while (it.hasNext()) {
    Object[] oa = (Object[]) it.next(); for (int i = 0; i < oa.length; i++) {
    System.out.println(oa[i].toString()); } } }}
      

  8.   

    传送门(hibernateDAO封装)
      

  9.   

    通用的DAO 一般就是crud功能了
    public abstract class HibernateBaseDao extends HibernateDaoSupport {
    @SuppressWarnings("unchecked")
    public abstract Class getEntityClass();
    public abstract String getEntityType();

    //添加
    public void save(Serializable entity){
    this.getHibernateTemplate().save(entity);
    }
    //修改某条信息
    public void update(Serializable entity) {
    this.getHibernateTemplate().update(entity);
    }
    //获取所有的信息
    @SuppressWarnings("unchecked")
    public List getAll(int count,int start) {
    String hql="from "+getEntityType()+" m ";
    Query q = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(hql);
    q.setMaxResults(count);
    q.setFirstResult(start);
    return q.list();
    }
            .....
    }
      

  10.   

    [align=center]Action
    |
    Service
    |
    DAO
    |
    POJO[/align]
      

  11.   

    页面中调用的方法,忘记说了
    第一种DAO中调用方法,不关是那个dao,都需要继承底层的DAO。
          /**
     * 根据发文id查询相应实例的详细信息
     * @param fwid
     * @return
     */
    public Object getFwSlByFwIdInDao(Serializable fwid) {
    //查询实例类型为1的某收文实例
    String hql = "from OaFlowSl where stid=:stid and sllx=2";

    Map map = new  HashMap();

    map.put("stid", fwid);

    return super.search(map, hql).get(0);
    }
          /**
     * 根据条件模糊查询
     * @param lmid
     * @param ggbt
     * @param bmid
     * @param ggrq
     * @param ggrq1
     * @return
     */
    public List searchWhereByBlus(int lmid, String ggbt, int bmid, String ggrq,
    String ggrq1) {
    String hql = "from OaGg where lmid=:lmid and ggbt like :ggbt and bmid=:bmid or ggrq>=:ggrq and ggrq<=:ggrq1";
    Map map = new HashMap();
    map.put("lmid", lmid);
    map.put("ggbt", "" + ggbt + "%");
    map.put("bmid", bmid);
    map.put("ggrq", ggrq);
    map.put("ggrq1", ggrq1);
    return super.search(map, hql);
    }第二种dao 调用方法public List getList(int pageNo, int pageSize, String ryid,
    String starttime, String endtime, String rzjg) {
    String hql = "select rz,ry.rymc,bm.bmmc from OaXtrz rz,OaRy ry,OaBm bm where rz.ryid=ry.ryid and ry.bmid=bm.bmid";
    List list = new ArrayList();
    if (ryid != null) {
    if (!"all".equals(ryid)) {
    hql = hql + " and rz.ryid=?";
    list.add(ryid);
    }
    }
    if (rzjg != null) {
    if (!"all".equals(rzjg)) {
    hql = hql + " and rz.rzjg=?";
    list.add(rzjg);
    }
    }
    if (starttime != null && !"".equals(starttime)) {
    if (endtime != null && !"".equals(endtime)) {
    hql = hql + " and rz.rzsj between '" + starttime + "' and '"
    + endtime + "'";
    } else {
    hql = hql + " and rz.rzsj between '" + starttime + "' and '"
    + new java.sql.Timestamp(System.currentTimeMillis())
    + "'";
    }
    }
    if (endtime != null && !"".equals(endtime)) {
    if (starttime != null && !"".equals(starttime)) {
    hql = hql + " and rz.rzsj between '" + starttime + "' and '"
    + endtime + "'";
    } else {
    hql = hql + " and rz.rzsj<'" + endtime + "'";
    }
    }
    return dbbase.getList(pageNo, pageSize, hql + " order by rz.rzsj desc",
    list);
    }