-
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个答案 按时间排序 按投票排序
-
采纳的答案
不好意思,上面的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
-
引用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
-
性能没事的,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
-
使用的时候,需要用反射方法向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
-
扩展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
-
有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
-
感觉鱼和熊掌不可兼得......
不过你倒出报表需要的是数据而不是SQL语句,你只要把数据查询出来填写到报表bean中就可以了.
难道你需要得到SQL语句,再使用JDBC直连,再查询出数据,再填充到报表bean中去吗?2008年11月10日 14:35
-
能不能说明下你要这个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注入工具,它主要用于检测和利用SQL注入漏洞。这款神器因其功能全面、易用性高而备受安全研究人员和渗透测试者的青睐。它的核心目标是帮助用户识别和利用网站应用程序中的SQL注入弱点,...
基于SQLmap的SQL注入工具源码.。基于SQLmap,使用Java开发 安装教程 安装JDK(需要有javafx) 安装Python 安装SQLmap 基于SQLmap的SQL注入工具源码.。基于SQLmap,使用Java开发 安装教程 安装JDK(需要有javafx)...
SQL注入是一种常见的网络安全攻击技术,用于攻击数据驱动的应用程序,攻击者通过在应用程序的SQL命令中插入恶意SQL代码,从而控制数据库服务器。SQLMAP是一个开源的渗透测试工具,专门用于自动探测和利用SQL注入漏洞...
SQLMap是一款强大的、自动化SQL注入攻击工具,专为检测和利用SQL注入漏洞而设计。它可以帮助安全研究人员或渗透测试人员快速、有效地发现和利用数据库服务器的潜在漏洞。在这个"sqlmap自动扫描器.zip"压缩包中,包含...
Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix...
分享一下自己学习sqlmap的过程,因为网上的资源很少,所以就想着写个博客记录一下,同时也分享一下吧。就先讲到这里吧,有问题的可以私信。欢迎大家提意见。
在实际使用中,如果发现Web页面的参数(如GET、POST或Cookie)可能受到SQL注入的影响,SQLMap可以快速进行验证。例如,通过对URL中的参数进行测试,如`id=1 AND 1=1`和`id=1 AND 1=2`,如果两个请求返回不同的结果,...
在网络安全领域,SQL注入是一种常见的攻击手段,通过利用应用程序对用户输入数据的不恰当处理,攻击者可以操纵SQL查询,获取、修改、删除数据库中的敏感信息。本篇将详细介绍如何结合sqlmap和BurpSuite工具进行中级...
SQLMAP SQL注入 超神器
sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于自动化的sql注入。sqlmap用于...
使用Charles和sqlmapapi进行自动化SQL注入
Sqlmap是一款广泛使用的开源渗透测试工具,专注于SQL注入攻击,其目标是自动检测和利用SQL注入漏洞,并在数据库服务器上执行任意SQL语句,包括数据提取、查询数据库信息和执行管理操作等。通过上述给定文件的部分...
sql注入 本程序利用百度爬取特定的url链接,然后调用sqlmapapi(sqlmap自带的批量接口),进行注入的判断。 AutoSqli.py中option的设置可参考set_option.txt;可自定义判断注入的方法,例如,基于时间/布尔等。
我想我已经说的够清楚了。(PS:请慎重攻击,不要做违法的事情) PS:之前在wooyun上看了一些关于SQLMAP的文章,受益匪浅,今天翻译这篇文章,是希望对于如何使用SQLMAP提供一个基本的框架,SQL注入的原理以及...
SQL注入加sqlmap使用,支持一下,谢谢,可以了解一下。
在这里,我将向你介绍一个无与伦比的工具——SQLMap。你可能已经听说过它,但我要告诉你的是,它比你想象的要强大得多。 SQLMap,就像它的名字所暗示的,是一个为你提供方便的“SQL注入攻击”的工具。对于那些不...
sqlmap是一款开源的自动化SQL注入工具,其设计目标是帮助安全测试人员和渗透测试专家快速、高效地检测网站是否存在SQL注入漏洞。这款工具具有以下显著特点: 1. 自动化:sqlmap能够自动识别和利用SQL注入漏洞,无需...
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。...还可以使用SQL注入来添加,修改和删除数据库中的记录。
当进行Web应用审计时,如果发现页面中的参数(如GET、POST或Cookie)可能受到用户输入的影响,Sqlmap可以帮助测试是否存在SQL注入漏洞。例如,通过对URL参数进行篡改,观察响应的变化,可以初步判断是否存在注入点。...