摘要:本文讲述了运用java的范型,搭配struts2,spring3,ibaits3加快开发速度的过程。在本范型架构中,不需要使用反射机制、不需要beanutil属性操作,尽可能得提高效率,同时加快开发速度。
通用范型Dao
package com.founder.bbc.generic;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
/**
* 通用DAO范型类,建议每个实体都包含一个单值主键,如:多对多关联表新建一id字段作为主键
* @author fd_zhangrenjie 张人杰
* 转载、使用,请保留作者信息
* 此范型已应用于方正某项目
* @param <T>
*/
public abstract class AbstractGenericDao <PK extends Serializable,T extends GenericEntity<PK>> implements GenericDao<PK,T>{
@Autowired
@Qualifier("sqlMapClientTemplate")
protected SqlMapClientTemplate sqlMapClientTemplate;
private Class<T> clazz;
protected String prefix;//ibatis中定义的namespace
public AbstractGenericDao() {
clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
prefix=clazz.getName()+".";
}
@Override
public List<T> listAll() {
return pagedListAll(null, null);
}
@Override
public List<T> listAll(String ibatisStatement) {
return pagedListAll(null, null, ibatisStatement);
}
@Override
public List<T> pagedListAll(Integer pageNo, Integer pageSize) {
return pagedListAll(pageNo,pageSize,DaoTemplateStatement.LIST);
}
@Override
public List<T> pagedListAll(Integer pageNo, Integer pageSize, String ibatisStatement) {
T condition=null;
try {
condition = clazz.newInstance();
condition.setPageNo(pageNo);
condition.setPageSize(pageSize);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return (List<T>)sqlMapClientTemplate.queryForList(prefix+ibatisStatement, condition);
}
@Override
public List<T> pagedListQuery(T condition) {
return (List<T>)sqlMapClientTemplate.queryForList(prefix+DaoTemplateStatement.LIST, condition);
}
@Override
public List<T> pagedListQuery(T condition, String ibatisStatement) {
return (List<T>)sqlMapClientTemplate.queryForList(prefix+ibatisStatement, condition);
}
@Override
public List<T> queryAll(T condition) {
condition.setPageNo(null);
condition.setPageSize(null);
return (List<T>)sqlMapClientTemplate.queryForList(prefix+DaoTemplateStatement.LIST, condition);
}
@Override
public List<T> queryAll(T condition, String ibatisStatement) {
condition.setPageNo(null);
condition.setPageSize(null);
return (List<T>)sqlMapClientTemplate.queryForList(prefix+ibatisStatement, condition);
}
@Override
public T queryObject(T condition) {
return (T)sqlMapClientTemplate.queryForObject(prefix+DaoTemplateStatement.QUERY_OBJECT,condition);
}
@Override
public T queryObject(T condition, String ibatisStatement) {
return (T)sqlMapClientTemplate.queryForObject(prefix+ibatisStatement,condition);
}
@Override
public void remove(T condition) {
sqlMapClientTemplate.delete(prefix+DaoTemplateStatement.DELETE, condition);
}
@Override
public void remove(T condition, String ibatisStatement) {
sqlMapClientTemplate.delete(prefix+ibatisStatement, condition);
}
@Override
public void multiPKRemove(T condition, String ibatisStatement) {
sqlMapClientTemplate.delete(prefix+ibatisStatement, condition);
}
@Override
public void multiPKRemove(T condition) {
sqlMapClientTemplate.delete(prefix+DaoTemplateStatement.MULTIPLY_PK_DELETE, condition);
}
@Override
public PK saveOrUpdate(T object) {
return (PK)sqlMapClientTemplate.insert(prefix+DaoTemplateStatement.SAVE_OR_UPDATE, object);
}
@Override
public PK saveOrUpdate(T object, String ibatisStatement) {
return (PK)sqlMapClientTemplate.insert(prefix+ibatisStatement, object);
}
@Override
public PK insert(T object) {
return (PK)sqlMapClientTemplate.insert(prefix+DaoTemplateStatement.INSERT, object);
}
@Override
public PK insert(T object, String ibatisStatement) {
return (PK)sqlMapClientTemplate.insert(prefix+ibatisStatement, object);
}
@Override
public Integer update(T object) {
return (Integer)sqlMapClientTemplate.update(prefix+DaoTemplateStatement.UPDATE, object);
}
@Override
public Integer update(T object, String ibatisStatement) {
return (Integer)sqlMapClientTemplate.update(prefix+ibatisStatement, object);
}
@Override
public Integer count(T condition){
return (Integer)sqlMapClientTemplate.queryForObject(prefix+DaoTemplateStatement.COUNT,condition);
}
@Override
public Integer count(T condition, String ibatisStatement){
return (Integer)sqlMapClientTemplate.queryForObject(prefix+ibatisStatement,condition);
}
}
范型Dao接口定义
package com.founder.bbc.generic;
import java.io.Serializable;
import java.util.List;
public interface GenericDao<PK extends Serializable,T extends GenericEntity<PK>> {
/**
* 列出所有内容
* @return
*/
public List<T> listAll();
/**
* 列出所有内容(使用特殊语句)
* @return
*/
public List<T> listAll(String ibatisStatement);
/**
* 根据条件查询并返回所有查询结果
* @param condition
* @return
*/
public List<T> queryAll(T condition);
/**
* 根据条件查询并返回所有查询结果(使用特殊语句)
* @param condition
* @return
*/
public List<T> queryAll(T condition,String ibatisStatement);
/**
* 根据条件查询对象
* @param condition
* @return
*/
public T queryObject(T condition);
/**
* 根据条件查询对象(使用特殊语句)
* @param condition
* @return
*/
public T queryObject(T condition,String ibatisStatement);
/**
* 查询所有内容,并分页返回结果
* @param pageNo
* @param pageSize
* @return
*/
public List<T> pagedListAll(Integer pageNo, Integer pageSize);
/**
* 查询所有内容,并分页返回结果(使用特殊语句)
* @param pageNo
* @param pageSize
* @return
*/
public List<T> pagedListAll(Integer pageNo, Integer pageSize, String ibatisStatement);
/**
* 根据条件查询所有内容,并分页返回结果
* @param condition
* @return
*/
public List<T> pagedListQuery(T condition);
/**
* 根据条件查询所有内容,并分页返回结果(使用特殊语句)
* @param condition
* @return
*/
public List<T> pagedListQuery(T condition, String ibatisStatement);
/**
* 保存或更新实体
* Oracle,此处采用存储过程完成,以保证id序列的正确,并将新插入的id返回给插入对象
* @param template
* @return
*/
public PK saveOrUpdate(T object);
/**
* 保存或更新实体(使用特殊语句)
* Oracle,此处采用存储过程完成,以保证id序列的正确,并将新插入的id返回给插入对象
* @param template
* @return
*/
public PK saveOrUpdate(T object, String ibatisStatement);
/**
* 插入实体
* @param template
* @return
*/
public PK insert(T object);
/**
* 插入实体(使用特殊语句)
* @param template
* @return
*/
public PK insert(T object, String ibatisStatement);
/**
* 更新实体
* @param template
* @return
*/
public Integer update(T object);
/**
* 更新实体(使用特殊语句)
* @param template
* @return
*/
public Integer update(T object, String ibatisStatement);
/**
* 删除实体,或根据条件删除列表
* @param condition
* @return
*/
public void remove(T condition);
/**
* 删除实体,或根据条件删除列表(使用特殊语句)
* @param condition
* @return
*/
public void multiPKRemove(T condition, String ibatisStatement);
/**
* 多选删除,或根据条件删除列表
* @param condition
* @return
*/
public void multiPKRemove(T condition);
/**
* 多选删除,或根据条件删除列表(使用特殊语句)
* @param condition
* @return
*/
public void remove(T condition, String ibatisStatement);
/**
* 计数
* @return
*/
public Integer count(T condition);
/**
* 计数(使用特殊语句)
* @return
*/
public Integer count(T condition, String ibatisStatement);
}
一位老同事说现在流行将缓存操作放在前端,放在Action中,在范型框架的设计中,这有一定的可取性和道理。
北京师范大学 计算机系
张人杰
2012.9.27