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();    }}

一个人行走,若是寂寞了,寻一座霓虹灯迷离闪烁,

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

相关文章:

你感兴趣的文章:

标签云: