ibatis dao模板

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

public interface EntityDAO<T> {
	 /**
	  * 根据主键查找对象
	  * 
	  * @param id
	  *            主键值
	  * @return 对象实体
	  */
	 T findByPrimarykey(Serializable id);
	 /**
	  * 新增对象到数据库
	  * 
	  * @param o
	  *            对象实体
	  */
	 void insert(T o);
	 /**
	  * 更新对象实体到数据库
	  * 
	  * @param o
	  *            对象实体
	  */
	 void update(T o);
	 /**
	  * 根据主键删除对象
	  * 
	  * @param id
	  *            主键值
	  */
	 void deleteByPrimarykey(Serializable id);
	 /**
	  * 更新对象信息
	  * 
	  * @param statementId
	  *            sql语句名称后缀
	  * @param parameters
	  *            sql参数
	  */
	 void update(String statementId, Object parameters);
	 /**
	  * sql查询单个对象
	  * 
	  * @param statementId
	  *            sql语句名称后缀
	  * @param parameters
	  *            sql参数
	  * @return 查询结果
	  */
	 T queryForObject(String statementId, Object parameters);
	 /**
	  * sql查询列表
	  * 
	  * @param statementId
	  *            sql语句名称后缀
	  * @param parameters
	  *            sql参数
	  * @return 查询结果
	  */
	 List<T> queryForList(String statementId, Object parameters);
}

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

import org.apache.commons.lang.StringUtils;



public class EntityDAOImpl<T> extends IbatisGenericDao implements EntityDAO<T> {

	 /**
	  * DAO所管理的Entity类型.
	  */
	 protected Class<T> entityClass;
	 protected String primaryKeyName;
	 /**
	  * 在构造函数中将泛型T.class赋给entityClass.
	  */
	 @SuppressWarnings("unchecked")
	 public EntityDAOImpl() {
	  entityClass = GenericsUtils.getSuperClassGenricType(getClass());
	 }
	 /**
	  * 根据ID获取对象.
	  */
	 public T findByPrimarykey(Serializable id) {
	  return get(getEntityClass(), id);
	 }
	 /**
	  * 取得entityClass. <p/> JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。
	  */
	 protected Class<T> getEntityClass() {
	  return entityClass;
	 }
	 public String getIdName(Class clazz) {
	  return "id";
	 }
	 /**
	  * 分页查询.
	  */
	 public Page pagedQuery(Map parameterObject, int start, int limit) {
	  return pagedQuery(getEntityClass(), parameterObject, start, limit);
	 }
	 /**
	  * 分页查询.
	  */
	 public Page pagedQuery(Map parameterObject, int start, int limit,
	   String countSqlId, String pageQuerySqlId) {
	  if (StringUtils.isNotBlank(pageQuerySqlId))
	   return pagedQuery(getEntityClass(), parameterObject, start, limit,
	     countSqlId, pageQuerySqlId);
	  else {
	   return pagedQuery(getEntityClass(), parameterObject, start, limit);
	  }
	 }
	 /**
	  * 根据ID移除对象.
	  */
	 public void deleteByPrimarykey(Serializable id) {
	  removeById(getEntityClass(), id);
	 }
	 /**
	  * 根据ID移除对象.
	  */
	 public void delete(Class<?> entityClass,Object obj) {
		 super._delete(entityClass,obj);
	 }
	 /**
	  * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法.
	  */
	 public void insert(T o) {
	  super._insert(o);
	 }
	 public void setPrimaryKeyName(String primaryKeyName) {
	  this.primaryKeyName = primaryKeyName;
	 }
	 
	 public List<T> queryForList(String statementId, Object parameters) {
	  return super.queryForList(getEntityClass(), statementId, parameters);
	 }
	 
	 public T queryForObject(String statementId, Object parameters) {
	  return super.queryForObject(getEntityClass(), statementId, parameters);
	 }
	 
	 public void update(String statementId, Object parameters) {
	  super.update(getEntityClass(), statementId, parameters);
	 }
	public void update(T o) {
		super._update(o);
	}
	
}

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class GenericsUtils {
	private static final Log log = LogFactory.getLog(GenericsUtils.class);
    private GenericsUtils() {
    }
   
    public static Class getSuperClassGenricType(Class clazz) {
        return getSuperClassGenricType(clazz, 0);
    }
 
    public static Class getSuperClassGenricType(Class clazz, int index) {
        Type genType = clazz.getGenericSuperclass();
        if (!(genType instanceof ParameterizedType)) {
            log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
            return Object.class;
        }
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        if (index >= params.length || index < 0) {
            log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
                    + params.length);
            return Object.class;
        }
        if (!(params[index] instanceof Class)) {
            log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
            return Object.class;
        }
        return (Class) params[index];
    }
}

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

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.util.Assert;


public class IbatisGenericDao extends SqlMapClientDaoSupport {
	public static final String POSTFIX_INSERT = ".insert";
	 public static final String POSTFIX_UPDATE = ".update";
	 public static final String POSTFIX_DELETE = ".delete";
	 public static final String POSTFIX_DELETE_PRIAMARYKEY = ".deleteByPrimaryKey";
	 public static final String POSTFIX_SELECT = ".select";
	 public static final String POSTFIX_GETALL = ".getAll";
	 public static final String POSTFIX_SELECTMAP = ".selectByMap";
	 public static final String POSTFIX_SELECTSQL = ".selectBySql";
	 public static final String POSTFIX_COUNT = ".count";
	 public static final String POSTFIX_QUERY = ".query";
	 /**
	  * 根据ID获取对象
	  */
	 public <T> T get(Class<T> entityClass, Serializable id) {
	  T o = (T) getSqlMapClientTemplate().queryForObject(
	    getStatementId(entityClass, IbatisGenericDao.POSTFIX_SELECT),
	    id);
	  return o;
	 }
	 /**
	  * 新增对象
	  */
	 public void _insert(Object o) {
	  getSqlMapClientTemplate().insert(
	    getStatementId(o.getClass(), IbatisGenericDao.POSTFIX_INSERT),
	    o);
	 }
	 /**
	  * 保存对象
	  */
	 public void _update(Object o) {
	  getSqlMapClientTemplate().update(
	    getStatementId(o.getClass(), IbatisGenericDao.POSTFIX_UPDATE),
	    o);
	 }
	 /**
	  * 删除对象
	  */
	 public <T> void _delete(Class<T> entityClass,Object o) {
		 getSqlMapClientTemplate().delete(
				 getStatementId(entityClass,
						 IbatisGenericDao.POSTFIX_DELETE), o);
	 }
	 /**
	  * 根据ID删除对象
	  */
	 public <T> void removeById(Class<T> entityClass, Serializable id) {
	  getSqlMapClientTemplate().delete(
	    getStatementId(entityClass,
	      IbatisGenericDao.POSTFIX_DELETE_PRIAMARYKEY), id);
	 }
	 
	 /**
	  * 分页查询函数,使用PaginatedList.
	  * 
	  * @param start
	     *@param limit @return 含17117717记录数和当前页数据的Page对象.
	  */
	 public Page pagedQuery(Class entityClass, Map parameterObject, int start,
	   int limit) {
	  Assert.isTrue(start >= 0, "pageNo should start from 0");
	  // 计算总数 
	  Integer totalCount = (Integer) getSqlMapClientTemplate()
	    .queryForObject(
	      getStatementId(entityClass,
	        IbatisGenericDao.POSTFIX_COUNT),
	      parameterObject);
	  // 如果没有数据则返回Empty Page
	  Assert.notNull(totalCount, "totalCount Error");
	  if (totalCount.intValue() == 0) {
	   return new Page();
	  }
	  List list;
	  int totalPageCount = 0;
	  int startIndex = 0;
	  // 如果pageSize小于0,则返回所有数捄1177,等同于getAll
	  if (limit > 0) {
	   // 计算页数
	   totalPageCount = (totalCount / limit);
	   totalPageCount += ((totalCount % limit) > 0) ? 1 : 0;
	   // 计算skip数量
	   if (totalCount > start) {
	    startIndex = start;
	   } else {
	    startIndex = (totalPageCount - 1) * limit;
	   }
	   if (parameterObject == null)
	    parameterObject = new HashMap();
	   parameterObject.put("startIndex", startIndex);
	   parameterObject.put("endIndex", limit);
	   list = getSqlMapClientTemplate()
	     .queryForList(
	       getStatementId(entityClass,
	         IbatisGenericDao.POSTFIX_QUERY),
	       parameterObject);
	  } else {
	   list = getSqlMapClientTemplate()
	     .queryForList(
	       getStatementId(entityClass,
	         IbatisGenericDao.POSTFIX_QUERY),
	       parameterObject);
	  }
	  return new Page(startIndex, totalCount, limit, list);
	 }
	 /**
	  * 分页查询函数,使用PaginatedList.
	  * 
	  * @param start
	     *@param limit @return 含17117717记录数和当前页数据的Page对象.
	  */
	 public Page pagedQuery(Class entityClass, Map parameterObject, int start,
	   int limit, String countSqlId, String pageQuerySqlId) {
	  Assert.isTrue(start >= 0, "pageNo should start from 0");
	  // 计算总数 
	  Integer totalCount = (Integer) getSqlMapClientTemplate()
	    .queryForObject(
	      getStatementId(entityClass,
	        countSqlId),
	      parameterObject);
	  // 如果没有数据则返回Empty Page
	  Assert.notNull(totalCount, "totalCount Error");
	  if (totalCount.intValue() == 0) {
	   return new Page();
	  }
	  List list;
	  int totalPageCount = 0;
	  int startIndex = 0;
	  // 如果pageSize小于0,则返回所有数捄1177,等同于getAll
	  if (limit > 0) {
	   // 计算页数
	   totalPageCount = (totalCount / limit);
	   totalPageCount += ((totalCount % limit) > 0) ? 1 : 0;
	   // 计算skip数量
	   if (totalCount >= start) {
	    startIndex = start;
	   } else {
	    startIndex = (totalPageCount - 1) * limit;
	   }
	   if (parameterObject == null)
	    parameterObject = new HashMap();
	   parameterObject.put("startIndex", startIndex);
	   parameterObject.put("endIndex",  limit);
	   list = getSqlMapClientTemplate()
	     .queryForList(
	       getStatementId(entityClass,
	         pageQuerySqlId),
	       parameterObject);
	  } else {
	   list = getSqlMapClientTemplate()
	     .queryForList(
	       getStatementId(entityClass,
	         pageQuerySqlId),
	       parameterObject);
	  }
	  return new Page(startIndex, totalCount, limit, list);
	 }
	 /**
	  * get statement id in SQL Map file
	  * 
	  * @param entityClass
	  *            entity class
	  * @param suffix
	  *            suffix
	  * @return statement id
	  */
	 private String getStatementId(Class entityClass, String suffix) {
	  String className = entityClass.getName();
	  String shortName = className.replace(entityClass.getPackage().getName()
	    + ".", "");
	  return shortName + suffix;
	 }
	 public <T> List<T> queryForList(Class<T> entityClass, String statementId,
	   Object parameters) {
	  return getSqlMapClientTemplate().queryForList(
	    getStatementId(entityClass, statementId), parameters);
	 }
	 public <T> T queryForObject(Class<T> entityClass, String statementId,
	   Object parameters) {
	  return (T) getSqlMapClientTemplate().queryForObject(
	    getStatementId(entityClass, statementId), parameters);
	 }
	 public void update(Class entityClass, String statementId, Object parameters) {
	  getSqlMapClientTemplate().update(
	    getStatementId(entityClass, statementId), parameters);
	 }

}

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

public class Page implements Serializable{
	public static int DEFAULT_PAGE_SIZE = 10;
	 private int pageSize = Page.DEFAULT_PAGE_SIZE; // 每页的记录数
	 private int start; // 当前页第一条数据在List中的位置,从0开始
	 private Collection data; // 当前页中存放的记录,类型一般为List
	 private int totalCount; // 总记录数
	 
	    /**
	  * 构造方法,只构造空页.
	  */
	 public Page() {
	  this(0, 0, Page.DEFAULT_PAGE_SIZE, new ArrayList());
	 }
	 /**
	  * 默认构造方法.
	  * 
	  * @param start
	  *            本页数据在数据库中的起始位置
	  * @param totalSize
	  *            数据库中总记录条数
	  * @param pageSize
	  *            本页容量
	  * @param data
	  *            本页包含的数据
	  */
	 public Page(int start, int totalSize, int pageSize, Collection data) {
	  this.pageSize = pageSize;
	  this.start = start;
	  totalCount = totalSize;
	  this.data = data;
	 }
	 /**
	  * 取总记录数.
	  */
	 public int getTotalCount() {
	  return totalCount;
	 }
	 /**
	  * 取总页数.
	  */
	 public int getTotalPageCount() {
	  if (totalCount % pageSize == 0)
	   return totalCount / pageSize;
	  else
	   return totalCount / pageSize + 1;
	 }
	 /**
	  * 取每页数据容量.
	  */
	 public int getPageSize() {
	  return pageSize;
	 }
	 /**
	  * 取当前页中的记录.
	  */
	 public Collection getResult() {
	  return data;
	 }
	 /**
	  * 取该页当前页码,页码从1开始.
	  */
	 public int getCurrentPageNo() {
	  return start / pageSize + 1;
	 }
	 /**
	  * 该页是否有下一页.
	  */
	 public boolean hasNextPage() {
	  return getCurrentPageNo() < getTotalPageCount() - 1;
	 }
	 /**
	  * 该页是否有上一页.
	  */
	 public boolean hasPreviousPage() {
	  return getCurrentPageNo() > 1;
	 }
	 /**
	  * 获取任一页第一条数据在数据集的位置,每页条数使用默认值.
	  * 
	  * @see #getStartOfPage(int,int)
	  */
	 protected static int getStartOfPage(int pageNo) {
	  return Page.getStartOfPage(pageNo, Page.DEFAULT_PAGE_SIZE);
	 }
	 /**
	  * 获取任一页第一条数据在数据集的位置.
	  * 
	  * @param pageNo
	  *            从1开始的页号
	  * @param pageSize
	  *            每页记录条数
	  * @return 该页第一条数据
	  */
	 public static int getStartOfPage(int pageNo, int pageSize) {
	  return (pageNo - 1) * pageSize;
	 }
	 
	 public int getCurrentPage() {
	  return this.getCurrentPageNo();
	 }
	 
	 public int getTotalPage() {
	  return this.getTotalPageCount();
	 }
	    public int getStart() { 
	  return this.start;
	 }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值