文档章节

iBATIS获取真正执行SQL

谢雨齐
 谢雨齐
发布于 2016/04/18 09:59
字数 296
阅读 81
收藏 0

最近项目上有一需求,获取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();
    }
}

© 著作权归作者所有

共有 人打赏支持
谢雨齐
粉丝 0
博文 15
码字总数 2188
作品 0
东城
程序员
加载中

评论(1)

i
itxx2016
推荐国内最流行的ibatis代码生成网站 --- fwjava.com
无需任何安装配置,直接在线生成,且十分规范好用.
现在,很多知名的互联网公司都在用它.
从 iBatis 到 MyBatis,你准备好了吗?

对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案盛行之前,iBaits 基本是持久层框架的不...

被风遗忘
2012/03/30
0
0
凤凰涅槃:从 iBatis 到 MyBatis.

从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案...

被风遗忘
2012/04/18
0
1
iBatis和Hibernate浅析

iBatis和Hibernate浅析 Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hiber...

JAVA__
2012/08/16
0
1
【转】我为什么选择 iBatis 而不是 Hibernate(对于正在选型的人的建议)

我在最初的选型的时候是打算选择 Hibernate 的,在研究的过程中发现了 iBatis,经过 分析比较之后我选择了 iBatis。现在我已经使用 iBatis 完成了一个中小型的项目。这个 项目在性能、可维护...

mj4738
2012/02/18
0
3
ibatis MyBatis区别与联系

简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方。通过对本文的学习,读者基本能够了解 MyBatis 有哪些方面的改进,并能够顺利使...

为了美好的明天
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部