ibatisentitydao.java

来自「anewssystem新闻发布系统集成使用了spring hibernate f」· Java 代码 · 共 160 行

JAVA
160
字号
package anni.core.dao.ibatis;

import java.io.Serializable;

import java.lang.reflect.InvocationTargetException;

import java.util.List;

import anni.core.dao.support.Page;

import anni.core.utils.GenericsUtils;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;

import org.springframework.orm.ObjectRetrievalFailureException;


/**
 * 负责为单个Entity 提供CRUD操作的IBatis DAO基类.
 * <p/>
 * 子类只要在类定义时指定所管理Entity的Class, 即拥有对单个Entity对象的CRUD操作.
 * <pre>
 * public class UserManagerIbatis extends IBatisEntityDao&lt;User&gt; {
 * }
 * </pre>
 *
 * @author suwei
 * @see IBatisGenericDao
 */
public class IBatisEntityDao<T> extends IBatisGenericDao {
    /**
     * DAO所管理的Entity类型.
     */
    protected Class<T> entityClass;
    protected String primaryKeyName;

    /**
     * 在构造函数中将泛型T.class赋给entityClass.
     */
    @SuppressWarnings("unchecked")
    public IBatisEntityDao() {
        entityClass = GenericsUtils.getSuperClassGenricType(getClass());
    }

    /**
     * 根据属性名和属性值查询对象.
     *
     * @return 符合条件的对象列表
     */
    public List<T> findBy(String name, Object value) {
        return findBy(getEntityClass(), name, value);
    }

    /**
     * 根据属性名和属性值以Like AnyWhere方式查询对象.
     */
    public List<T> findByLike(String name, String value) {
        return findByLike(getEntityClass(), name, value);
    }

    /**
     * 根据属性名和属性值查询单个对象.
     *
     * @return 符合条件的唯一对象
     */
    public T findUniqueBy(String name, Object value) {
        return findUniqueBy(getEntityClass(), name, value);
    }

    /**
     * 根据ID获取对象.
     */
    public T get(Serializable id) {
        return get(getEntityClass(), id);
    }

    /**
     * 获取全部对象.
     */
    public List<T> getAll() {
        return getAll(getEntityClass());
    }

    /**
     * 取得entityClass.
     * <p/>
     * JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。
     */
    protected Class<T> getEntityClass() {
        return entityClass;
    }

    public String getIdName(Class clazz) {
        return "id";
    }

    public String getPrimaryKeyName() {
        if (StringUtils.isEmpty(primaryKeyName)) {
            primaryKeyName = "id";
        }

        return primaryKeyName;
    }

    protected Object getPrimaryKeyValue(Object o)
        throws NoSuchMethodException, IllegalAccessException,
            InvocationTargetException, InstantiationException {
        //2007-3-29
        //fix PropertyUtils.getProperty(entityClass.newInstance(), getPrimaryKeyName()) always is null		    
        return PropertyUtils.getProperty(entityClass.cast(o),
            getPrimaryKeyName());
    }

    /**
     * 分页查询.
     */
    public Page pagedQuery(int pageNo, int pageSize) {
        return pagedQuery(getEntityClass(), null, pageNo, pageSize);
    }

    /**
     * 分页查询.
     */
    public Page pagedQuery(Object parameterObject, int pageNo, int pageSize) {
        return pagedQuery(getEntityClass(), parameterObject, pageNo,
            pageSize);
    }

    /**
     * 根据ID移除对象.
     */
    public void removeById(Serializable id) {
        removeById(getEntityClass(), id);
    }

    /**
     * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法.
     */
    public void save(Object o) {
        Object primaryKey;

        try {
            primaryKey = getPrimaryKeyValue(o);
        } catch (Exception e) {
            throw new ObjectRetrievalFailureException(entityClass, e);
        }

        if (primaryKey == null) {
            insert(o);
        } else {
            update(o);
        }
    }

    public void setPrimaryKeyName(String primaryKeyName) {
        this.primaryKeyName = primaryKeyName;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?