首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

spring+hibernate小弟封装了一个DAO,感觉不好用,有没有好点的封装解决方法

2012-03-01 
spring+hibernate小弟封装了一个DAO,感觉不好用,有没有好点的封装这个是我写的DAOJava codepackage com.lu

spring+hibernate小弟封装了一个DAO,感觉不好用,有没有好点的封装
这个是我写的DAO

Java code
package 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 
Java code
package com.lulu.ssh.dao;import org.hibernate.Criteria;public interface AddRestrictions {    public void addRestrictions(Criteria c);}

这个是business调用dao
Java code
package 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()));            }        });    }}

可以觉得这样的封装感觉总怪怪的 添加条件那块显得有点死板, 想寻一个好的方案,希望不吝教教小弟。

[解决办法]
http://blog.csdn.net/hzw2312/article/details/6396590
[解决办法]
[code=Java][/code]
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;
}
}




}

[解决办法]
我的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里面写个接口

热点排行