ibatisgenericdao.java

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

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

import java.io.Serializable;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

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

import anni.core.dao.support.Page;

import com.ibatis.common.util.PaginatedList;

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

import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import org.springframework.util.Assert;


/**
 * IBatis Dao的泛型基类.
 * <p/>
 * 继承于Spring的SqlMapClientDaoSupport,提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换.
 *
 * @author suwei
 * @see SqlMapClientDaoSupport
 */
@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_SELECTMAP = ".selectByMap";
    public static final String POSTFIX_SELECTSQL = ".selectBySql";
    public static final String POSTFIX_COUNT = ".count";

    /**
     * 根据ID获取对象
     */
    public <T> T get(Class<T> entityClass, Serializable id) {
        T o = (T) getSqlMapClientTemplate()
                      .queryForObject(entityClass.getName()
                + POSTFIX_SELECT, id);

        if (o == null) {
            throw new ObjectRetrievalFailureException(entityClass, id);
        }

        return o;
    }

    /**
     * 获取全部对象
     */
    public <T> List<T> getAll(Class<T> entityClass) {
        return getSqlMapClientTemplate()
                   .queryForList(entityClass.getName() + POSTFIX_SELECT,
            null);
    }

    /**
     * 新增对象
     */
    public void insert(Object o) {
        getSqlMapClientTemplate()
            .insert(o.getClass().getName() + POSTFIX_INSERT, o);
    }

    /**
     * 保存对象
     */
    public void update(Object o) {
        getSqlMapClientTemplate()
            .update(o.getClass().getName() + POSTFIX_UPDATE, o);
    }

    /**
     * 删除对象
     */
    public void remove(Object o) {
        getSqlMapClientTemplate()
            .delete(o.getClass().getName() + POSTFIX_DELETE, o);
    }

    /**
     * 根据ID删除对象
     */
    public <T> void removeById(Class<T> entityClass, Serializable id) {
        getSqlMapClientTemplate()
            .delete(entityClass.getName() + POSTFIX_DELETE_PRIAMARYKEY, id);
    }

    /**
     * map查询.
     *
     * @param map 包含各种属性的查询
     */
    public <T> List<T> find(Class<T> entityClass, Map map) {
        if (map == null) {
            return this.getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                + POSTFIX_SELECT, null);
        } else {
            map.put("findBy", "True");

            return this.getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                + POSTFIX_SELECTMAP, map);
        }
    }

    /**
     * sql 查询.
     *
     * @param sql 直接sql的语句(需要防止注入式攻击)
     */
    public <T> List<T> find(Class<T> entityClass, String sql) {
        Assert.hasText(sql);

        if (StringUtils.isEmpty(sql)) {
            return this.getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                + POSTFIX_SELECT, null);
        } else {
            return this.getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                + POSTFIX_SELECTSQL, sql);
        }
    }

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

        Map map = new HashMap();
        map.put(name, value);

        return find(entityClass, map);
    }

    /**
     * 根据属性名和属性值查询对象.
     *
     * @return 符合条件的唯一对象
     */
    public <T> T findUniqueBy(Class<T> entityClass, String name,
        Object value) {
        Assert.hasText(name);

        Map map = new HashMap();

        try {
            PropertyUtils.getProperty(entityClass.newInstance(), name);
            map.put(name, value);
            map.put("findUniqueBy", "True");

            return (T) getSqlMapClientTemplate()
                           .queryForObject(entityClass.getName()
                + POSTFIX_SELECTMAP, map);
        } catch (Exception e) {
            logger.error("Error when propertie on entity,"
                + e.getMessage(), e.getCause());

            return null;
        }
    }

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

        Map map = new HashMap();
        map.put(name, value);
        map.put("findLikeBy", "True");

        return getSqlMapClientTemplate()
                   .queryForList(entityClass.getName() + POSTFIX_SELECTMAP,
            map);
    }

    /**
     * 判断对象某些属性的值在数据库中不存在重复
     *
     * @param tableName 数据表名字
     * @param names         在POJO里不能重复的属性列表,以逗号分割 如"name,loginid,password" FIXME how about in different schema?
     */
    public boolean isNotUnique(Object entity, String tableName,
        String names) {
        try {
            String primarykey;
            Connection con = getSqlMapClient().getCurrentConnection();
            ResultSet dbMetaData = con.getMetaData()
                                      .getPrimaryKeys(con.getCatalog(),
                    null, tableName);
            dbMetaData.next();

            if (dbMetaData.getRow() > 0) {
                primarykey = dbMetaData.getString(4);

                if (names.indexOf(primarykey) > -1) {
                    return false;
                }
            } else {
                return true;
            }
        } catch (SQLException e) {
            logger.error(e.getMessage(), e);

            return false;
        }

        return false;
    }

    /**
     * 分页查询函数,使用PaginatedList.
     *
     * @param pageNo 页号,从1开始.
     * @return 含总记录数和当前页数据的Page对象.
     */
    public Page pagedQuery(Class entityClass, Object parameterObject,
        int pageNo, int pageSize) {
        Assert.isTrue(pageNo >= 1, "pageNo should start from 1");

        //计算总数
        Integer totalCount = (Integer) this.getSqlMapClientTemplate()
                                           .queryForObject(entityClass
                .getName() + 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,则返回所有数据,等同于getAll
        if (pageSize > 0) {
            // 计算页数
            totalPageCount = (totalCount / pageSize);
            totalPageCount += (((totalCount % pageSize) > 0) ? 1 : 0);

            // 计算skip数量
            if (totalPageCount > pageNo) {
                startIndex = (pageNo - 1) * pageSize;
            } else {
                startIndex = (totalPageCount - 1) * pageSize;
            }

            list = getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                    + POSTFIX_SELECT, parameterObject, startIndex, pageSize);
        } else {
            list = getSqlMapClientTemplate()
                       .queryForList(entityClass.getName()
                    + POSTFIX_SELECT, parameterObject);
        }

        return new Page(startIndex, totalCount, pageSize, list);
    }
}

⌨️ 快捷键说明

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