`
zhujiang520
  • 浏览: 147854 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ibatis源码分析(二)日志分析

阅读更多
看了ibatis的日志机制。其中ibatis支持JakartaCommonsLogging、  Jdk14LoggingImpl、Log4j和默认日志即什么都不输出。下面看一下日志的UML图

ibatis在选择要使用哪一个日志机制时,使用了java反射技术.
看com.ibatis.common.logging.LogFactory类的源码:
public class LogFactory {

  private static Constructor logConstructor;

  static {
    tryImplementation("org.apache.commons.logging.LogFactory", "com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
    tryImplementation("org.apache.log4j.Logger", "com.ibatis.common.logging.log4j.Log4jImpl");
    tryImplementation("java.util.logging.Logger", "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
    tryImplementation("java.lang.Object", "com.ibatis.common.logging.nologging.NoLoggingImpl");
  }
  private static void tryImplementation(String testClassName, String implClassName) {
    if (logConstructor == null) {
      try {
        Resources.classForName(testClassName);
        Class implClass = Resources.classForName(implClassName);
        logConstructor = implClass.getConstructor(new Class[]{Class.class});
      } catch (Throwable t) {
      }
    }
  }
  public static Log getLog(Class aClass) {
    try {
      return (Log)logConstructor.newInstance(new Object[]{aClass});
    } catch (Throwable t) {
      throw new RuntimeException("Error creating logger for class " + aClass + ".  Cause: " + t, t);
    }
  }
  public static synchronized void selectLog4JLogging() {
    try {
      Resources.classForName("org.apache.log4j.Logger");
      Class implClass = Resources.classForName("com.ibatis.common.logging.log4j.Log4jImpl");
      logConstructor = implClass.getConstructor(new Class[]{Class.class});
    } catch (Throwable t) {
    }
  }
  public static synchronized void selectJavaLogging() {
    try {
      Resources.classForName("java.util.logging.Logger");
      Class implClass = Resources.classForName("com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
      logConstructor = implClass.getConstructor(new Class[]{Class.class});
    } catch (Throwable t) {
    }
  }
}
系统默认只给我们实现了两种日志。
其实我们可以实现自己的日志机制只要你实现com.ibatis.common.logging.Log接口就行,
并在com.ibatis.common.logging.LogFactory添加相应的tryImplementation(String testClassName, String implClassName)和添加类方法public static synchronized void yourmethod().其实都可以参照源代码写。
ibatis在日志这方面做的很好!个人觉得。
当程序要使用有关数据库的日志记录时,如connection连接、preparestatement语句记录等等。其实是用日志log.isDebugEnabled()判断是否使用日志记录。通过返回相关connection的代理实现日志记录。

if (connectionLog.isDebugEnabled()) {
      connection = ConnectionLogProxy.newInstance(connection);
    }

ConnectionLogProxy源码如下:
public class ConnectionLogProxy extends BaseLogProxy implements InvocationHandler {

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

  private Connection connection;

  private ConnectionLogProxy(Connection conn) {
    super();
    this.connection = conn;
    if (log.isDebugEnabled()) {
      log.debug("{conn-" + id + "} Connection");
    }
  }

  public Object invoke(Object proxy, Method method, Object[] params)
      throws Throwable {
    try {
      if ("prepareStatement".equals(method.getName())) {
        if (log.isDebugEnabled()) {
          log.debug("{conn-" + id + "} Preparing Statement: " + removeBreakingWhitespace((String) params[0]));
        }
        PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params);
        stmt = PreparedStatementLogProxy.newInstance(stmt, (String) params[0]);
        return stmt;
      } else if ("prepareCall".equals(method.getName())) {
        if (log.isDebugEnabled()) {
          log.debug("{conn-" + id + "} Preparing Call: " + removeBreakingWhitespace((String) params[0]));
        }
        PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params);
        stmt = PreparedStatementLogProxy.newInstance(stmt, (String) params[0]);
        return stmt;
      } else if ("createStatement".equals(method.getName())) {
        Statement stmt = (Statement) method.invoke(connection, params);
        stmt = StatementLogProxy.newInstance(stmt);
        return stmt;
      } else {
        return method.invoke(connection, params);
      }
    } catch (Throwable t) {
      Throwable t1 = ClassInfo.unwrapThrowable(t);
      log.error("Error calling Connection." + method.getName() + ':', t1);
      throw t1;
    }

  }

  /**
   * Creates a logging version of a connection
   * @param conn - the original connection
   * @return - the connection with logging
   */
  public static Connection newInstance(Connection conn) {
    InvocationHandler handler = new ConnectionLogProxy(conn);
    ClassLoader cl = Connection.class.getClassLoader();
    return (Connection) Proxy.newProxyInstance(cl, new Class[]{Connection.class}, handler);
  }

}

  • 大小: 32.6 KB
  • 大小: 6.6 KB
分享到:
评论

相关推荐

    打log4j日志-ibatis的sql输出

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

    IBatis.Net流风通用管理框架源码.rar

    【描述】描述中提到的"IBatis.Net流风通用管理框架源码"意味着这是一个包含了整个框架的源代码,用户可以深入理解其内部工作原理,同时也方便开发者进行二次开发或自定义调整。通用管理框架通常包括用户认证、权限...

    传智ibatis视频源码

    7. **插件机制**:Ibatis允许开发者自定义插件,拦截SQL执行过程,实现如日志记录、性能分析等功能,扩展性极强。 8. **事务管理**:Ibatis支持手动和自动的事务管理,理解何时提交、回滚事务,以及事务的隔离级别...

    ibatis 框架源码剖析 书籍源代码 带有详尽注释

    本书籍“iBATIS 框架源码剖析”提供了对iBATIS框架深入理解的机会,通过源代码分析,帮助读者掌握其内部工作原理。源代码带有详尽的注释,使得学习过程更为直观和高效。 iBATIS的核心概念主要有以下几个方面: 1. ...

    SpringIbatis源码

    总的来说,本项目通过源码分析,让我们深入理解了Spring和iBatis如何协同工作,以提高Java应用的数据访问效率和灵活性。无论是对于初学者还是经验丰富的开发者,都能从中获得宝贵的实战经验和理论知识。

    Ibatis源代码(ibatis-src.zip)

    通过分析Ibatis的源代码,我们可以学习到如何优雅地处理数据库操作,包括事务管理、结果映射、参数绑定等。同时,Ibatis的插件机制(Interceptor)允许我们自定义拦截器,扩展其功能,例如添加日志记录、性能监控等...

    ibatis-sqlMap相关参考

    8. **源码分析**:深入Ibatis源码,理解其执行流程和优化技巧。 9. **工具支持**:了解IDE中对Ibatis的支持,如插件安装和配置,以及如何利用它们提高开发效率。 通过以上知识点的学习,开发者能更好地掌握Ibatis-...

    ibatis-2.3.0.677.jar

    - **插件支持**:可以扩展 iBATIS 功能,例如日志、性能分析等。 开发者使用 iBATIS 可以实现更细粒度的数据库操作控制,避免了 EJB 的复杂性,同时保留了 JDBC 的灵活性。在 iBATIS 2.x 版本中,XML 是主要的配置...

    ibatis-2.3.3.720.jar

    6. **插件支持**:Ibatis允许用户自定义插件,可以通过拦截器对SQL执行过程进行扩展,如性能分析、日志记录等。 7. **结果集处理**:支持多种结果集处理方式,包括Map、List、单个对象以及自定义的Java集合类,便于...

    ibatis 工具与讲座

    对于想要深入了解iBatis源码或者寻找工具提升开发体验的人来说,这是一个不容错过的资源。通过阅读博客文章和研究提供的文件,开发者可以更好地掌握iBatis的精髓,从而在实际项目中发挥其优势。

    ibatis打印sql

    在这个场景中,标签提到了"源码"和"工具",暗示我们将关注日志配置。Log4j是一个广泛使用的日志记录工具,它允许我们控制和记录应用的运行时信息,包括SQL语句。 2. **启用日志**: 要启用iBATIS的SQL打印,首先...

    ibatis-2.3.4.726-src-源代码

    《深入解析iBatis 2.3.4.726源码》 iBatis,作为一款轻量级的Java持久层框架,以其灵活、高效的特点,在许多项目中得到了广泛应用。本文将针对iBatis 2.3.4.726版本的源代码进行详尽解读,帮助开发者深入了解其内部...

    ibatis 一对多 多对多完整映射

    本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...

    ibatis-2.3.2.715

    "lib"目录下存放着iBatis运行所需要的外部库,这些库可能包括日志、XML解析、反射支持等,它们与iBatis紧密配合,共同构成了强大的数据访问层。 总之,iBatis 2.3.2.715的源代码不仅为我们提供了深入学习和理解...

    iBATIS_DBL-2.1.7.597.zip

    总的来说,iBATIS_DBL-2.1.7.597.zip提供了完整的iBATIS框架,开发者可以通过分析源码、阅读文档和了解依赖来学习和应用这一强大的数据访问工具。无论是对于初学者还是有经验的开发者,这都是一个宝贵的资源。

    ibatis.rar学习手册

    9. **源码解析**:对于对底层原理感兴趣的开发者,可能包含iBatis源码的解读,帮助理解其工作原理。 10. **进阶内容**:可能涵盖MyBatis(iBatis的升级版)的特性,以及如何使用插件扩展iBatis功能。 通过深入学习...

    Struts+Spring+Ibatis示例

    通过分析这个示例,开发者可以学习到如何在实际项目中整合这三个框架,以及如何设计和组织一个基于MVC模式的Java Web应用。对于初学者,这是一个很好的起点,对于经验丰富的开发者,这个示例可以帮助他们快速地搭建...

    spring2.5源码分析

    在这个源码分析中,我们将深入探讨Spring的核心概念、主要组件以及2.5版本的关键变化。 1. **依赖注入(Dependency Injection, DI)** Spring的核心特性之一是依赖注入,它允许开发者通过配置文件或注解来管理对象...

    struts spring ibatis mysql 整合 实例 数据库 源码

    通过分析这个源码实例,开发者不仅可以学习到四大框架的基本使用,还能了解到如何在实际项目中进行组件间的协调和配置。这对于提升Java Web开发能力,尤其是大型企业级应用的开发经验,有着极大的帮助。同时,这也为...

    ibatis oracle clob

    5. **工具支持**:标签中的"工具"可能指的是使用一些辅助工具,如数据库管理工具(如SQL Developer)、日志分析工具或自动化测试工具,这些工具可以帮助开发者更好地管理和调试涉及CLOB的操作。 6. **源码解析**:...

Global site tag (gtag.js) - Google Analytics