一、基于Hibernate的Dao层代码的抽取
1.定义BaseDao接口,其他Dao接口继承该接口
2.在Dao接口定定义基本的增删改查和分页有关的方法
public interface BaseDao<T> {
/**
* 保存实体
* @param entity
*/
void save(T entity);
/**
* 删除实体
* @param entity
*/
void delete(T entity);
/**
* 根据实体Id删除实体
* @param id
*/
void deleteById(Serializable id);
/**
* 更新实体信息
* @param entity
*/
void update(T entity);
/**
* 根据Id查询实体
* @param id
* @return
*/
T findById(Serializable id);
/**
* 查询所有实体信息
* @return
*/
List<T> list();
/**
* 查询实体的总数
* @param dc
* @return
*/
Integer getTotalCount(DetachedCriteria dc);
/**
* 分页查询实体
* @param dc 离线查询条件
* @param start 查询起始下标
* @param pageSize 每页的记录条数
* @return
*/
List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
}
2.定义BaseDaoImpl,继承HibernateDaoSupport,实现BaseDao接口,主要要注入SessionFactory对象
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class<T> entityClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
// 获取子类对象的父类类型
ParameterizedType superClass = (ParameterizedType) this.getClass()
.getGenericSuperclass();
// 获得在父类类型上声明的反省数组
Type[] genericTypes = superClass.getActualTypeArguments();
// 第一个泛型即为实体类型
entityClass = (Class<T>) genericTypes[0];
}
@Override
public void save(T entity) {
getHibernateTemplate().save(entity);
}
@Override
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}
@Override
public void deleteById(Serializable id) {
T entity = getHibernateTemplate().load(entityClass, id);
getHibernateTemplate().delete(entity);
}
@Override
public void update(T entity) {
getHibernateTemplate().update(entity);
}
@Override
public T findById(Serializable id) {
return getHibernateTemplate().get(entityClass, id);
}
@Override
public List<T> list() {
return getHibernateTemplate().loadAll(entityClass);
}
@Override
public Integer getTotalCount(DetachedCriteria dc) {
//设置查询的聚合函数,总记录数
dc.setProjection(Projections.rowCount());
@SuppressWarnings("unchecked")
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
//清空之前设置的聚合函数
dc.setProjection(null);
if(list!=null && list.size()>0){
Long count = list.get(0);
return count.intValue();
}else{
return null;
}
}
@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
@SuppressWarnings("unchecked")
List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
return list;
}
/**
* HibernateDao接口在使用前必须注入SessionFactory
*
* @param sessionFactory
*/
@Autowired
public void setSF(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
}
3.其他的Dao接口继承BaseDao接口,定义额外的方法
4.其他的Dao实现类继承BaseDaoImpl,实现Dao接口定义的方法
二、基于Struts2的Action层的抽取
1.抽取BaseAction,定义基本的内容,供其他Action继承
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>,
RequestAware, SessionAware {
private static final long serialVersionUID = 1L;
protected Map<String, Object> request;
protected Map<String, Object> session;
protected T model;
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public T getModel() {
return model;
}
public BaseAction() {
// 获取父类
ParameterizedType genericSuperclass = (ParameterizedType) this
.getClass().getGenericSuperclass();
// 获取父类的泛型数组
Type[] types = genericSuperclass.getActualTypeArguments();
// 取得第一个泛型,即Model的类型
@SuppressWarnings("unchecked")
Class<T> entityClass = (Class<T>) types[0];
try {
model = entityClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
2.其他Action类继承该类即可