`
yuanhuiwu
  • 浏览: 87130 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Ibatis 3 获取运行期sql和参数

阅读更多
跟踪ibatis 3 代码,找到获取运行期的动态sql和参数

在其它框架的dao实现,如hibernate或jdbc,可以把sql(hql)集中交给ibatis处理。基于动态sql,使得你的sql(hql)不再在代码中使用String拼接,且获得ibatis动态支持.


用于保存结果
public class IbatisSql {
	private String sql;//运行期的sql,带?
	private Object[] parameters;//;//运行期的参数,与?相匹配
	private Class resultClass;//<select id="XXX" resultType="ZZZ">中的resultType

	public Class getResultClass() {
		return resultClass;
	}

	public void setResultClass(Class resultClass) {
		this.resultClass = resultClass;
	}

	public void setSql(String sql) {
		this.sql = sql;
	}

	public String getSql() {
		return sql;
	}

	public void setParameters(Object[] parameters) {
		this.parameters = parameters;
	}

	public Object[] getParameters() {
		return parameters;
	}

}



获取
	/**
	 * 
	 * @param id xml 中sql的id ,如 <select id="XXX">中的"XXX"
	 * @param parameterObject 传给这条sql的参数
	 * @return
	 */
	public IbatisSql getIbatisSql(String id, Object parameterObject) {
		IbatisSql ibatisSql = new IbatisSql();

		SqlSessionFactory sqlSessionFactory = ...//参考官方例子
		MappedStatement ms = sqlSessionFactory.getConfiguration().getMappedStatement(id);
		BoundSql boundSql = ms.getBoundSql(parameterObject);
		
		List<ResultMap> ResultMaps=ms.getResultMaps();
		if(ResultMaps!=null&&ResultMaps.size()>0){
			ResultMap ResultMap = ms.getResultMaps().get(0);
			ibatisSql.setResultClass(ResultMap.getType());
		}
		
		
		ibatisSql.setSql(boundSql.getSql());

		List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
	    if (parameterMappings != null) {
			Object[] parameterArray = new Object[parameterMappings.size()];
	        MetaObject metaObject = parameterObject == null ? null : MetaObject.forObject(parameterObject);
	        for (int i = 0; i < parameterMappings.size(); i++) {
	          ParameterMapping parameterMapping = parameterMappings.get(i);
	          if (parameterMapping.getMode() != ParameterMode.OUT) {
	            Object value;
	            String propertyName = parameterMapping.getProperty();
	            PropertyTokenizer prop = new PropertyTokenizer(propertyName);
	            if (parameterObject == null) {
	              value = null;
	            } else if (ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameterObject.getClass())) {
	              value = parameterObject;
	            } else if (boundSql.hasAdditionalParameter(propertyName)) {
	              value = boundSql.getAdditionalParameter(propertyName);
	            } else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)
	                && boundSql.hasAdditionalParameter(prop.getName())) {
	              value = boundSql.getAdditionalParameter(prop.getName());
	              if (value != null) {
	                value = MetaObject.forObject(value).getValue(propertyName.substring(prop.getName().length()));
	              }
	            } else {
	              value = metaObject == null ? null : metaObject.getValue(propertyName);
	            }
	            parameterArray[i] = value;
	          }
	        }
			ibatisSql.setParameters(parameterArray);
	    }

		return ibatisSql;
	}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics