运用范型开发方式加快开发速度

摘要:本文讲述了运用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

你可能感兴趣的:(运用范型开发方式加快开发速度)