BaseDao可以这样设计
package org.ks4j.orm.hibernate;import java.util.List;import java.util.Map;import javax.annotation.Resource;import javax.persistence.MappedSuperclass;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.criterion.Criterion;import org.hibernate.criterion.Restrictions;import org.ks4j.orm.Compositor;import org.ks4j.orm.Filtration;import org.ks4j.orm.PageData;import org.ks4j.utils.HibernateUtils;import org.ks4j.utils.ReflectionUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.util.Assert;/** * dao基类. * 1:该类封装了最常见数据库操作的方法,你可以继承该类,添加自己喜欢的方法 * 2:当你有多个sessionFactory时,你也可以在你的子类中重写setSessionFactory()方法 * * * @param <T> 实体类类型 */@SuppressWarnings("unchecked")@MappedSuperclasspublic class BaseDao<T>{protected Logger logger = LoggerFactory.getLogger(getClass());protected SessionFactory sessionFactory;protected Class<T> entityClass;//操作SQL语句的模板private JdbcTemplate jdbcTemplate; //注入Spring JdbcTemplate 对象@Resource(name="jdbcTemplate")public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}/** * 构造方法 */public BaseDao(){this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass());}/** * 采用@Resource(name="xxx")按名称注入SessionFactory, 当有多个SesionFactory的时候Override本函数. */@Resourcepublic void setSessionFactory(SessionFactory sessionFactory){this.sessionFactory = sessionFactory;}/** * 取得Session. */public Session getSession(){return sessionFactory.getCurrentSession();}//--------------------------------------------------------------/** * 新增对象. */public void save(T entity){Assert.notNull(entity, "entity不能为空");getSession().save(entity);logger.debug("save entity: {}", entity);}/** * 修改对象. */public void update(T entity){Assert.notNull(entity, "entity不能为空");getSession().update(entity);logger.debug("update entity: {}", entity);}/** * 删除对象. */public void delete(T entity){Assert.notNull(entity, "entity不能为空");getSession().delete(entity);logger.debug("delete entity: {}", entity);}/** * 删除对象. */public void delete(String id){delete(findById(id));logger.debug("delete entity {},id is {}", entityClass.getSimpleName(), id);}/** * 按id获取对象. */public T findById(String id){Assert.notNull(id, "id不能为空");return (T) getSession().get(entityClass, id);}/** * 按属性查找唯一对象,匹配方式为相等. */public T find(String fieldName, Object fieldValue){Assert.hasText(fieldName, "fieldName不能为空");Criterion criterion = Restrictions.eq(fieldName, fieldValue);return (T) HibernateUtils.createCriteria(getSession(), entityClass, criterion).uniqueResult();}/** * 按属性查找对象列表,匹配方式为相等. */public List<T> findList(String fieldName, Object fieldValue){Assert.hasText(fieldName, "fieldName不能为空");Criterion criterion = Restrictions.eq(fieldName, fieldValue);return HibernateUtils.createCriteria(getSession(), entityClass, criterion).list();}/** * 按照过滤条件对象查找对象列表. */public List<T> findList(Filtration... filtrations){Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);//设置过滤条件criteria = HibernateUtils.setFiltrationParameter(criteria, filtrations);return criteria.list();}/** * 按照过滤条件对象查找对象列表. */public List<T> findList(List<Filtration> filtrationList){Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);//设置过滤条件criteria = HibernateUtils.setFiltrationParameter(criteria, filtrationList);return criteria.list();}/** * 按照过滤条件对象查找对象列表,支持排序. */public List<T> findList(Compositor compositor, Filtration... filtrations){Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);//设置过滤条件criteria = HibernateUtils.setFiltrationParameter(criteria, filtrations);//设置排序criteria = HibernateUtils.setCompositorParameter(criteria, compositor);return criteria.list();}/** * 按照过滤条件对象查找对象列表,支持排序. */public List<T> findList(Compositor compositor, List<Filtration> filtrationList){Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);//设置过滤条件criteria = HibernateUtils.setFiltrationParameter(criteria, filtrationList);//设置排序criteria = HibernateUtils.setCompositorParameter(criteria, compositor);return criteria.list();}/** * 获取全部对象. */public List<T> findAll(){List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from sys_role");for(Map item:list){System.out.println(item.toString());}return findList();}/** * 获取全部对象,支持排序. */public List<T> findAll(Compositor compositor){return findList(compositor);}/** * 分页查询. */public PageData<T> find(PageData<T> pageData){Assert.notNull(pageData, "pageData不能为空");Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);HibernateUtils.setParameter(criteria, pageData);pageData.setResult(criteria.list());//jdbcTemplate.qureturn pageData;}/** * 根据分页查询. */ // c.name=:name and c.password=:password .setEntity("name")public PageData<T> find(String hql, Map<String, ?> values, PageData<T> pageData) {Assert.notNull(pageData, "pageData不能为空");Query query = HibernateUtils.createQuery(getSession(), hql, values).setFirstResult(pageData.getPagination().getCurrentlyPageFirstResoultIndex()).setMaxResults(pageData.getPagination().getPageSize());pageData.setResult(query.list());return pageData;}/** * 按id列表获取对象. */public List<T> findListByIds(List<String> idList){if (idList != null && idList.size() >= 1){Criterion criterion = Restrictions.in("id", idList);return HibernateUtils.createCriteria(getSession(), entityClass, criterion).list();} else{return null;}}//--------------------------------------------------------------/** * 按HQL查询唯一对象. * @param hql "from Users where name=? and password=?" * @param values 数量可变的参数,按顺序绑定. * @return */public <X> X find(String hql, Object... values){return (X) HibernateUtils.createQuery(getSession(), hql, values).uniqueResult();}/** * 按HQL查询唯一对象. * @param hql "from Users where name=:name and password=:password" * @param values 命名参数,按名称绑定. * @return */public <X> X find(String hql, Map<String, ?> values){return (X) HibernateUtils.createQuery(getSession(), hql, values).uniqueResult();}/** * 按HQL查询对象列表. * @param hql "from Users where name=? and password=?" * @param values 数量可变的参数,按顺序绑定. * @return */public <X> List<X> findList(String hql, Object... values){return HibernateUtils.createQuery(getSession(), hql, values).list();}/** * 按HQL查询对象列表. * @param hql "from Users where name=:name and password=:password" * @param values 命名参数,按名称绑定. * @return */public <X> List<X> findList(String hql, Map<String, ?> values){return HibernateUtils.createQuery(getSession(), hql, values).list();}/** * 执行HQL进行批量修改/删除操作. * @return 更新记录数. */public int batchExecute(String hql, Object... values){return HibernateUtils.createQuery(getSession(), hql, values).executeUpdate();}/** * 执行HQL进行批量修改/删除操作. * @return 更新记录数. */public int batchExecute(String hql, Map<String, ?> values){return HibernateUtils.createQuery(getSession(), hql, values).executeUpdate();}//--------------------------------------------------------------/** * 本地SQL查询. * @return 查询List. */public List find(String sql){Assert.hasText(sql, "sql不能为空");return getSession().createSQLQuery(sql).list();}}