这个是我写的DAOpackage com.lulu.ssh.dao;import java.sql.SQLException;
import java.util.List;import javax.annotation.Resource;import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;@Component("dao")
public class DAO<T> {
private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
} @Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
} public T get(Class clazz, int id) {
return (T) hibernateTemplate.get(clazz, id);
} public void save(T t) {
hibernateTemplate.save(t);
} public void delete(T t) {
hibernateTemplate.delete(t);
} public void update(T t) {
hibernateTemplate.update(t);
} public List<T> search(final Class<T> clazz, final int start, final int limit, final AddRestrictions addRestrictions) throws Exception {
return hibernateTemplate.executeFind(new HibernateCallback() { @Override
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Criteria c = s.createCriteria(clazz);
if(limit != 0){
c.setFirstResult(start);
c.setMaxResults(limit);
}
addRestrictions.addRestrictions(c);
return c.list();
} });
}}这个上面search方法里传的接口AddRestrictions package com.lulu.ssh.dao;import org.hibernate.Criteria;public interface AddRestrictions {
public void addRestrictions(Criteria c);
}这个是business调用daopackage com.lulu.ssh.business;import java.util.List;import javax.annotation.Resource;import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Component;import com.lulu.ssh.dao.AddRestrictions;
import com.lulu.ssh.dao.DAO;
import com.lulu.ssh.model.User;@Component("userBusiness")
public class UserBusiness {
private DAO<User> dao; public DAO<User> getDao() {
return dao;
} @Resource
public void setDao(DAO<User> dao) {
this.dao = dao;
} public User getUser(int id) {
return dao.get(User.class, id);
}        //这里可以分页,limit传0就不分页
public List<User> getUsers(final User condition, final int start, final int limit) throws Exception {
return dao.search(User.class, start, limit, new AddRestrictions() { @Override
public void addRestrictions(Criteria c) {
//要什么条件这里按需求添加
                                c.add(Restrictions.like("descn", condition.getDescn(), MatchMode.ANYWHERE));
c.add(Restrictions.eq("name", condition.getName())); }
});
}
}可以觉得这样的封装感觉总怪怪的 添加条件那块显得有点死板, 想寻一个好的方案,希望不吝教教小弟。

解决方案 »

  1.   

    基于HIBERNATE框架的DAO应该是很简单的啊,你这里面似乎写复杂了。
      

  2.   

    我是想写一个通用的DAO,不用每张表都写一个DAO
      

  3.   

    hibernate就这样,已经可以了。你要把where 动态传入,就再做个list放参数类型和参数值 语句用?传值。
      

  4.   

    http://blog.csdn.net/hzw2312/article/details/6396590
      

  5.   


    package com.lxh.base;import java.util.List;import org.hibernate.LockMode;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.lxh.entity.Stu;
    import com.lxh.inf.IStu;public class BaseDAO extends HibernateDaoSupport {
    //添加
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#save(com.lxh.inf.Imbmber)
     */
    public void save(Imbmber istu) {
    try {
    getHibernateTemplate().save(istu);
    } catch (RuntimeException re) {
    throw re;
    }
    }
       
    //删除
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#delete(com.lxh.inf.Imbmber)
     */
    public void delete(Imbmber istu) {
    try {
    getHibernateTemplate().delete(istu);
    } catch (RuntimeException re) {
    throw re;
    }
    } //根据Id查询
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#findById(java.lang.String, java.lang.Long)
     */
    public Object findById(String cla,Long id) {
    try {
    return getHibernateTemplate().get(cla, id);
    } catch (RuntimeException re) {
    throw re;
    }
    }
        
    //根据对象查询
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#findByExample(com.lxh.inf.Imbmber)
     */
    public List findByExample(Imbmber istu) {
    try {
    List results = getHibernateTemplate().findByExample(istu);
    return results;
    } catch (RuntimeException re) {
    throw re;
    }
    }
        
    //多属性查询
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#findByProperty(java.lang.String[], java.lang.Object[], java.lang.String)
     */
    public List findByProperty(String[] propertyNames, Object values[],String tableObjecty) {
    try {
    String queryString = "from "+tableObjecty+" as model where 1=1";
        for(int i=0;i<values.length;i++)
        {
         queryString+=" and model."+propertyNames[i]+"=?";
         return getHibernateTemplate().find(queryString, values[i]);
        }

    } catch (RuntimeException re) {
    throw re;
    }
    return null;
    }
        

        //查询所有
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#findAll(java.lang.String)
     */
    public List findAll(String tableObject) {
    try {
    String queryString = "from "+tableObject+"";
    return getHibernateTemplate().find(queryString);
    } catch (RuntimeException re) {
    throw re;
    }
    }
       //根据Id修改
    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#merge(com.lxh.inf.Imbmber)
     */
    public Object merge(Imbmber istu) {
    try {
    return getHibernateTemplate().merge(istu);
    } catch (RuntimeException re) {
    throw re;
    }
    }
       //添加与修改

    /* (non-Javadoc)
     * @see com.lxh.base.IbaseDao#attachDirty(com.lxh.inf.Imbmber)
     */
    public void attachDirty(Imbmber istu) {
    try {
    getHibernateTemplate().saveOrUpdate(istu);
    } catch (RuntimeException re) {
    throw re;
    }
    }


    }
      

  6.   

    Imbmber是一个接口类,该接口继续Serializablepackage com.lxh.inf;import java.io.Serializable;public interface Imbmber extends Serializable {}
      

  7.   

    xinghui_liu的方法不错,不过多属性查询都写死了 每个属性都是=某个值,不能动态指定,能不能设计一个把条件由业务层来指定,比如有的属性>XX 有的between XX and XX 有的 like %XX% 。就像ibatis里设计的一样 能够调用example.andNameIn(一个list).andDescriptionLike("").andAgeBetween(20, 30)来指定条件。然后调用selectByExample(example)。
    4楼的也看了下,方法挺全的,查询条件都写得比较死。这样就不能做为一个通用的接口提供给service层来调用了。
      

  8.   

    我的dao
    通用dao
    package com.cateing.basedao;
    import java.io.Serializable;
    import java.util.List;import com.cateing.entity.Page;public interface GenericDao {
    boolean addObject(Object object);
    boolean updateObject(Object object);
    boolean delObject(Object object);
    List findAllObject();
    Object findObjectById(Serializable id);
    Page findByPage(Object entity,int currentPage);
    }
    通用dao的实现
    package com.cateing.basedao;import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import com.cateing.common.HibernateUtil;
    import com.cateing.entity.Page;public class GenericDaoImpl implements GenericDao { protected Class pereistClass;

    public Class getPereistClass() {
    return pereistClass;
    } public void setPereistClass(Class pereistClass) {
    this.pereistClass = pereistClass;
    } public boolean addObject(Object object) {
    Session session = HibernateUtil.getSession();
    try {
    session.save(object);
    } catch (HibernateException e) {
    e.printStackTrace();
    return false;
    }
    return true;

    } public boolean delObject(Object object) {
    Session session = HibernateUtil.getSession();
    try {
    session.delete(object);
    } catch (HibernateException e) {
    e.printStackTrace();
    return false;
    }
    return true;
    }
    public boolean updateObject(Object object) {
    Session session = HibernateUtil.getSession();
    try {
    session.update(object);
    } catch (HibernateException e) {
    e.printStackTrace();
    return false;
    }
    return true;

    }

    public List findAllObject() {
    Session session = HibernateUtil.getSession();
    List list = null;
    try {
    session.beginTransaction();
     list = session.createQuery("from "+this.getPereistClass().getName()).list();
    } catch (HibernateException e) {
    e.printStackTrace();
    }
    return list;
    }
    public Object findObjectById(Serializable id) {
    Session session = HibernateUtil.getSession();
    Object object = null;
    try {
    object = session.get(this.getPereistClass().getName(), id);
    } catch (HibernateException e) {
    e.printStackTrace();
    }
    return object;
    }
    public Page findByPage(Object entity, int currentPage) {

    Page page = new Page();
    Session session = HibernateUtil.getSession();
    try {
    StringBuffer sb = createSQL(entity);
    String totalNumSql = "select count(*) " + sb.toString();
    Long totalNumber = (Long) session.createQuery(totalNumSql).uniqueResult();
    int pageSize = 8;
    Long totalPage = (totalNumber%pageSize==0?totalNumber/pageSize:(totalNumber/pageSize+1));
    int from = (currentPage-1)*pageSize;
    //int to = currentPage*pageSize;
    String listSql = sb.toString();

    List list = new ArrayList();

    list = session.createQuery(listSql).setFirstResult(from).setMaxResults(pageSize).list();

    page.setCurrentPage(currentPage);
    page.setTotalNumber(totalNumber.intValue());
    page.setTotalPgae(totalPage.intValue());
    page.setList(list);
    } catch (HibernateException e) {
    e.printStackTrace();
    }

    return page;
    } protected StringBuffer createSQL(Object entity) {
    return null;
    }}
    部门dao只要继承genericDao
    package com.cateing.dao;import com.cateing.basedao.GenericDao;
    import com.cateing.entity.Dept;public interface DeptDao extends GenericDao {

    }部门Dao实现类,继承genericDaoImpl实现DeptDao
    package com.cateing.dao.impl;import com.cateing.basedao.GenericDaoImpl;
    import com.cateing.dao.DeptDao;
    import com.cateing.entity.Dept;public class DeptDaoImpl extends GenericDaoImpl implements DeptDao {

    public DeptDaoImpl(){
    pereistClass = Dept.class;
    }

    public StringBuffer createSQL(Object entity)
    {
    Dept dept = (Dept)entity;
    StringBuffer sb = new StringBuffer(" from Dept where 1=1 ");
    if(dept.getdName()!= null && dept.getdName().length()>0)
    {
    sb.append(" and like '%").append(dept.getdName()).append("%'");
    }
    return sb;
    }
    }其他类似,如果有另外功能在自己的dao里面写个接口