mybatis获取运行时最终执行SQL
来源:互联网 发布:windowns8办公软件下载 编辑:程序博客网 时间:2024/05/04 05:02
废话不多说上代码,我的版本是mybatis-3.2.8
package com.jujin.util;import java.util.List;import java.util.Map;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.SystemMetaObject;import org.apache.ibatis.reflection.property.PropertyTokenizer;import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;import org.apache.ibatis.session.SqlSessionFactory;public class MyBatisSqlUtils { /** * 运行期获取MyBatis执行的SQL及参数 * @param id Mapper xml 文件里的select Id * @param parameterMap 参数 * @param sqlSessionFactory * @return */ public static MyBatisSql getMyBatisSql(String id, Map<String,Object> parameterMap,SqlSessionFactory sqlSessionFactory) { MyBatisSql ibatisSql = new MyBatisSql(); MappedStatement ms = sqlSessionFactory.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, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.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,SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.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; }}
package com.jujin.util;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class MyBatisSql { /** * 运行期 sql */ private String sql; /** * 参数 数组 */ private Object[] parameters; 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; } @Override public String toString() { 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); } return sql.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n"); }}
测试代码
public String getMyBatisSql(String id, Map<String,Object> parameterMap) { SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory(); MyBatisSql sql = MyBatisSqlUtils.getMyBatisSql(id, parameterMap, sqlSessionFactory); return sql.toString(); }
1 0
- mybatis获取运行时最终执行SQL
- [MyBatis]获取数据库连接、批量执行SQL语句
- [MyBatis]获取数据库连接、批量执行SQL语句
- 在运行时获取ibatIS执行的sql
- mybatis打印SQL日志最终解决方案
- 应用程序获取Mybatis中配置的执行SQL
- mybatis执行sql脚本
- Mybatis 直接执行SQL
- MyBatis执行sql原理
- MyBatis 执行动态 SQL
- MyBatis 执行动态 SQL
- mybatis执行sql语句
- 获取mybatis可执行sql
- Mybatis mapper获取sql
- 得到PrepareStatement最终执行的sql语句的方法
- 得到PrepareStatement最终执行的sql语句的方法
- mybatis直接执行sql语句
- mybatis直接执行sql语句
- 内存泄露
- Xcode在使用cocoapods时无代码提示的解决办法
- 在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
- Android WebView开发问题及优化汇总
- 验证上传文件类型是否属于图片格式
- mybatis获取运行时最终执行SQL
- 屏幕触摸事件
- linux/mac定时任务
- NDK文件报错无法找到相应路径 JPush等第三方so文件引入的问题
- 安装mysql5.7.9
- Makefile学习笔记(一)
- 在 iOS 应用中直接跳转到 AppStore 的方法
- iOS 真机调试出现 Copypng failed with exit code 1
- structs2学习(四):动态生成结果集