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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章