这个是我写的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())); }
});
}
}可以觉得这样的封装感觉总怪怪的 添加条件那块显得有点死板, 想寻一个好的方案,希望不吝教教小弟。
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())); }
});
}
}可以觉得这样的封装感觉总怪怪的 添加条件那块显得有点死板, 想寻一个好的方案,希望不吝教教小弟。
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;
}
}
}
4楼的也看了下,方法挺全的,查询条件都写得比较死。这样就不能做为一个通用的接口提供给service层来调用了。
通用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里面写个接口