获取mybatis运行时sql

public class MyBatisSqlUtils {
	@Resource
	private SqlSessionFactory sessionFactory;
	private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
	private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();

	/**
	 * 运行期获取MyBatis执行的SQL及参数 
	 * 
	 * @param id Mapper xml 文件里的select Id
	 * @param parameterMap 参数 
	 * @param sqlSessionFactory
	 * @return MyBatisSql
	 */
	@SuppressWarnings("rawtypes")
	public MyBatisSql getMyBatisSql(String id, Map<String, Object> parameterMap) {
		MyBatisSql ibatisSql = new MyBatisSql();
		MappedStatement ms = sessionFactory.getConfiguration().getMappedStatement(id);
		BoundSql boundSql = ms.getBoundSql(parameterMap);
		ibatisSql.setSql(boundSql.getSql());
		List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
		if (parameterMappings != null) {
			Object[] parameterArray = new Object[parameterMappings.size()];
			ParameterMapping parameterMapping = null;
			Object value = null;
			Object parameterObject = null;
			MetaObject metaObject = null;
			PropertyTokenizer prop = null;
			String propertyName = null;
			String[] names = null;
			for (int i = 0; i < parameterMappings.size(); i++) {
				parameterMapping = parameterMappings.get(i);
				if (parameterMapping.getMode() != ParameterMode.OUT) {
					propertyName = parameterMapping.getProperty();
					names = propertyName.split("\\.");
					if (propertyName.indexOf(".") != -1 && names.length == 2) {
						parameterObject = parameterMap.get(names[0]);
						propertyName = names[1];
					} else if (propertyName.indexOf(".") != -1 && names.length == 3) {
						parameterObject = parameterMap.get(names[0]); // map
						if (parameterObject instanceof Map) {
							parameterObject = ((Map) parameterObject).get(names[1]);
						}
						propertyName = names[2];
					} else {
						parameterObject = parameterMap.get(propertyName);
					}
					metaObject = parameterMap == null ? null : MetaObject.forObject(parameterObject, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
					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, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY).getValue(propertyName.substring(prop.getName().length()));
						}
					} else {
						value = metaObject == null ? null : metaObject.getValue(propertyName);
					}
					parameterArray[i] = value;
				}
			}
			ibatisSql.setParameters(parameterArray);
		}
		return ibatisSql;
	}

	public void setSessionFactory(SqlSessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
}


类:

public class MyBatisSql {
	/** * 运行期 sql */
	private String sql;
	/** * 参数 数组 */
	private Object[] parameters;

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

	/**
	 * @return 无参数值sql【方便测试】
	 */
	public String getSql() {
		return sql;
	}
	/**
	 * @return 有参数值sql【方便测试】
	 */
	public String getSql1() {
		return coventToSql(1);
	}
	/**
	 * @return 有参数格式优化sql【方便保存】
	 */
	public String getSql2() {
		return coventToSql(2);
	}

	private String coventToSql(int type) {
		if (parameters == null || sql == null) {
			return "";
		}
		List<Object> parametersArray = Arrays.asList(parameters);
		List<Object> list = new ArrayList<Object>(parametersArray);
		while (sql.indexOf("?") != -1 && list.size() > 0
				&& parameters.length > 0) {
			sql = sql.replaceFirst("\\?", "'" + list.get(0).toString() + "'");
			list.remove(0);
		}
		if (type == 2) {
			sql = sql.replaceAll("\\s|\t|\r|\n+", "\t");
			return sql.replaceAll("\t+", " ");
		}
		return sql.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");
	}

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

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

}


转载于:https://my.oschina.net/u/601483/blog/313841

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值