个人用hibernate写的通用Dao

时间:2021-10-09 12:54:34
import java.io.Serializable;
import java.util.List;

import com.ssh.common.Order;

//使用泛型,重用性更高
public interface IBaseDao<T>{

//保存对象
Serializable save(T t);

void saveOrUpdate(T t);

//删,根据对象
void delete(T t);
//删,根据多个
void deleteAll(List<T> t);
//删,通过id删除
void deleteById(Integer id);
//删,通过屬性删除
void deleteByPropertie(String name, String value);

//改
void update(T t);
//改
void update(List<T> list);

//查询全部
List<T> queryAll();
//查,通过名字获取对象
List<T> querybyProperties(String name, String value);

List<T> querybyProperties(String name, List<String> values);

List<T> querybyProperties(List<String> names, List<Object> values);

List<T> querybyProperties(List<String> names, List<Object> values, String orderBy, Order order);

//查,通过id获取对象
T queryById(Integer id);

//查,通过名字获取对象
T queryUnique(String name, String value);

}
<pre name="code" class="java">import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.Collection;import java.util.List;import org.hibernate.Criteria;import org.hibernate.SessionFactory;import org.hibernate.criterion.Order;import org.hibernate.criterion.Restrictions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T>{//注入获取sessionFactory@Autowiredprivate void setMySessionFactory(SessionFactory sessionFactory){  //这个方法名可以随便写,@Resource可以通过name 或者type来装载的。  super.setSessionFactory(sessionFactory); }private Class<T> clazz;    @SuppressWarnings("unchecked")public BaseDaoImpl(){        //使用反射技术得到T的真实类型        //获取当前new的对象的泛型的父类        ParameterizedType pt =(ParameterizedType) this.getClass().getGenericSuperclass();        //获取第一个类型参数的真实类型        this.clazz = (Class<T>) pt.getActualTypeArguments()[0];     }public Serializable save(T t) {return getHibernateTemplate().save(t);}public void delete(T t) { getHibernateTemplate().delete(t);}public void deleteById(Integer id) {T t=queryById(id);getHibernateTemplate().delete(t);}public void update(T t) {getHibernateTemplate().update(t);}@SuppressWarnings("unchecked")public List<T> queryAll() {//泛型from 类名(clazz.getSimpleName())return (List<T>) getHibernateTemplate().find("from "+clazz.getSimpleName());}public T queryById(Integer id) {return getHibernateTemplate().get(clazz, id);}public T queryUnique(String name, String value){Criteria criteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(clazz).add(Restrictions.eq(name, value));return (T) criteria.uniqueResult();}public void deleteAll(List<T> t) {getHibernateTemplate().deleteAll(t);}public void deleteByPropertie(String name, String value) {T t=queryUnique(name, value);getHibernateTemplate().delete(t);}public void update(List<T> list) {for (T t : list) {getHibernateTemplate().update(t);}}//sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭,可避免手动的管理实务,//同时一个线程最多开启和关闭一次session又可以提高程序的性能//根据属性查询public List<T> querybyProperties(String name, List<String> values) {Criteria criteria=getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(clazz).add(Restrictions.in(name, values));//尽管这种方式拿到的Session会自动关闭,但是他是有一定的失效策略的,而且在超session池连接数的时候,spring无法自动的关闭这些session//Criteria criteria = getSession().createCriteria(clazz).add(Restrictions.in(name, values));return criteria.list();}//根据属性查询,不需要进行排序将排序字段和排序方式赋空 public List<T> querybyProperties(List<String> names, List<Object> values) {return querybyProperties(names, values, null, null);}/* names是字段名 * values是相应的条件 * orderBy排序的字段 * order 排序方式 */ public List<T> querybyProperties(List<String> names, List<Object> values,String orderBy, com.ssh.common.Order order) {//先创建一个criteria对象Criteria criteria=getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(clazz);//对values进行遍历if (values != null) {for (int i = 0; i < values.size(); i++) {//拿到当前的valueObject value = values.get(i);if (value instanceof Collection) {//当前字段(name)对应当前的value,进行查询,此时value为一个集合criteria.add(Restrictions.in(names.get(i), (Collection<?>) value));}else if (value instanceof Object[]) {//当前value为一个数组criteria.add(Restrictions.in(names.get(i), (Object[]) value));}else {//当前value就是单一个valuecriteria.add(Restrictions.eq(names.get(i), value));}}}//使用自定义枚举,这里对order字段进行判断,若空则不进行排序,否则判断是升序还是降序if(order!=null&&order==com.ssh.common.Order.desc){ criteria.addOrder(Order.desc(orderBy)); }if(order!=null&&order==com.ssh.common.Order.asc){ criteria.addOrder(Order.asc(orderBy)); }return criteria.list();}//会自定选定save或者update操作public void saveOrUpdate(T t) {getHibernateTemplate().saveOrUpdate(t);}//通过属性查询,返回一个listpublic List<T> querybyProperties(String name, String value) {Criteria criteria=getSessionFactory().getCurrentSession().createCriteria(clazz).add(Restrictions.eq(name, value));return criteria.list();}}

下面是在别人博文上看到的通用DAO,也顺便记下来,供下次需要时使用:

package spring.demo.dao;

import java.io.Serializable;
import java.util.List;

public interface IGeneralDao {

public <T> T findById(Class<T> type, Serializable id);

public <T> List<T> findAll(Class<T> type);

public void save(Object... entities);

public void update(Object... entities);

public void saveOrUpdate(Object entity);

public void delete(Object... entities);

public void deleteById(Class<?> type, Serializable id);

public void refresh(Object... entities);

public void flush();
}

package spring.demo.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;

import spring.demo.dao.IGeneralDao;

public abstract class GeneraDao implements IGeneralDao{

@Autowired
private HibernateTemplate hibernateTemplate;

public <T> T findById(Class<T> type, Serializable id) {

return hibernateTemplate.get(type, id);
}

public <T> List<T> findAll(Class<T> type) {

return hibernateTemplate.loadAll(type);
}

public void save(Object... entities) {
for (Object entity: entities) {
hibernateTemplate.save(entity);
}

}

public void update(Object... entities) {
for (Object entity : entities) {
hibernateTemplate.update(entity);
}
}

public void saveOrUpdate(Object entity) {
hibernateTemplate.saveOrUpdate(entity);
}

public void delete(Object... entities) {
for (Object entity : entities) {
if(entity!=null){
hibernateTemplate.delete(entity);
}
}
}

public void deleteById(Class<?> type, Serializable id) {
if(id==null)
return;
Object entity=findById(type, id);
if(entity==null)
return;
delete(entity);
}

public void refresh(Object... entities) {
for (Object entity : entities) {
hibernateTemplate.refresh(entity);
}
}

public void flush() {
hibernateTemplate.flush();
}

}


 

后续还会进一步优化和改进,如有建议和错误,欢迎广大网友指出