ibatis底层实现

public abstract class IbatisDAO<T extends Serializable, PK extends Serializable> extends SqlMapClientDaoSupport

        implements IIbatisDAO<T, PK>

/*
 * 工 程 名:
 * 描       述:  通过ibatis底层实现具体的操作,抽象类
 */

package com.xxx.dhm.xxx.base.dao.ibatis;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.xxx.dhm.xxx.base.dao.IIbatisDAO;
import com.xx.dhm.portalMS.base.executor.LimitSqlExecutor;
import com.xx.dhm.portalMS.common.Constants;
import com.xxx.dhm.portalMS.common.util.PageList;
import com.xxx.dhm.portalMS.common.util.ReflectUtil;
import com.xxxx.dhm.portalMS.exception.PortalMSException;
import com.ibatis.sqlmap.engine.execution.SqlExecutor;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;

/**
 *
 * IIbatisDAO 类的抽象实现, 部分实现公共的增删改查功能,子类可以继续扩展该类的方法
 *
 */
public abstract class IbatisDAO<T extends Serializable, PK extends Serializable> extends SqlMapClientDaoSupport
        implements IIbatisDAO<T, PK>
{
    /**
     * 序列化的ID
     */
    private static final long serialVersionUID = 7489415169618169154L;

    /**
     * ibatis中sqlmap命名空间
     */
    private String nameSpace = "";

    /**
     * 实体类
     */
    private Class<T> entityClass;

    /**
     * SQL语句的操作对象
     */
    protected SqlExecutor sqlExecutor;

    /**
     * 对命名空间进行了赋值,可以通过命名空间执行具体的sqlMap对应的语句 <默认构造函数>
     */
    @SuppressWarnings("unchecked")
    public IbatisDAO()
    {
        this.entityClass = null;
        Class c = getClass();
        // 得到具体的子类类型
        Type t = c.getGenericSuperclass();
        if (t instanceof ParameterizedType)
        {
            Type[] p = ((ParameterizedType) t).getActualTypeArguments();
            this.entityClass = (Class<T>) p[0];
            // 得到命名空间,用于向sqlMap传入
            nameSpace = entityClass.getSimpleName() + ".";
        }
    }

    /**
     * 对SQL语句操作对象进行赋值
     *
     * @param sqlExecutor
     */
    public void setSqlExecutor(SqlExecutor sqlExecutor)
    {
        this.sqlExecutor = sqlExecutor;
    }

    /**
     * 对是否支持物理分页进行赋值 spring注入方法,注入具体的sqlExecutor是否支持物理分页
     *
     * @param enableLimit
     *            [是否支持物理分页,true-支持,false-不支持]
     * @see LimitSqlExecutor#setEnableLimit(boolean)
     */
    public void setEnableLimit(boolean enableLimit)
    {
        if (sqlExecutor instanceof LimitSqlExecutor)
        {
            ((LimitSqlExecutor) sqlExecutor).setEnableLimit(enableLimit);
        }
    }

    /**
     * 初始化sqlExcutor类,在spring初始化时会加载该方法
     * 因为ibatis本身不支持物理分页,用自己定义的sqlExecutor来替代默认的sqlExecutor
     *
     * @exception throws [Exception] [向上层直接抛出]
     * @see SqlMapExecutorDelegate
     */
    public void initialize() throws Exception
    {
        if (sqlExecutor != null)
        {
            SqlMapClientImpl client = (SqlMapClientImpl) getSqlMapClient();
            SqlMapExecutorDelegate delgate = client.getDelegate();
            // 由于SqlMapExecutorDelegate没有setSqlExecutor方法,利用反射强行对sqlExecutor赋值
            ReflectUtil.setFieldValue(delgate, "sqlExecutor", SqlExecutor.class, sqlExecutor);
        }
    }

    /**
     * 按主键删除实体对象
     *
     * @param id
     *            泛型主键ID
     * @throws PortalMSException
     */
    public void deleteByKey(PK id) throws PortalMSException
    {
        try
        {
            getSqlMapClientTemplate().delete(nameSpace + SQLID_DELETE, id);
        }
        catch (Exception ex)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), ex);
        }
    }

    @SuppressWarnings("unchecked")
    /**
     * 查找符合条件的所有对象
     * @return List,List中存放泛型的实体对象
     */
    public List<T> findAll() throws PortalMSException
    {
        try
        {
            return getSqlMapClientTemplate().queryForList(nameSpace + SQLID_FINDALL);
        }
        catch (Exception ex)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), ex);
        }
    }

    @SuppressWarnings("unchecked")
    /**
     * 按主键查找实体对象
     * @param id 泛型主键
     * @return 泛型实体,实现序列化接口的任何类型
     * @throws portalMSException
     */
    public T findById(PK id) throws PortalMSException
    {
        T result = null;
        try
        {
            result = (T) this.getSqlMapClient().queryForObject(nameSpace + SQLID_FINDBYID, id);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), e);
        }
        return result;

    }

    /**
     * 保存实体对象,数据库的insert操作
     *
     * @param entity
     *            参数类型:泛型,任何实现序列化的类
     * @throws PortalMSException
     *             iepg管理系统统一抛出的异常
     */
    public void saveEntity(T entity) throws PortalMSException
    {
        try
        {
            this.getSqlMapClient().insert(nameSpace + SQLID_INSERT, entity);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), e);
        }
    }

    /**
     * 更新实体对象,数据库的update操作
     *
     * @param entity
     *            参数类型:泛型,任何实现序列化的类
     * @throws PortalMSException
     *             iepg管理系统统一抛出的异常
     */
    public void updateEntity(T entity) throws PortalMSException
    {
        try
        {
            this.getSqlMapClient().update(nameSpace + SQLID_UPDATE, entity);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), e);
        }
    }

    /**
     * 按实体对象的主键ID批量删除实体 空方法,子类需要时自己去实现
     *
     * @param list
     *            主键的ID列表,列表内存放泛型,任何实现序列化接口的类
     */
    public void batchDelete(final List<PK> list) throws PortalMSException
    {

    }

    /**
     * 按实体对象的主键ID批量删除实体 空方法,子类需要时自己去实现
     *
     * @param args
     *            主键的ID列表,列表内存放泛型,任何实现序列化接口的类
     */
    public void batchDelete(final PK[] args) throws PortalMSException
    {

    }

    /**
     * 批量插入实体,数据库insert操作 空方法,子类需要使用时自己去实现
     *
     * @param list
     *            实体对象列表,列表内存放泛型,任何实现序列化接口的类
     */
    public void batchInsert(final List<T> list) throws PortalMSException
    {

    }

    /**
     * 批量更新实体,数据库update操作 空方法,子类需要使用时自己去实现
     *
     * @param list
     *            实体对象列表,列表内存放泛型,任何实现序列化接口的类
     */
    public void batchUpdate(final List<T> list) throws PortalMSException
    {

    }

   
    /**
     * 按查询条件分页查询记录数
     * @param map 查询的参数,封装为map或一个实体对象
     * @param currPage 当前的页码
     * @param pageSize 每页显示的记录数
     * @return List 实体对象的列表
     * @throws IEMPMException
     */
    @SuppressWarnings("unchecked")
    public List<T> findByCriteria(Object map, String sqlMap, int currPage, int pageSize) throws PortalMSException
    {

        // 举例:当前页为第2页,每页显示10条,则开始记录数为11,结束记录数为20
        // 得到记录的开始数
        int skipResults = (currPage - 1) * pageSize + 1;
        // 得到记录的结束数
        int maxResults = currPage * pageSize;
        Map<String, Object> obj = null;
        int totalRows = 0;
        // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
        if (map instanceof Map)
        {
            obj = (Map) map;
        }
        else
        {
            obj = ReflectUtil.getObjectAsMap(map);
        }
        // obj.put("siteID", SessionUtil.getLocalSiteID());
        try
        {
            totalRows = this.getRowCount(obj, sqlMap);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), e);
        }

        // 带分页参数的列表
        PageList<T> pageList = new PageList<T>(currPage, pageSize, totalRows);

        // 支持物理分页页码从1开始
        try
        {
            List queryResult = this.getSqlMapClientTemplate().queryForList(sqlMap, obj, skipResults, maxResults);
            if (queryResult != null)
            {
                pageList.addAll(queryResult);
            }
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), e);
        }
        return pageList;

    }

    @SuppressWarnings("unchecked")
    /**
     * 按查询条件返回所有记录,不带分页
     * @param map 查询的参数,封装为map或一个实体对象
     * @return List 实体对象的列表
     */
    public List<T> findByCriteria(Object map) throws PortalMSException
    {
        Map<String, Object> obj = null;
        // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
        if (map instanceof Map)
        {
            obj = (Map) map;
        }
        else
        {
            obj = ReflectUtil.getObjectAsMap(map);
        }
        // obj.put("siteID", SessionUtil.getLocalSiteID());
        List<T> resultList = null;
        try
        {
            resultList = getSqlMapClientTemplate().queryForList(nameSpace + SQLID_FINDALL, obj);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), e);
        }
        return resultList;
    }

    /**
     * 按查询条件得到该SQL语句的总数量
     *
     * @param map
     *            查询条件
     * @return Integer 记录总数
     * @throws DataAccessException
     *             数据访问异常
     */
    @SuppressWarnings("unchecked")
    public Integer getRowCount(Object map) throws PortalMSException
    {
        try
        {
            Map<String, Object> obj = null;
            // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
            if (map instanceof Map)
            {
                obj = (Map) map;
            }
            else
            {
                obj = ReflectUtil.getObjectAsMap(map);
            }
            // obj.put("siteID", SessionUtil.getLocalSiteID());
            return (Integer) this.getSqlMapClientTemplate().queryForObject(nameSpace + SQLID_ROWCOUNT, obj);
        }
        catch (Exception ex)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), ex);
        }

    }

    /**
     * 按查询条件得到该SQL语句的总数量
     *
     * @param map
     *            查询条件
     *
     * @param sqlMap
     *            SQL查询语句
     *  
     * @return Integer 记录总数
     * @throws DataAccessException
     *             数据访问异常
     */
    @SuppressWarnings("unchecked")
    public Integer getRowCount(Object map, String sqlMap) throws PortalMSException
    {
        try
        {
            Map<String, Object> obj = null;
            // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
            if (map instanceof Map)
            {
                obj = (Map) map;
            }
            else
            {
                obj = ReflectUtil.getObjectAsMap(map);
            }
            // obj.put("siteID", SessionUtil.getLocalSiteID());
            return (Integer) this.getSqlMapClientTemplate().queryForObject(sqlMap + "." + SQLID_ROWCOUNT, obj);
        }
        catch (Exception ex)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), ex);
        }

    }

    /**
     * 得到查询结果集的行数,此参数用于分页
     *
     * @return Integer记录集的行数
     * @throws PortalMSException
     */
    public Integer getRowCount() throws PortalMSException
    {
        try
        {
            return (Integer) this.getSqlMapClientTemplate().queryForObject(nameSpace + SQLID_ROWCOUNT);
        }
        catch (Exception ex)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), ex);
        }

    }
    @SuppressWarnings("unchecked")
    /**
     * 按查询条件分页查询记录数
     * @param map 查询的参数,封装为map或一个实体对象
     * @param currPage 当前的页码
     * @param pageSize 每页显示的记录数
     * @return List 实体对象的列表
     * @throws IEMPMException
     */
    public List<T> findByCriteria(Object map, int currPage, int pageSize) throws PortalMSException
    {
        // 举例:当前页为第2页,每页显示10条,则开始记录数为11,结束记录数为20
        // 得到记录的开始数
        int skipResults = (currPage - 1) * pageSize + 1;
        // 得到记录的结束数
        int maxResults = currPage * pageSize;
        Map<String, Object> obj = null;
        int totalRows = 0;
        // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
        if (map instanceof Map)
        {
            obj = (Map) map;
        }
        else
        {
            obj = ReflectUtil.getObjectAsMap(map);
        }
        // obj.put("siteID", SessionUtil.getLocalSiteID());
        try
        {
            totalRows = this.getRowCount(obj);
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE.getLongValue(), e);
        }
        // 带分页参数的列表
        PageList<T> pageList = new PageList<T>(currPage, pageSize, totalRows);
        // 支持物理分页页码从1开始
        try
        {
            List queryResult = this.getSqlMapClientTemplate().queryForList(nameSpace + SQLID_FINDALL, obj, skipResults,
                    maxResults);
            if (queryResult != null)
            {
                pageList.addAll(queryResult);
            }
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_ACCESS_DATABASE.getLongValue(), e);
        }
        return pageList;

    }

    
    /**
     * * 按查询条件分页查询记录数
     * @param map 查询的参数,封装为map或一个实体对象
     * @param currPage 当前的页码
     * @param pageSize 每页显示的记录数
     * @return List 实体对象的列表
     * @throws IEMPMException
     */
    @SuppressWarnings("unchecked")
    public PageList<T> findByCriteria(Object map, String sqlname,
            String countSqlName, int currPage, int pageSize)
            throws PortalMSException
    {
        // 举例:当前页为第2页,每页显示10条,则开始记录数为11,结束记录数为20
        // 取得配置文件是MySQL还是Oracle数据库
        int skipResults = (currPage - 1) * pageSize + 1;
        // 得到记录的结束数
        int maxResults = currPage * pageSize;
        Map<String, Object> obj = null;
        int totalRows = 0;
        // 判断是否map类型,还是普通的JavaBean。普通的JavaBean则转换成Map类型
        if (map instanceof Map)
        {
            obj = (Map) map;
        }
        else
        {
            obj = ReflectUtil.getObjectAsMap(map);
        }
        // obj.put("siteID", SessionUtil.getLocalSiteID());
        PageList<T> pageList;
        try
        {
            totalRows = (Integer) this.getSqlMapClientTemplate().queryForObject(countSqlName, obj);
            // 带分页参数的列表
            pageList = new PageList<T>(currPage, pageSize, totalRows);
            // 支持物理分页页码从1开始
            List queryResult = this.getSqlMapClientTemplate().queryForList(
                    sqlname, obj, skipResults, maxResults);
            if (queryResult != null)
            {
                pageList.addAll(queryResult);
            }
        }
        catch (Exception e)
        {
            throw new PortalMSException(Constants.ERROR_CODE_OPERATOR_DATABASE
                    .getStringValue(), e);
        }
        return pageList;
        

    }
}




public abstract interface IIbatisDAO<T extends Serializable, PK extends Serializable> extends IBaseDAO<T, PK>,
        Serializable

/*
 * 描       述:  泛型Ibatis顶层接口,Ibatis公共接口
 */

package com.xxx.dhm.portalMS.base.dao;

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

import org.springframework.dao.DataAccessException;

import com.xxxx.dhm.xxx.common.util.PageList;
import com.xxx.dhm.xxx.exception.PortalMSException;

/**
 *
 * ibatis的DAO方案 针对ibatis的特殊性定义的接口,继承自IBaseDAO
 */
public abstract interface IIbatisDAO<T extends Serializable, PK extends Serializable> extends IBaseDAO<T, PK>,
        Serializable
{
    /**
     * IBATIS配置文件中定义文件中对应的sqlid,插入操作
     */
    public static final String SQLID_INSERT = "insert";

    /**
     * IBATIS配置文件中定义文件中对应的sqlid,按主键删除实体操作
     */
    public static final String SQLID_DELETE = "deleteByPrimaryKey";

    /**
     * IBATIS配置文件中定义文件中对应的sqlid,按主键的更新操作
     */
    public static final String SQLID_UPDATE = "updateById";

    /**
     * IBATIS配置文件中定义文件中对应的sqlid,查找所有实体操作
     */
    public static final String SQLID_FINDALL = "findAll";

    /**
     * IBATIS配置文件中定义文件中对应的sqlid,按主键ID查找实体对象
     */
    public static final String SQLID_FINDBYID = "findById";

    /**
     * IBATIS配置文件中定义文件中对应的sqlid,查询记录集数
     */
    public static final String SQLID_ROWCOUNT = "rowCount";

    /**
     * 批量插入实体 数据库的insert批量操作,接口方法,由具体实现类实现
     *
     * @param list
     *            参数类型:List<T>列表中存放泛型,任何实现序列化的实体类
     * @exception throws [portalMSException] [当批量插入失败时抛出此异常]
     */
    public abstract void batchInsert(final List<T> list) throws PortalMSException;

    /**
     * 批量修改实体 数据库的update批量操作,接口方法,由具体实现类实现
     *
     * @param list
     *            参数类型:[List<T>]列表中存放泛型,任何实现序列化的实体类
     * @exception throws [portalMSException] [当批量更新失败时抛出此异常]
     */
    public abstract void batchUpdate(final List<T> list) throws PortalMSException;

    /**
     * 批量删除实体 数据库的delete批量操作,接口方法,由具体实现类实现
     *
     * @param list
     *            [参数类型:List<T>]列表中存放泛型,任何实现序列化的实体类
     * @exception throws [portalMSException] [当批量删除失败时抛出此异常]
     */
    public abstract void batchDelete(final List<PK> list) throws PortalMSException;

    /**
     * 批量删除实体 数据库的delete批量操作,接口方法,由具体实现类实现
     *
     * @param args
     *            [参数类型:PK[]列表中存放泛型,任何实现序列化的实体类
     * @exception throws [portalMSException] [当批量删除失败时抛出此异常]
     */

    public abstract void batchDelete(final PK[] args) throws PortalMSException;

    /**
     * 带分页条件查找记录 使用当前页和每页大小获得实体的列表
     *
     * @param map
     *            查询的参数列表
     * @param currPage
     *            当前页码,整型
     * @param pageSize
     *            每页记录数,整型
     * @return List<T> [返回实体的列表,实体类型为泛型,任何实现序列化的实体类]
     * @exception throws [portalMSException] [当操作中发生数据库访问异常抛出]
     */
    public List<T> findByCriteria(Object map, int currPage, int pageSize) throws PortalMSException;

    /**
     * 带分页条件查找记录 使用当前页和每页大小获得实体的列表
     *
     * @param map
     *            查询的参数列表
     * @param currPage
     *            当前页码,整型
     * @param pageSize
     *            每页记录数,整型
     * @return List<T> [返回实体的列表,实体类型为泛型,任何实现序列化的实体类]
     * @exception throws [portalMSException] [当操作中发生数据库访问异常抛出]
     */
    public List<T> findByCriteria(Object map, String sqlMap, int currPage, int pageSize) throws PortalMSException;

    /**
     * 得到满足条件的记录数 根据查询条件得到满足条件的记录数
     *
     * @param map
     *            查询参数
     * @return Integer [整型包装类]
     * @exception throws [DataAccessException] [当操作中发生数据库访问异常抛出]
     */
    public Integer getRowCount(Object map) throws PortalMSException;

    /**
     * 按查询条件得到该SQL语句的总数量
     *
     * @param map
     *            查询条件
     *
     * @param sqlMap
     *            SQL查询语句
     *  
     * @return Integer 记录总数
     * @throws DataAccessException
     *             数据访问异常
     */
    public Integer getRowCount(Object map, String sqlMap) throws PortalMSException;

    /**
     * 根据查询条件得到数据库中所有满足条件的记录实体 此功能不带分页功能
     *
     * @param map
     *            查询条件的参数
     * @return List<T> [泛型的列表,列表中存放任何实现序列化的实体类]
     * @exception throws [portalMSException] [当ibatis访问数据库出现异常时抛出]
     */
    public List<T> findByCriteria(Object map) throws PortalMSException;
    
    
    /**
     * 按查询条件分页查询记录数
     * @param map 查询的参数,封装为map或一个实体对象
     * @param currPage 当前的页码
     * @param pageSize 每页显示的记录数
     * @return List 实体对象的列表
     * @throws IEMPMException
     */
    public PageList<T> findByCriteria(Object map, String sqlname,
            String countSqlName, int currPage, int pageSize)
            throws PortalMSException;

}


public interface IBaseDAO<T extends Serializable, PK extends Serializable>


/*
  * 描       述:  泛形DAO顶层接口,Hibernate,Ibatis公共接口
 */
package com.xxx.dhm.xxx.base.dao;

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

import com.xxx.dhm.xxx.exception.PortalMSException;

/**
 *
 * 泛形DAO顶层接口,Hibernate,Ibatis公共接口
 * 抽象出了Hibernate和Ibatis公共的方法
 */

public interface IBaseDAO<T extends Serializable, PK extends Serializable>
{

    /**
     * 通过主键ID查找对应的实体
     * 接口方法,子类必须实现该方法
     * @param id [泛型,主键ID编号]
     * @return T [泛型,返回一个具体的实体]
     * @exception throws [portalMSException] [当数据库操作异常时将抛出该异常]
     */
    public abstract T findById(PK id) throws PortalMSException;

    /**
     * 查找所有实体
     * 接口方法,用于查找所有实体,子类必须实现该方法
     * @return List<T> [返回所有符合条件的实体]
     * @exception throws [portalMSException] [当数据库操作异常时将抛出该异常]
     */
    public abstract List<T> findAll() throws PortalMSException;

    /**
     * 得到总行数
     * 接口方法
     * @return Integer [返回记录的总行数]
     * @exception throws [portalMSException] [当数据库访问失败时抛出的自定义异常]
     */
    public abstract Integer getRowCount() throws PortalMSException;

    /**
     * 更新单个实体数据库update操作
     * 根据实体的参数更新数据库中对应的记录
     * @param entity 实体对象,泛型,任何实现序列化的类
     * @exception throws [portalMSException] [当数据库操作发生失败时抛出该异常]
     */
    public abstract void updateEntity(T entity) throws PortalMSException;

    /**
     * 保存单个实体数据库insert操作
     * 根据实体内容插入到数据库
     * @param entity 实体对象,泛型,任何实现序列化的类
     * @exception throws [portalMSException] [当数据库操作发生失败时抛出该异常]
     */
    public abstract void saveEntity(T entity) throws PortalMSException;

    /**
     * 按主键编号删除数据库对应单个实体
     * 对应数据库delete操作
     * @param id 主键ID
     * @exception throws [portalMSException] [当数据库操作失败时抛出该异常]
     */
    public abstract void deleteByKey(PK id) throws PortalMSException;

}


/*
  * 描       述:  IEPG管理系统的自定义异常
 */
package com.xxx.dhm.xxx.exception;

import org.apache.log4j.Logger;


/**
 *
 * iEPG管理系统自定义异常
 * 当系统发生异常时统一包装抛出

 */
public class PortalMSException extends Exception
{
    
    /**
     * 序列化ID
     */
    private static final long serialVersionUID = 1772426579115321126L;
    
    /**
     * 错误编号
     */
    private long errorCode = 0;
    
    /**
     * 日志对象
     */
    private static Logger logger = Logger.getLogger(PortalMSException.class);
    
    /**
     * <默认构造函数>
     */
    public PortalMSException()
    {
        super();
    }
    
    /**
     * 传入错误信息构造异常
     * @param message 异常提示信息
     */
    public PortalMSException(String message)
    {
        super(message);
    }
    
    /**
     * 传入异常构造异常
     * @param cause 异常
     */
    public PortalMSException(Throwable cause)
    {
        super(cause);
        // 向NMS告警
        sendDbExceptionTrap(errorCode,cause);
    }
    
    /**
     * 传入提示信息和异常内容
     * @param message 异常提示信息
     * @param cause 异常
     */
    public PortalMSException(String message, Throwable cause)
    {
        super(message, cause);
        // 向NMS告警
        sendDbExceptionTrap(errorCode,cause);
    }
    
    /**
     * 获得错误编号
     * @return long [错误码]
     */
    public long getErrorCode()
    {
        return errorCode;
    }
    
    /**
     * 传入错误编号构造异常
     * @param errorCode 异常错误代码
     */
    public PortalMSException(long errorCode)
    {
        super();
        this.errorCode = errorCode;
    }
    
    /**
     * 传入错误编号和消息信息构造异常
     * @param errorCode 异常代码
     * @param message 异常提示信息
     */
    public PortalMSException(long errorCode, String message)
    {
        super(message);
        this.errorCode = errorCode;
    }
    
    /**
     * 传入错误编号和异常内容构造异常
     * @param errorCode 错误代码
     * @param cause 异常
     */
    public PortalMSException(long errorCode, Throwable cause)
    {
        super(cause);
        this.errorCode = errorCode;
        // 向NMS告警
        sendDbExceptionTrap(errorCode,cause);
    }
    
    /**
     * 传入错误编号,消息信息和异常内容构造异常
     * @param errorCode 异常错误代码
     * @param message 异常提示信息
     * @param cause 异常本身
     */
    public PortalMSException(long errorCode, String message, Throwable cause)
    {
        super(message, cause);
        this.errorCode = errorCode;
        // 向NMS告警
        sendDbExceptionTrap(errorCode,cause);
    }
    
    /**
     * 发生数据库异常时,向NMS发送告警信息
     * @param cause 异常信息
     *
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    private void sendDbExceptionTrap(long errorCode,Throwable cause)
    {
        if (cause == null)
        {
            return;
        }
        String errMsg = cause.getMessage();
        if (errMsg != null && errMsg.contains("ORA-"))
        {
            logger.error("Abnormal DB ,To NMS warning。");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值