Ibatis在运行期得到可执行到sql

  环境:oracle-11g ,ibatis-2.0 ,java-1.7

  最近因为有个需要是在程序中得到ibatis到sql字符串,即通过以下的ibatis配置得到sql语句

  <select id="queryColumn" parameterClass="map" resultClass="hashMap">
        SELECT column_name as id ,comments as name FROM user_col_comments
        WHERE table_name=#table_name#
        <isNotEmpty prepend="and" property="a0100">
            column_name=#a0100#
        </isNotEmpty>
    </select>

  我想通过这个得到形如以下的语句

    SELECT column_name as id ,comments as name FROM     user_col_comments    WHERE table_name='a01' and column_name='a0100'

  主要思路是通过lbatis的Sql类得到SqlTxt和SqlTag,然后自己拼接sql语句。下面是我的方法,其中ParamMap是我自定义的类继承了Map。

  根据版本不同可能具体的类也不同,以下只是提供一种思路

  直接贴代码:

public class IbatisUtil {
    /**
     *  @Title getSqlStr
     *  @Descript :根据xml中的id得到执行时的sql语句
     *  @date : 2017-08-30  15:07:01
     *  @param
     *  @return java.lang.String
     *  @throws
     *  @version V1.0
     */
    public String getSqlStr(SqlMapClient aqlMapClient, String sqlStatement, ParamMap map)map throws Exception {
        StringBuffer sqlBuffer=new StringBuffer();
        DynamicSql sql=getSql(aqlMapClient,sqlStatement);//得到sql
        List list=getChildren(sql);//得到children
        String str=getChlidrenStr(list,map);
        sqlBuffer.append(str);
        return sqlBuffer.toString();
    }
    /**
     *  @Title getSql
     *  @Descript :得到动态的sql
     *  @date : 2017-08-30  15:07:45
     *  @param
     *  @return com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql
     *  @throws
     *  @version V1.0
     */
    private DynamicSql getSql(SqlMapClient aqlMapClient,String sqlStatement) {
        return (DynamicSql)(((SqlMapClientImpl)aqlMapClient).getDelegate().getMappedStatement(sqlStatement).getSql());
    }
    /**
     *  @Title getChildren
     *  @Descript :得到对象的私有属性childen的值 该对象只能是 DynamicSql和SqlTag否则返回null
     *  @date : 2017-08-30  15:13:08
     *  @param
     *  @return java.util.List
     *  @throws
     *  @version V1.0
     */
    private List getChildren(Object obj) throws NoSuchFieldException, IllegalAccessException {
        if(!(obj instanceof DynamicSql || obj instanceof SqlTag))
            return null;
        Class classs=obj.getClass();
        Field field=classs.getDeclaredField("children");
        field.setAccessible(true);
        return (List)field.get(obj);
    }
    private String getChlidrenStr(List list,ParamMap map) throws NoSuchFieldException, IllegalAccessException {
        StringBuffer sb=new StringBuffer();
        for(Object obj :list){
            if(obj instanceof SqlText){
                sb.append(getSqlTextStr((SqlText)obj,map));
            }else if(obj instanceof SqlTag){
                sb.append(getSqlTagStr((SqlTag)obj,map));
            }
        }
        return sb.toString();
    }
    /**
     *  @Title getSqlTextStr
     *  @Descript :解析SqlText
     *  @date : 2017-08-30  15:18:38
     *  @param
     *  @return java.lang.String
     *  @throws
     *  @version V1.0
     */
    private String getSqlTextStr(SqlText sqlText, ParamMap map){
        String sqlTemp;
        ParameterMapping[] parameterMappings = sqlText.getParameterMappings();
        sqlTemp = sqlText.getText().toString();
        if (parameterMappings != null && parameterMappings.length > 0) {
            Object obj;
            int i;
            for (ParameterMapping param : parameterMappings) {
                i=param.getJdbcType();
                switch (i){
                    case 0://为定义
                        obj="'"+map.getAsString(param.getPropertyName())+"'";
                        break;
                    case 4://INTEGER
                        obj=map.getAsInteger(param.getPropertyName());
                        break;
                    case 12://VARCHAR
                        obj="'"+map.getAsString(param.getPropertyName())+"'";
                        break;
                    case 93://TIMESTAMP
                        obj="to_date('yyyy-MM-dd','"+map.getAsString(param.getPropertyName())+"')";
                        break;
                    default:obj="";
                }
                if(ValidateUtil.isEmpty(obj))
                    obj="";
                sqlTemp = sqlTemp.replaceFirst("\\?",obj.toString());
            }
        }
        return sqlTemp;
    }
    /**
     *  @Title getSqlTagStr
     *  @Descript :解析SqlTag
     *  @date : 2017-08-30  15:24:29
     *  @param
     *  @return java.lang.String
     *  @throws
     *  @version V1.0
     */
    private String getSqlTagStr(SqlTag sqlTag,ParamMap map) throws NoSuchFieldException, IllegalAccessException {
        StringBuffer sb=new StringBuffer();
        List list=getChildren(sqlTag);
        String tagName=sqlTag.getName();
        switch (tagName){
            case "isNotEmpty":
                if(ValidateUtil.isEmpty(map.getAsString(sqlTag.getPropertyAttr())))
                    return "";
                if(ValidateUtil.isNotEmpty(list)){
                    if(ValidateUtil.isNotEmpty(sqlTag.getPrependAttr()))
                        sb.append(" "+sqlTag.getPrependAttr() +" ");
                    sb.append(getChlidrenStr(list,map));
                }
                break;
            case "isEmpty":
                if(ValidateUtil.isNotEmpty(map.getAsString(sqlTag.getPropertyAttr())))
                    return "";
                if(ValidateUtil.isNotEmpty(list)){
                    if(ValidateUtil.isNotEmpty(sqlTag.getPrependAttr()))
                        sb.append(" "+sqlTag.getPrependAttr() +" ");
                    sb.append(getChlidrenStr(list,map));
                }
                break;
        }
        return sb.toString();
    }
}

 

posted @ 2017-09-01 10:14  many-object  阅读(572)  评论(2编辑  收藏  举报