SSH框架BaseDao、BaseService

代码未完善,后期再补

1. 通过数据库访问层BaseDao

1. 接口BaseDao

package com.dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.SimpleExpression;
import com.domain.Page;

public interface BaseDao<T> {
	void save(T t);
	void update(T t);	
	void delete(T t);
	T findById(Serializable id);
	List<T> findAll();
	List<T> findByCriteria(DetachedCriteria detachedCriteria);
	int findCount(DetachedCriteria detachedCriteria); 
	int findCount(SimpleExpression... conditions);	
	List<T> findByPage(Page page,DetachedCriteria detachedCriteria);
	List<T> findByPage(Page page,SimpleExpression... conditions);	
	int findCount(Object... paramValues);
	List<T> findByPage(Page page,String hql,Object... paramValues);

}

1.2 实现类BaseDaoImpl

package com.dao.impl;

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

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.SimpleExpression;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import com.dao.BaseDao;
import com.domain.Page;

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
	private Class clazz;   //实体类的Class
	
	public BaseDaoImpl() {				
		//对子类进行反射,子类实例化时this指向子类对象
		Class clazz = this.getClass();
		
		//获取带泛型的参数化类型的父类
		Type type = clazz.getGenericSuperclass();
		
		//强转成ParameterizedType
		ParameterizedType pType = (ParameterizedType) type;
		
		//根据参数化类型获取泛型实参
		Type[] types = pType.getActualTypeArguments();
		//因为只有一个泛型参数,这里只需取第一个
		this.clazz = (Class) types[0];
	}
	
	@Override
	public void save(T t) {
		getHibernateTemplate().save(t);		
	}
	
	@Override
	public void update(T t) {
		getHibernateTemplate().update(t);		
	}

	@Override
	public void delete(T t) {
		getHibernateTemplate().delete(t);	
	}

	@Override
	public T findById(Serializable id) {
		return (T) getHibernateTemplate().get(clazz, id);
	}

	@Override
	public List<T> findAll() {		
		return (List<T>) getHibernateTemplate().find("from "+clazz.getSimpleName());
	}

	//创建DetachedCriteria对象,并为其添加查询条件
	//NULL或空字符串不会作为条件
	public DetachedCriteria getConditionCriteria(SimpleExpression... conditions){
		DetachedCriteria dc=DetachedCriteria.forClass(clazz);
		for (SimpleExpression se : conditions) {			
			if(se.getValue()==null)continue;	 //值为空的不作为条件	
			
			String className=se.getValue().getClass().getSimpleName(); //获取值的类型
			
			//判断是否字符串类型
			if(className.equals("String")||className.equals("Character")){
				//如果是字符串类型,还要判断非空字符串,模糊查询时值可能会包含%
				//[%   %]丶[%  ]丶[  %]丶[  ]都算空字符串,
				if(!se.getValue().toString().matches("%?\\s*%?")){
					//如果条件值包含了字符和空格,是无法去除空格的,因为SimpleExpression的条件值没有提供setter方法(除非暴力反射设置值)
					//所有在创建SimpleExpression对象时条件值就要去除前后空格
					dc.add(se);										
				}
			}else{
				dc.add(se);
			}			
		}
		return dc;
	}
	
	@Override
	public List<T> findByCriteria(DetachedCriteria detachedCriteria) {		
		return (List<T>) getHibernateTemplate().findByCriteria(detachedCriteria);
	}
	
	@Override
	public int findCount(DetachedCriteria detachedCriteria) {
		detachedCriteria.setProjection(Projections.rowCount());
		List<Long> list= (List<Long>) getHibernateTemplate().findByCriteria(detachedCriteria);
		//清空查询字段count(*),避免影响其他方法的查询
		detachedCriteria.setProjection(null);
		return list.size()>0?list.get(0).intValue():0;
	}
	
	@Override
	public int findCount(SimpleExpression... conditions) {		
		return findCount(getConditionCriteria(conditions));
	}

	@Override
	public List<T> findByPage(Page page,DetachedCriteria detachedCriteria) {
		return (List<T>) getHibernateTemplate().findByCriteria(detachedCriteria, page.getBeginIndex(), page.getPageSize());		
	}

	@Override
	//条件分页查询(NULL或空字符串不会作为条件)
	public List<T> findByPage(Page page, SimpleExpression... conditions) 			{		
		return findByPage(page, getConditionCriteria(conditions));
	}
		
	@Override
	//使用hql分页
	public List<T> findByPage(final Page page,final String hql,final Object... paramValues) {		
		
		return getHibernateTemplate().execute(new HibernateCallback<List<T>>() {

			@Override
			public List<T> doInHibernate(Session session) throws HibernateException {
				Query query =session.createQuery(hql);
				//设置分页
				query.setFirstResult(page.getBeginIndex());
				query.setMaxResults(page.getPageSize());
				
				//设置参数值
				for(int i=0;i<paramValues.length;i++){
					query.setParameter(i, paramValues[i]);
				}			
				return query.list();
			}
		});
	}

	@Override
	public int findCount(Object... paramValues) {		
		List<Long> list=(List<Long>)getHibernateTemplate().find("from "+clazz.getSimpleName(), paramValues);
		return list.size()>0?list.get(0).intValue():0;
	}
}

1.3 条件分页简单例子

  • Service层代码
public List<Book> findByPage(Page page, SimpleExpression... conditions) {
	//查询符合条件的总记录数
	int count=bookDao.findCount(conditions);
	//把总记录数设置进page对象中
	page.setTotalCount(count);
	//返回条件分页查询的集合
	return bookDao.findByPage(page, conditions);
}
  • Action层代码
public String page4(){
	//创建分页对象,设置了显示第一页,每页显示2条记录
	Page page=new Page(1,2);
	
	//查询条件
	SimpleExpression[] conditions=new SimpleExpression[]{
			Restrictions.eq("category.category_id", book.getCategory().getCategory_id()),
			Restrictions.like("book_name", book.getBook_name().trim(),MatchMode.ANYWHERE)				
	};
	
	//调用的service的条件分页查询(值为NULL或空字符串的条件会自动排除)
	List<Book> bookList=bookService.findByPage(page, conditions);
	
	for (Book book : bookList) {
		System.out.println(book);
	}
	return NONE;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章