iBATIS获取真正执行SQL
2016-09-20 18:53
633 查看
摘要: iBATIS获取真正执行SQL,ibatis 2.3.4,SQL
最近项目上有一需求,获取ibatis执行的sql,注意是可以贴到客户端直接执行的SQL,搜索引擎加API查看,找到如下方式(废话不多说,直接上代码):
最近项目上有一需求,获取ibatis执行的sql,注意是可以贴到客户端直接执行的SQL,搜索引擎加API查看,找到如下方式(废话不多说,直接上代码):
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl; import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap; import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping; import com.ibatis.sqlmap.engine.mapping.sql.Sql; import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement; import com.ibatis.sqlmap.engine.scope.SessionScope; import com.ibatis.sqlmap.engine.scope.StatementScope; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.orm.ibatis.SqlMapClientTemplate; public class IBatisUtil { private static Log log = LogFactory.getLog(IBatisUtil.class); /** * 获取当前执行的sql * @param template * @param sqlName * @param param * @return */ public static String getCurrentSql(SqlMapClientTemplate template, String sqlName, Object param){ String sql = ""; SqlMapClientImpl sqlmap = (SqlMapClientImpl)template.getSqlMapClient(); MappedStatement stmt = sqlmap.getMappedStatement(sqlName); Sql stmtSql = stmt.getSql(); SessionScope sessionScope = new SessionScope(); StatementScope statementScope = new StatementScope(sessionScope); statementScope.setStatement(stmt); sql = stmtSql.getSql(statementScope, param); ParameterMap parameterMap = stmtSql.getParameterMap(statementScope, param); Object[] objs = null; if(parameterMap != null){ objs = parameterMap.getParameterObjectValues(statementScope, param); } ParameterMapping[] parameterMappings = parameterMap.getParameterMappings(); log.debug("[ignite]parameterMappings length=" + parameterMappings.length); for (int i = 0; i < parameterMappings.length; i++) { log.debug("[ignite]parameterName=" + parameterMappings[i].getPropertyName() + "; parameterValue=" + objs[i]); } return getPreparedSql(sql, objs); } public static String getPreparedSql(String sql, Object[] params){ //1 如果没有参数,说明是不是动态SQL语句 int paramNum = 0; if (null != params) paramNum = params.length; if (1 > paramNum) return sql; //2 如果有参数,则是动态SQL语句 StringBuffer stringBuffer = new StringBuffer(); String[] subsql = sql.split("\\?"); for (int i = 0; i < paramNum; i++) { if(params[i] instanceof Integer){ stringBuffer.append(subsql[i]).append(" ").append(params[i]).append(" "); }else{ stringBuffer.append(subsql[i]).append(" '").append(params[i]).append("' "); } } if (subsql.length > params.length) { stringBuffer.append(subsql[subsql.length - 1]); } return stringBuffer.toString(); } }
相关文章推荐
- ibatis的like关键字用法小结
- 为什么iBatis+Oracle的executeBatch总是返回0?
- PL/SQL Developer中文乱码问题的解决
- PL/SQL Developer中文乱码问题的解决
- 登录后,实现cookie信息和数据库信息的合并
- 对Oracle数据库坏块的理解
- Mysql区分大小写问题
- ibatis小结
- sqlite中的锁及概念误区
- mongodb安装与使用
- 在win7系统中安装SQL2005出现29506错误码的解决方案
- MySQL常用的数据类型及函数_20160920
- 如何在一台windows主机上搭建mysql主从配置
- 将本地数据库里的表上传至服务器
- sql输入单引号总显示错误 为什么
- 实用SQL语句大全
- MongoDB 的shell脚本基础进阶
- Oracle RAC 11g 通过SCAN连接遇到ORA-12170错误的解决办法
- pycharm快捷键、常用设置、配置管理
- mysql ab 压力测试的解读(转)