彩票走势图

ibatis在debug时打印完整的SQL语句

转帖|其它|编辑:郝浩|2010-10-28 15:16:36.000|阅读 2590 次

概述: ibatis 是一个 O/R Mapping 解决方案, ibatis 最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能, ibatis 是能满足你的要求又足够灵活的最简单的解决方案。ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统 设计提供了更大的自由空间。本文主要介绍ibatis在debug时打印完整的SQL语句,希望对大家有帮助。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  这些年做的项目中,对持久层的选型更多的是基于ibatis,而且自己涂鸦的系统开发框架数据层操作也是居于ibatis实现的,不为别的,就因为ibatis使用的是纯jdbc操作。

      时下流行凡是都“原始回归”,“如果能把ibatis进行更好地理解和扩展,也不乏为一个优秀的杜撰框架”,基于这样的想法,好长时间里,我一直是钟情于ibatis的源码学习,自然从中也学到了很多有用的东西,设计模式、算法分析、构建思想和一些优秀的API实体类工具等。

       好,先来几句赞美ibatis的浮夸。

      ibatis 是一个 O/R Mapping 解决方案, ;ibatis 最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能, ibatis 是能满足你的要求又足够灵活的最简单的解决方案。ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统 设计提供了更大的自由空间。

      ibatis 底层采用纯JDBC操作,要求操作人员直接编写sql进行操作,光从这点看,ibatis本身就大大地提高数据层操作的透明度。

  这里我主要解决的就是一个常见的问题,即使用ibatis时需要在控制台或日志文件中打印其当前执行的完整sql,而不是常见的参数 问号 ? 语句。(这里主要基于ibatis2.0以上版本)。

步骤:

   1.网上下一个源码文件(没有可找我,我发一份给你,我的QQ群:91377268)

  2. 最终API执行流程,这里以insert为例。 具体顺序如下图:

  3. 最终根源找到,即修改com.ibatis.sqlmap.engine.execution.SqlExecutor即可。

  在代码66行处有如下方法

public int executeUpdate(StatementScope statementScope, Connection conn, String sql, Object[] parameters) throws SQLException {

}

insert最终执行的就是这个方法,恩,就是它了,改吧

4. 在类体中引入日志打印工具

private static final Log log = LogFactory.getLog(SqlExecutor.class);

5. 添加debug下执行sql打印信息

在ps.execute(); 执行前添加如下:

if (log.isDebugEnabled()) {
int count = ps.getParameterMetaData().getParameterCount();
for (int i = 0; i < count; i++) {
sql = sql.replaceFirst("\\?", parameters[i].getClass().getName().equals("java.lang.String") ? "'"+parameters[i].toString()+"'" : parameters[i].toString());
+"'" : parameters[i].toString());
}
log.debug("===当前执行SQL为===" + sql + ".");
}

还是贴一下完整的方法吧:

public int executeUpdate(StatementScope statementScope, Connection conn, String sql, Object[] parameters) throws SQLException {
ErrorContext errorContext = statementScope.getErrorContext();
errorContext.setActivity("executing update");
errorContext.setObjectId(sql);
PreparedStatement ps = null;
setupResultObjectFactory(statementScope);
int rows = 0;
try {
errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
ps = prepareStatement(statementScope.getSession(), conn, sql);
setStatementTimeout(statementScope.getStatement(), ps);
errorContext.setMoreInfo("Check the parameters (set parameters failed).");
statementScope.getParameterMap().setParameters(statementScope, ps, parameters);
errorContext.setMoreInfo("Check the statement (update failed).");
//打印调试信息 start
if (log.isDebugEnabled()) {
int count = ps.getParameterMetaData().getParameterCount();
for (int i = 0; i < count; i++) {
sql = sql.replaceFirst(&quot;\\?", parameters[i].getClass().getName().equals("java.lang.String") ? "'"+parameters[i].toString()

+"'" : parameters[i].toString());
}
log.debug("===当前执行SQL为===" + sql + ".");
}
//打印调试信息 end
ps.execute();
rows = ps.getUpdateCount();
} finally {
closeStatement(statementScope.getSession(), ps);
}
return rows;
}

主要的工作就是这样,下面开启commons-logging\log4j的debug模式测试一下吧。其他方式的API方法修改也类似了。

 

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP