IBATIS Dao操作模板类

这一次介绍一下 ibatis  模板基类设计 实现公共方法,减少开发工作量
代码更整洁清淅

EntityDAO 类代码如下:

 

 

/**
 * (#)EntityDAO.java 1.0 2008-6-7 上午09:25:37
 *
 */
package com.keyi.util.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);
}

IbatisEntityDao 类内容如下:


/**
 * (#)IbatisEntityDao.java 1.0 2008-6-7 上午09:24:32
 *
 */
package com.keyi.util.dao;

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

import org.apache.commons.lang.StringUtils;

import com.keyi.util.page.Page;


@SuppressWarnings("unchecked")
public class IbatisEntityDao<T> extends IbatisGenericDao implements
  EntityDAO<T> {

 /**
  * DAO所管理的Entity类型.
  */
 protected Class<T> entityClass;

 protected String primaryKeyName;

 /**
  * 在构造函数中将泛型T.class赋给entityClass.
  */
 @SuppressWarnings("unchecked")
 public IbatisEntityDao() {
  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);
 }

 /**
  * 保存对象. 为了实现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);
 }
}


IbatisGenericDao 类内容如下:

/**
 * (#)IbatisGenericDao.java 1.0 2008-6-7 上午09:20:13
 *
 */
package com.keyi.util.dao;

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;

import com.keyi.util.page.Page;

 


@SuppressWarnings("unchecked")
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);
 }

 /**
  * 根据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);
 }
}


GenericsUtils  类内容如下:


/**
 * (#)GenericsUtils.java 1.0 2008-6-7 上午09:26:43
 *
 */
package com.keyi.util.dao;

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

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

@SuppressWarnings("unchecked")
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];
    }


}

 

 


具体应用如下:

public interface UserDAO extends EntityDAO<User>{
}

public class IbatisUserDAO extends IbatisEntityDao<User> implements UserDAO {

}

 

 

 

public interface NewsDAO extends EntityDAO<News>{

}
public class IbatisNewsDAO extends IbatisEntityDao<News> implements NewsDAO {

}

 

 

楼上的解释一下。为何不能用分页呢?

/**
 * (#)Page.java 1.0 2008-6-7 上午09:21:03
 *
 */


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

 

/**
 * 分页对象. 包含当前页数据及分页信息如总记录数.
 *
 * @author 狂狼爪哇
 */

@SuppressWarnings("serial")
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;
 }
}

 

domain 类:

 

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;

import com.czuan.util.user.IUser;

/**
 * 功能:用户信息
 *
 * @author 狂狼爪哇
 * @version 1.0
 * @JDK 5
 */
public class User implements IUser {

 private Long id;

 /*
  * 用户名
  */
 private String loginName;

 /*
  * 密码
  */
 private String passWord;

 /*
  * 问题
  */
 private String question;

 /*
  * 答案
  */
 private String result;

 /*
  * 邮箱
  */
 private String email;

 /*
  * 电话号码
  */
 private String phone;

 /*
  * 手机号码
  */
 private String tel;

 /*
  * 祥细地扯
  */
 private String address;

 /**
  * 角色
  */
 private Long role;

 /*
  * 传真
  */
 private String fax;

 /*
  * qq/MSN
  */
 private String qqMsn;

 /*
  * 真实姓名
  */
 private String name;

 /*
  * 身份证号码
  */
 private String card;

 /*
  * 邮证号码
  */
 private String postalcode;
 /**
  * 注册时间
  */
 private Date registerDate;

 /*
  * 备注
  */
 private String bak;

 public String getAddress() {
  return address;
 }

 public void setAddress(String address) {
  this.address = address;
 }

 public String getBak() {
  return bak;
 }

 public void setBak(String bak) {
  this.bak = bak;
 }

 public String getCard() {
  return card;
 }

 public void setCard(String card) {
  this.card = card;
 }

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 public String getFax() {
  return fax;
 }

 public void setFax(String fax) {
  this.fax = fax;
 }

 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getLoginName() {
  return loginName;
 }

 public void setLoginName(String loginName) {
  this.loginName = loginName;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getPassWord() {
  return passWord;
 }

 public void setPassWord(String passWord) {
  this.passWord = passWord;
 }

 public String getPhone() {
  return phone;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

 public String getPostalcode() {
  return postalcode;
 }

 public void setPostalcode(String postalcode) {
  this.postalcode = postalcode;
 }

 public String getQqMsn() {
  return qqMsn;
 }

 public void setQqMsn(String qqMsn) {
  this.qqMsn = qqMsn;
 }

 public String getQuestion() {
  return question;
 }

 public void setQuestion(String question) {
  this.question = question;
 }

 public String getResult() {
  return result;
 }

 public void setResult(String result) {
  this.result = result;
 }

 public Long getRole() {
  return role;
 }

 public void setRole(Long role) {
  this.role = role;
 }

 public String getTel() {
  return tel;
 }

 public void setTel(String tel) {
  this.tel = tel;
 }

 @SuppressWarnings("unchecked")
 public Map transfer2Map(){
  Map parameters = new HashMap();
  if(StringUtils.isNotBlank(this.getLoginName()))
     parameters.put("loginName", "%"+StringEscapeUtils.escapeSql(this.getLoginName().trim())+"%");
  if(StringUtils.isNotBlank(this.getPassWord()))
     parameters.put("passWord", "%"+StringEscapeUtils.escapeSql(this.getPassWord().trim())+"%");
  if(StringUtils.isNotBlank(this.getQuestion()))
   parameters.put("question", "%"+StringEscapeUtils.escapeSql(this.getQuestion().trim())+"%");
  if(StringUtils.isNotBlank(this.getResult()))
   parameters.put("result", "%"+StringEscapeUtils.escapeSql(this.getResult().trim())+"%");
  if(StringUtils.isNotBlank(this.getEmail()))
   parameters.put("email", "%"+StringEscapeUtils.escapeSql(this.getEmail().trim())+"%");
  if(StringUtils.isNotBlank(this.getPhone()))
   parameters.put("phone", "%"+StringEscapeUtils.escapeSql(this.getPhone().trim())+"%");
  if(StringUtils.isNotBlank(this.getTel()))
   parameters.put("tel", "%"+StringEscapeUtils.escapeSql(this.getTel().trim())+"%");
  if(StringUtils.isNotBlank(this.getFax()))
   parameters.put("fax", "%"+StringEscapeUtils.escapeSql(this.getFax().trim())+"%");
  if(StringUtils.isNotBlank(this.getQqMsn()))
   parameters.put("qqMsn", "%"+StringEscapeUtils.escapeSql(this.getQqMsn().trim())+"%");
  if(StringUtils.isNotBlank(this.getName()))
   parameters.put("name", "%"+StringEscapeUtils.escapeSql(this.getName().trim())+"%");
  if(StringUtils.isNotBlank(this.getCard()))
   parameters.put("card", "%"+StringEscapeUtils.escapeSql(this.getCard().trim())+"%");
  if(StringUtils.isNotBlank(this.getPostalcode()))
   parameters.put("postalcode", "%"+StringEscapeUtils.escapeSql(this.getPostalcode()).trim()+"%");
   parameters.put("role", this.getRole());
  return parameters;
 }

 public Date getRegisterDate() {
  return registerDate;
 }

 public void setRegisterDate(Date registerDate) {
  this.registerDate = registerDate;
 }
}

 

你可能感兴趣的:(DAO,apache,sql,ibatis,qq)