0 0

SQLMAP中,我想抓取sql,怎么做?20

DAO里面写了个方法:
public List getList(HashMap map) {
   return this.getSqlMapClientTemplate().queryForList(“sqlName”,map);
}
这样的一个方法,我执行了一个名叫:sqlName 的sql。

<statement id="sqlName" resultClass="java.util.HashMap">
        select  *  from test where id=#id#
</statement>


我想在调用getList()这个方法的时候,我能把sql也获取到一个String(Object)里面
???
不知道如何实现??或者还有其他的办法???

问题补充:
因为考虑到不去破坏整体框架,所以sql肯定要写到xml文件里面。
但是部分sql需要抓取出来使用,用ireport导出报表,需要传sql。。
不知道还有什么办法能实现这样的需要??
简单的说就是sql需要使用2次,而且尽量些到xml配置文件中

谢谢。
问题补充:
DAO里面写了个方法:
public List getList(HashMap map) {
   return this.getSqlMapClientTemplate().queryForList(“sqlName”,map);
}
这样的一个方法,我执行了一个名叫:sqlName 的sql。

<statement id="sqlName" resultClass="java.util.HashMap">
        select  *  from test where id=#id#
</statement>


我想在调用getList()这个方法的时候,我能把sql也获取到一个String(Object)里面
???
不知道如何实现??或者还有其他的办法???

问题补充:
因为考虑到不去破坏整体框架,所以sql肯定要写到xml文件里面。
但是部分sql需要抓取出来使用,用ireport导出报表,需要传sql。。
不知道还有什么办法能实现这样的需要??
简单的说就是sql需要使用2次,而且尽量些到xml配置文件中

谢谢。





----
linpyi 你说对了,这个项目是改造项目。jasper文件都用以前的。
所以没有办法再来做一次。只有想办法传个sql进去比较简单,快速了。
-----------
simon511 提的建议可以把sql拿出来,但是我试验了下,传了个map进去,好像参数没有传进去,出来的还是id=?这样的形式。不知道我是否传错地方?
代码如下:
String sql1 = null;  
        ExtendedSqlMapClient extendedSqlMapClient = (ExtendedSqlMapClient) this.getSqlMapClient();  
        MappedStatement mappedStatement = extendedSqlMapClient  
                .getMappedStatement("getADSLReasonAspList");  
        if (mappedStatement != null) {  
            RequestScope request = new RequestScope();  
            request.setStatement(mappedStatement);  
            sql1 = mappedStatement.getSql().getSql(request, map);  
        } 
        System.out.println(sql1);
谢谢。
------------------
cats_tiger 的方法我想如果有1000人并发,是否有问题?
导致sql乱续?方法有点难度哈。目前也不知道会不会导致其他问题产生。

--------
谢谢大家的指导。

ps: 怎么提问没有“回复”这样的按钮啊??
2008年11月10日 13:18

8个答案 按时间排序 按投票排序

0 0

采纳的答案

不好意思,上面的SqlMapSession应该是SqlMapExecutorDelegate

楼主可以将
SqlMapClient强制转成SqlMapClientImpl,然后获取delegate.

SqlMapClientImpl sqlMapClientImpl = (SqlMapClientImpl)sqlMapClient;
SqlMapExecutorDelegate delegate = sqlMapClientImpl.getDelegate();


在delegate中,可以取到所有的环境信息
包括

引用
  private HashMap mappedStatements;
  private HashMap cacheModels;
  private HashMap resultMaps;
  private HashMap parameterMaps;


推荐用户可以根据这条线简单研究一下ibatis的源代码,不会花很长时间的。里面有些属性可能是private的,并且没有提供get和set方法,这样的话,可以用反射机制获得和设置。

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ReflectUtil
{

  private static final Log logger = LogFactory.getLog(ReflectUtil.class);

  public static void setFieldValue(Object target, String fname, Class ftype,
      Object fvalue)
  {
    if (target == null || fname == null || "".equals(fname)
        || (fvalue != null && !ftype.isAssignableFrom(fvalue.getClass())))
    {
      return;
    }
    Class clazz = target.getClass();
    try
    {

      Method method = clazz.getDeclaredMethod("set"
          + Character.toUpperCase(fname.charAt(0)) + fname.substring(1),
          new Class[] { ftype });
      if (!Modifier.isPublic(method.getModifiers()))
      {
        method.setAccessible(true);
      }
      method.invoke(target, new Object[] { fvalue });

    } catch (Exception me)
    {
      if (logger.isDebugEnabled())
      {
        logger.debug(me);
      }
      try
      {
        Field field = clazz.getDeclaredField(fname);
        if (!Modifier.isPublic(field.getModifiers()))
        {
          field.setAccessible(true);
        }
        field.set(target, fvalue);
      } catch (Exception fe)
      {
        if (logger.isDebugEnabled())
        {
          logger.debug(fe);
        }
      }
    }
  }
}

2008年11月10日 17:14
0 0

引用
simon511 提的建议可以把sql拿出来,但是我试验了下,传了个map进去,好像参数没有传进去,出来的还是id=?这样的形式。不知道我是否传错地方?

ibatis在读取配置文件的时候,会将你的sql转换成
select  *  from test where id=?

的形式,而#id#会被ibatis作为ParameterMap参数放在SqlMapSession中。



String sql1 = null;   
        ExtendedSqlMapClient extendedSqlMapClient = (ExtendedSqlMapClient) this.getSqlMapClient();   
        MappedStatement mappedStatement = extendedSqlMapClient   
                .getMappedStatement("getADSLReasonAspList");   
        if (mappedStatement != null) {   
            RequestScope request = new RequestScope();   
            request.setStatement(mappedStatement);   
            sql1 = mappedStatement.getSql().getSql(request, map);   
        }  
        System.out.println(sql1); 

如果你的设置中设置了
useStatementNamespaces="true"

上面这一段代码可能是会出错的,需要你加入getMappedStatement("namespace.getADSLReasonAspList");



如果想达到楼主的效果,推荐首先一点是命名规范化,
这样你就可以取到SqlMapSession,通过SqlMapSession找到相应的ParameterMap.然后取出相应的值,组装正确的SQL语句。

2008年11月10日 16:27
0 0

性能没事的,Spring之类的都用ThreadLocal,这个保证了线程安全。
你要得到是最终的SQL?带“?”不行呀?这个复杂了。你需要为你的连接池做代理类,DataSource、Connection、PreparedStatement都要代理一下,只有这样才能知道发送到DB的最终SQL是什么。同样的,吧SQL存入ThreadLocal,然后调用者在ThreadLocal拿到SQL。
简单地说,自己写一个DataSource的实现类,但是真正的实现用DBCP或者C3PO,当getConnection的时候,将DBCP产生的Connection通过代理,转换为你自己的Connection实现,然后prepareStatement的时候,将实际的PreparedStatement对象再次转换为你自己的实现。
先要看看代理模式。
也许需要研究一下驱动程序的源代码,MySQL的源码可以找到的。

2008年11月10日 15:40
0 0

使用的时候,需要用反射方法向SqlMapClient 注入新的sqlExecutor:

//用到了SPring的IbatisTemplate和ReflectionUtils
if (sqlExecutor != null) {
      SqlMapClient sqlMapClient = getTemplate().getSqlMapClient();
      
      if (sqlMapClient instanceof ExtendedSqlMapClient) {
        Field field = ReflectionUtils.findField(((ExtendedSqlMapClient) sqlMapClient).getDelegate().getClass(),
            "sqlExecutor", SqlExecutor.class);
        field.setAccessible(true);
        ReflectionUtils.setField(field, ((ExtendedSqlMapClient) sqlMapClient).getDelegate(), sqlExecutor);
      }
    }

2008年11月10日 14:47
0 0

扩展com.ibatis.sqlmap.engine.execution.SqlExecutor
覆盖executeQuery方法,把SQL写入ThreadLocal:

public void executeQuery(RequestScope request, Connection conn, String sql, 
    //把SQL写入ThreadLocal,代码省略
    
    super.executeQuery(request, conn, sql, parameters, skipResults, maxResults, callback);

  }
//使用的时候,可以从ThreadLocal得到SQL

2008年11月10日 14:43
0 0

有sqlname了,当然可以取出sql呀

String sql = null;
		ExtendedSqlMapClient extendedSqlMapClient = (ExtendedSqlMapClient) sqlMapClient;
		MappedStatement mappedStatement = extendedSqlMapClient
				.getMappedStatement(sqlId);
		if (mappedStatement != null) {
			RequestScope request = new RequestScope();
			request.setStatement(mappedStatement);
			sql = mappedStatement.getSql().getSql(request, paramObject);
		}

2008年11月10日 14:42
0 0

感觉鱼和熊掌不可兼得......

不过你倒出报表需要的是数据而不是SQL语句,你只要把数据查询出来填写到报表bean中就可以了.

难道你需要得到SQL语句,再使用JDBC直连,再查询出数据,再填充到报表bean中去吗?

2008年11月10日 14:35
0 0

能不能说明下你要这个SQL的具体目的

如果只是想要获取SQL语句,你既然已经知道配置文件中的 select  *  from test where id=#id#

你只要写一个


public List getList(HashMap map) { 
String sql = "select  *  from test where id=";
sql+=map;//我不知道你map里面放的是什么,随便写了下.
   return this.getSqlMapClientTemplate().queryForList(“sqlName”,map); 
} 
其中SQL可以是全局静态公有变量,你在其他类中就可以获取.不过感觉好象没什么意义


如果你想通过外部程序来获取,
那就去解析你的配置文件中相应的节点信息,然后组合map

具体问题具体分析...这是我理解你提出的这个需求..如果有其他目的可以补充

2008年11月10日 13:26

相关推荐

    Sqlmap 注入神器 支持各种sql注入

    Sqlmap是一款强大的自动化SQL注入工具,它主要用于检测和利用SQL注入漏洞。这款神器因其功能全面、易用性高而备受安全研究人员和渗透测试者的青睐。它的核心目标是帮助用户识别和利用网站应用程序中的SQL注入弱点,...

    java开发基于SQLmap的SQL注入工具源码.zip

    基于SQLmap的SQL注入工具源码.。基于SQLmap,使用Java开发 安装教程 安装JDK(需要有javafx) 安装Python 安装SQLmap 基于SQLmap的SQL注入工具源码.。基于SQLmap,使用Java开发 安装教程 安装JDK(需要有javafx)...

    详解强大的SQL注入工具——SQLMAP

    SQL注入是一种常见的网络安全攻击技术,用于攻击数据驱动的应用程序,攻击者通过在应用程序的SQL命令中插入恶意SQL代码,从而控制数据库服务器。SQLMAP是一个开源的渗透测试工具,专门用于自动探测和利用SQL注入漏洞...

    sqlmap自动扫描器.zip_sqlmap_sqlmap扫描器_sql工具

    SQLMap是一款强大的、自动化SQL注入攻击工具,专为检测和利用SQL注入漏洞而设计。它可以帮助安全研究人员或渗透测试人员快速、有效地发现和利用数据库服务器的潜在漏洞。在这个"sqlmap自动扫描器.zip"压缩包中,包含...

    SqlMap-Sql注入

    Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix...

    sqlmap在windows上执行sql注入,利用dvwa靶场.md

    分享一下自己学习sqlmap的过程,因为网上的资源很少,所以就想着写个博客记录一下,同时也分享一下吧。就先讲到这里吧,有问题的可以私信。欢迎大家提意见。

    sqlmap中文手册-sql注入自动化测试工具

    在实际使用中,如果发现Web页面的参数(如GET、POST或Cookie)可能受到SQL注入的影响,SQLMap可以快速进行验证。例如,通过对URL中的参数进行测试,如`id=1 AND 1=1`和`id=1 AND 1=2`,如果两个请求返回不同的结果,...

    使用sqlmap+burpsuite进行中级sql注入

    在网络安全领域,SQL注入是一种常见的攻击手段,通过利用应用程序对用户输入数据的不恰当处理,攻击者可以操纵SQL查询,获取、修改、删除数据库中的敏感信息。本篇将详细介绍如何结合sqlmap和BurpSuite工具进行中级...

    SQLMAP SQL注入 超神器

    SQLMAP SQL注入 超神器

    最新的sqlmap-sqlmap

    sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于...

    Python-使用Charles和sqlmapapi进行自动化SQL注入

    使用Charles和sqlmapapi进行自动化SQL注入

    sqlmap中文使用手册

    Sqlmap是一款广泛使用的开源渗透测试工具,专注于SQL注入攻击,其目标是自动检测和利用SQL注入漏洞,并在数据库服务器上执行任意SQL语句,包括数据提取、查询数据库信息和执行管理操作等。通过上述给定文件的部分...

    利用sqlmapapi进行批量检测sql注入

    sql注入 本程序利用百度爬取特定的url链接,然后调用sqlmapapi(sqlmap自带的批量接口),进行注入的判断。 AutoSqli.py中option的设置可参考set_option.txt;可自定义判断注入的方法,例如,基于时间/布尔等。

    免费开源的SQL注入工具SQLmap.zip

    我想我已经说的够清楚了。(PS:请慎重攻击,不要做违法的事情)  PS:之前在wooyun上看了一些关于SQLMAP的文章,受益匪浅,今天翻译这篇文章,是希望对于如何使用SQLMAP提供一个基本的框架,SQL注入的原理以及...

    SQL注入加sqlmap使用

    SQL注入加sqlmap使用,支持一下,谢谢,可以了解一下。

    sqlmap一键安装,解压即用!绿色无忧!

    在这里,我将向你介绍一个无与伦比的工具——SQLMap。你可能已经听说过它,但我要告诉你的是,它比你想象的要强大得多。 SQLMap,就像它的名字所暗示的,是一个为你提供方便的“SQL注入攻击”的工具。对于那些不...

    安全测试工具:sqlmap,很好用的sql注入测试工具

    sqlmap是一款开源的自动化SQL注入工具,其设计目标是帮助安全测试人员和渗透测试专家快速、高效地检测网站是否存在SQL注入漏洞。这款工具具有以下显著特点: 1. 自动化:sqlmap能够自动识别和利用SQL注入漏洞,无需...

    sqlmap_自动化sql注入引擎_None_sqlmap_sql注入_sql_flath1c_vulnerability_

    SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。...还可以使用SQL注入来添加,修改和删除数据库中的记录。

    Sqlmap使用手册中文版

    当进行Web应用审计时,如果发现页面中的参数(如GET、POST或Cookie)可能受到用户输入的影响,Sqlmap可以帮助测试是否存在SQL注入漏洞。例如,通过对URL参数进行篡改,观察响应的变化,可以初步判断是否存在注入点。...

Global site tag (gtag.js) - Google Analytics