【SSH】SSH框架BaseDao、BaseService

1. 通用数据库访问层BaseDao

1.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(String hql,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(String hql,Object... paramValues) {		
		List<Long> list=(List<Long>)getHibernateTemplate().find(hql, paramValues);
		return list.size()>0?list.get(0).intValue():0;
	}
}


2. 通用业务层BaseService

2.1 接口BaseService
package com.service;

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

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.SimpleExpression;
import com.domain.Page;

public interface BaseService<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(String hql,Object... paramValues);
	List<T> findByPage(Page page,String hql,Object... paramValues);
}

2.2 实现类BaseServiceImpl
package com.service.impl;

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

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.SimpleExpression;

import com.dao.BaseDao;
import com.domain.Page;
import com.service.BaseService;

public class BaseServiceImpl<T> implements BaseService<T> {
	private BaseDao<T> baseDao;
	
	public void setBaseDao(BaseDao<T> baseDao) {
		this.baseDao = baseDao;
	}

	@Override
	public void save(T t) {
		baseDao.save(t);
	}

	@Override
	public void update(T t) {
		baseDao.update(t);
	}

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

	@Override
	public T findById(Serializable id) {
		return baseDao.findById(id);
	}

	@Override
	public List findAll() {		
		return baseDao.findAll();
	}

	@Override
	public List findByCriteria(DetachedCriteria detachedCriteria) {
		return baseDao.findByCriteria(detachedCriteria);
	}

	@Override
	public int findCount(DetachedCriteria detachedCriteria) {	
		return baseDao.findCount(detachedCriteria);
	}

	@Override
	public int findCount(SimpleExpression... conditions) {
		return baseDao.findCount(conditions);
	}

	@Override
	public List findByPage(Page page, DetachedCriteria detachedCriteria) {		
		return baseDao.findByPage(page, detachedCriteria);
	}

	@Override
	public List findByPage(Page page, SimpleExpression... conditions) {		
		return baseDao.findByPage(page, conditions);
	}

	@Override
	public int findCount(String hql,Object... paramValues) {		
		return baseDao.findCount(hql,paramValues);
	}

	@Override
	public List findByPage(Page page, String hql, Object... paramValues) {		
		return baseDao.findByPage(page, hql, paramValues);
	}
}

3. 分页信息类Page

package com.domain;

public class Page {
	private int currentPage;  //当前页
	private int pageSize;     //每页显示的记录数
	private int totalCount;   //总记录数
	private int totalPage;    //总页数	
	private int beginIndex;   //分页查询的开始下标,主要用于sql
	
	public final static int PAGESIZE_DEFAULT=10;  //默认每页显示的记录数
	public final static int PAGESIZE_MIN=1;       //每页显示的最小记录数
	public final static int PAGESIZE_MAX=100;     //每页显示的最大记录数
	
	
	
	public int getCurrentPage() {
		//当前页码不能小于1
		return currentPage<1?1:currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getPageSize() {
		//1<=页大小<=100
		if(pageSize<PAGESIZE_MIN||pageSize>PAGESIZE_MAX){
			return PAGESIZE_DEFAULT;
		}else{
			return pageSize;
		}
		
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public int getTotalPage() {
		//计算总页数,总记录数为0,则页数也为0
		return totalPage<1?0:(int)Math.ceil(totalCount/getPageSize());
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	
	public int getBeginIndex() {
		return (currentPage-1)*pageSize;
	}
	public void setBeginIndex(int beginIndex) {
		this.beginIndex = beginIndex;
	}
	public Page() {
		super();		
	}
	
	public Page(int currentPage, int pageSize) {
		super();
		this.currentPage = currentPage;
		this.pageSize = pageSize;
	}
}

4. 条件分页查询例子

4.1 BookDao接口继承BaseDao接口
package com.dao;
import com.domain.Book;

public interface BookDao extends BaseDao<Book>{
	/* 这里可以写自己定义的方法 */
}
4.2 BookDaoImpl实现BookDao接口并继承BaseDaoImpl
package com.dao.impl;

import com.dao.BookDao;
import com.domain.Book;

public class BookDaoImpl extends BaseDaoImpl<Book> implements BookDao {
	/* 这里可以写自定义的方法 */
}
4.3 BookService接口继承BaseService接口
package com.service;

import com.domain.Book;

public interface BookService extends BaseService<Book> {
	/* 这里可以自定义自己的方法 */
}
4.4 BookServiceImpl实现BookService接口并继承BaseServiceImpl
  • 注意:业务子类注入Dao实例时也要把该Dao实例传递给业务父类
package com.service.impl;
import com.dao.BookDao;
import com.domain.Book;
import com.service.BookService;

public class BookServiceImpl extends BaseServiceImpl<Book> implements BookService {
	private BookDao bookDao;

	//注入BookDao实例
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
		//重点注意:在注入BookDao实例时也要把bookDao的值传递给父类的BaseDao,否则调用父类方法时会空指针
		super.setBaseDao(this.bookDao);;
	}
	
	/* 这里可以自定义自己的方法 */
}
4.5 BookAction
	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)				
		};
		
		//根据条件查询总记录数
		page.setTotalCount(bookService.findCount(conditions));
		//调用的service的条件分页查询
		List<Book> bookList=bookService.findByPage(page, conditions);
		
		for (Book book : bookList) {
			System.out.println(book);
		}
		return NONE;
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值