`
zjf_1103
  • 浏览: 36714 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

转载于:http://www.cnblogs.com/warison2008/archive/2010/10/13/1850262.html

 

这些年做的项目中,对持久层的选型更多的是基于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.网上下一个源码文件(没有可找我,我发一份给你)

      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()); } log.debug( " ===当前执行SQL为=== " + sql + " . " ); }

 

 

 

 

还是贴一下完整的方法吧,省得有人抱怨我,O(∩_∩)O哈哈~

代码
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( " \\? " , 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; }

 

 

 

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

     可能你会鄙视我,就这点三脚猫还出来“现眼”,笑笑,没事了,反正我就是想和大伙分享下自己的心得。自然对一个框架的扩展修改不会仅限于此(如 sqlmap一个节点下同时执行多个sql、主子表同时保存一次操作中保证彼此外键的同时赋值关联、selectkey变种扩展为classkey即唯一 主键由某个类实现而不是数据库sql,等等这些都是很容易的事情),如果是这样那我还不如回家种田去。可是罪恶的约束限制我只能写这么多,在中国嘛,就是 这样了,到哪里都《保密协议》,悲哀。。。。。。

     后期,如有时间,我会说说ibatis中关于connecting,事物,对象缓存等一些自己的理解,更多的是一些读懂代码的体会。

      【最近在弄自创的WMframework,2.0版本,设计,代码实现基本上完成,还差一些文档说明,等做好那天再和大伙分享吧,不过不要笑我啊,因为我就是涂鸦而已。】

分享到:
评论
2 楼 雁栖湖 2012-05-06  
还能是怎么弄的啊,当然是ctrl + c and ctrl + v, 我刚在博客园看完,又看到这个  蛋疼
1 楼 dongbiying 2011-12-14  
    大哥 你怎么弄的呀 。。。

相关推荐

    在ibatis日志信息中打印SQL语句的方法(个人总结)

    在使用iBatis(现为MyBatis)作为持久层框架进行开发时,有时我们需要调试SQL语句,以便查看执行的SQL、优化性能或者解决查询问题。本文将详细讲解如何在iBatis日志信息中打印SQL语句,以便更好地理解和优化数据库...

    打log4j日志-ibatis的sql输出

    在默认情况下,Ibatis并不会自动打印执行的SQL语句,但通过配置,我们可以使Ibatis在运行时输出SQL,这对于调试和性能分析非常有帮助。 要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-...

    ibatis打印sql

    标题 "ibatis打印sql" 涉及到的是在使用iBATIS(一个轻量级的持久层框架)时如何调试和查看SQL语句的方法。iBATIS允许开发者编写SQL语句并将其与Java代码集成,以实现灵活的数据访问。在开发过程中,为了调试和优化...

    使用P6spy打印ibatis执行的SQL语句

    本文将详细探讨如何使用P6Spy来打印iBatis(现为MyBatis)执行的SQL语句,以便进行性能分析和调试。 首先,我们需要了解P6Spy的工作原理。P6Spy通过替换JDBC驱动,将自己插入到应用程序和数据库之间,监听所有的SQL...

    ibatis2包和能显示执行的sql语句的ibatis2.jar

    这将使Ibatis2在DEBUG级别打印出所有执行的SQL语句和绑定参数,帮助开发者了解程序运行状态。 关于`ibatis2.jar`,它是Ibatis2框架的主要依赖库,包含了所有必要的类和接口,用于实现数据访问层的功能。使用这个JAR...

    mybatis-plus配置控制台打印完整带参数SQL语句的实现

    在开发过程中,为了方便调试和优化SQL语句,有时我们需要在控制台打印出完整的、带有参数的SQL语句。本文将详细介绍如何在MyBatis-Plus中配置控制台打印这样的SQL。 首先,问题背景是开发人员在编写SQL语句时,通常...

    在java控制台提取sql语句

    2019-01-18 10:12:52,566 [DEBUG](org.apache.ibatis.logging.log4j.Log4jImpl.debug(Log4jImpl.java:42)) - ==&gt; Parameters: 3(Long) 使用这个转换工具,可以转换成标准的样子,没有其他的prepare日志时间什么的...

    Mybatis Log(自动填充sql参数打印到控制台)

    在执行`getUserByUsernameAndStatus`方法时,Mybatis会自动填充SQL参数,并将完整的SQL语句(包括参数值)打印到控制台。例如,如果传入的参数是`username='test'`和`status='active'`,控制台将输出如下内容: ```...

    mybatis,ibatis,hibernate 显示查询SQL

    在iBatis中,同样可以通过配置日志系统,如log4j,查看执行的SQL语句,这对于调试和性能优化非常有用。 **Hibernate** Hibernate 是一个全面的ORM框架,提供了更强大的对象关系映射功能。它不仅处理SQL的生成,还...

    原样输出mybatis的sql执行语句(mysql和oracle都可用).zip

    在默认情况下,MyBatis并不会直接打印出执行的SQL语句,因此我们需要开启日志功能以获取这些信息。 1. **启用MyBatis日志** MyBatis支持多种日志实现,如Log4j、Logback和Java内置的日志API。在SpringBoot项目中,...

    mybatis Sql打印两种方式

    这样配置后,MyBatis会在DEBUG级别及以上时打印出所有执行的SQL语句,包括占位符(?)和实际参数,帮助开发者了解SQL的执行情况。 2. **MyBatis拦截器SQL打印** MyBatis提供了一种更灵活的方式来打印SQL,即使用...

    ibatis企业开发报表前调试(日志,复杂sql动态拼接)

    然而,在调试过程中,如何正确地获取并查看完整的SQL语句,常常成为困扰开发者的难题。本篇将详细介绍如何利用日志来调试Ibatis中的复杂SQL动态拼接。 首先,了解Ibatis的日志系统是关键。Ibatis默认集成了几种常见...

    ibatis 开发指南,开发手册 txt 版

    iBatis是一个开源框架,用于处理数据库操作,特别适用于希望控制其SQL语句的开发人员。该框架结合了面向对象的设计思想和传统的SQL查询技术,使得开发者能够在保持代码灵活性的同时,有效地与关系型数据库进行交互。...

    Mybatis控制台打印Sql语句的实现代码

    在开发过程中,为了调试和优化SQL查询,有时我们需要在控制台打印出执行的SQL语句。MyBatis提供了这样的功能,通过调整日志配置,可以在运行时观察到SQL语句的执行情况。以下是实现MyBatis控制台打印SQL语句的具体...

    springboot+mybatis配置控制台打印sql日志的方法

    完成以上配置后,当你运行Spring Boot应用时,所有的SQL操作,包括执行的SQL语句和对应的参数,都将显示在控制台上。这对于调试SQL性能问题、验证SQL语句是否正确以及理解应用程序数据库交互逻辑都非常有帮助。 ...

    ibatis guide

    - **动态映射**:支持在运行时动态生成 SQL 语句。 #### 六、ibatis 高级特性 - **数据关联**:通过配置文件中的 `&lt;association&gt;` 和 `&lt;collection&gt;` 标签实现对象之间的关联。 - **延迟加载**:通过 `...

    J2EE学习 Ibatis开发资料共享 Ibatis开发资料 Ibatis学习框架 Ibatis开发概要

    Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句的手动编写与参数结果的映射。这种方式虽然在一定程度上增加了...

    主子表查询ibatis

    在控制台打印主子表查询结果时,可以利用log4j的`Logger`类,设置合适的日志级别(如DEBUG),并在查询执行后调用`info()`或`debug()`方法,将查询结果输出到控制台。确保在项目配置中添加了log4j.properties文件,...

Global site tag (gtag.js) - Google Analytics