006 代码抽取 - bos

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了006 代码抽取 - bos相关的知识,希望对你有一定的参考价值。


一、基于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类继承该类即可

以上是关于006 代码抽取 - bos的主要内容,如果未能解决你的问题,请参考以下文章

持久层抽取之类名的获取

004 ztree入门 - bos

JAVAEE——BOS物流项目05:OCUploadPOIpinyin4J重构分页代码分区添加combobox

BOS物流项目第十一天(补充)

029 定区关联客户功能 - bos

k3BOS开发知识点