bluerain008 2008-11-10 13:18
浏览 263
已采纳

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

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


select * from test where id=#id#

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

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

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


select * from test where id=#id#

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

[b]问题补充:[/b]
因为考虑到不去破坏整体框架,所以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: 怎么提问没有“回复”这样的按钮啊??

  • 写回答

8条回答 默认 最新

  • sptzone 2008-11-10 17:14
    关注

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

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

    [code="java"]SqlMapClientImpl sqlMapClientImpl = (SqlMapClientImpl)sqlMapClient;
    SqlMapExecutorDelegate delegate = sqlMapClientImpl.getDelegate();[/code]

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

    [quote] private HashMap mappedStatements;
    private HashMap cacheModels;
    private HashMap resultMaps;
    private HashMap parameterMaps;[/quote]

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

    [code="java"]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);
        }
      }
    }
    

    }
    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)