ibatis封装dao层操作

参看了各类文章,感觉作用很大,把代码复制上来,以后开发都会有用

import java.io.Serializable;
import java.util.List;
public interface EntityDAO<T> {

	/**  
	* 根据主键查找对象  
	*   
	* @param id  主键值  
	*            
	* @return 对象实体  
	*/
	T findByPrimarykey(Serializable id);
	
	/**
	 * 
	 * 查找所有对象
	 */
	List<T> findAll();

	/**  
	 * 新增对象到数据库  
	 *   
	 * @param o  
	 * 
	 */
	void insert(T o);

	/**  
	 * 更新对象实体到数据库  
	 *   
	 * @param o  
	 *  
	 */
	void update(T o);

	/**  
	 * 根据主键删除对象  
	 *   
	 * @param id  主键值  
	 *            
	 */
	void deleteByPrimarykey(Serializable id);
	
	/**
	 * 批量删除对象
	 * @param ids
	 */
	void delete(String... ids);

	/**  
	 * 更新对象信息  
	 *   
	 * @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;


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

	 /**  
     * DAO所管理的Entity类型.  
     */  
    protected Class<T> entityClass;   
  
    protected String primaryKeyName;   
  
    /**  
     * 在构造函数中将泛型T.class赋给entityClass.  
     */  
    public IbatisEntityDao() {   
        entityClass = GenericsUtils.getSuperClassGenricType(getClass());   
    }   
  
    /**  
     * 根据ID获取对象.  
     */  
    public T findByPrimarykey(Serializable id) {   
        return get(getEntityClass(), id);   
    }   
  
    /**
     * 
     * 获取所有对象
     */
    public List<T> findAll() {
    	return getAll(getEntityClass());
    }
    /**  
     * 取得entityClass. <p/> JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。  
     */  
    protected Class<T> getEntityClass() {   
        return entityClass;   
    }   
  
    public String getIdName(Class clazz) {   
        return "id";   
    }   
  
    /**  
     * 根据ID移除对象.  
     */  
    public void deleteByPrimarykey(Serializable id) {   
        removeById(getEntityClass(), id);   
    }   
  
    /**
     * 批量删除对象
     */
    public void delete(String... ids) {
    	removeByIds(getEntityClass(), ids);
	}

	/**  
     * 保存对象. 为了实现IEntityDao 我在内部使用了insert和update 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);   
    }   

}

 

public class IbatisGenericDao extends BaseDaoiBatis {

	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_BATCH_DELETE = ".deleteByIds";

	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 <T> List<T> getAll(Class<T> entityClass) {

		List<T> li =  getSqlMapClientTemplate().queryForList(
				getStatementId(entityClass, IbatisGenericDao.POSTFIX_GETALL)
				);
		return li;
	}

	/**  
	 * 新增对象  
	 */
	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);
	}

	public <T> void removeByIds(Class<T> entityClass, String... pids) {
		String ids =  GenericsUtils.createBlock(pids);
		getSqlMapClientTemplate().delete(
				getStatementId(entityClass,
						IbatisGenericDao.POSTFIX_BATCH_DELETE), ids);
	}
	
	/**
	 * 分页方法
	 */
	public List findByPage(String statementName, final Map map) {
		final int pageSize = (Integer)map.get(Constant.PAGE_SIZE);
		final int skipResults = (Integer)map.get(Constant.SKIP_RESULTS);
		return getSqlMapClientTemplate().queryForList(statementName, map, skipResults, pageSize);
	}

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

}

 

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];
	}
	
	/**
	 * for batch delete
	 * 
	 * @param ids
	 * @return
	 */
	public static String createBlock(Object[] ids) {
		if (ids == null || ids.length == 0)
			return "('')";
		String blockStr = "";
		for (int i = 0; i < ids.length - 1; i++) {
			blockStr += "'" + ids[i] + "',";
		}
		blockStr += "'" + ids[ids.length - 1] + "'";
		return blockStr;
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值