环境: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(); }}
一个人行走,若是寂寞了,寻一座霓虹灯迷离闪烁,