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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器