看了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
分享到:
相关推荐
在默认情况下,Ibatis并不会自动打印执行的SQL语句,但通过配置,我们可以使Ibatis在运行时输出SQL,这对于调试和性能分析非常有帮助。 要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-...
【描述】描述中提到的"IBatis.Net流风通用管理框架源码"意味着这是一个包含了整个框架的源代码,用户可以深入理解其内部工作原理,同时也方便开发者进行二次开发或自定义调整。通用管理框架通常包括用户认证、权限...
7. **插件机制**:Ibatis允许开发者自定义插件,拦截SQL执行过程,实现如日志记录、性能分析等功能,扩展性极强。 8. **事务管理**:Ibatis支持手动和自动的事务管理,理解何时提交、回滚事务,以及事务的隔离级别...
本书籍“iBATIS 框架源码剖析”提供了对iBATIS框架深入理解的机会,通过源代码分析,帮助读者掌握其内部工作原理。源代码带有详尽的注释,使得学习过程更为直观和高效。 iBATIS的核心概念主要有以下几个方面: 1. ...
总的来说,本项目通过源码分析,让我们深入理解了Spring和iBatis如何协同工作,以提高Java应用的数据访问效率和灵活性。无论是对于初学者还是经验丰富的开发者,都能从中获得宝贵的实战经验和理论知识。
通过分析Ibatis的源代码,我们可以学习到如何优雅地处理数据库操作,包括事务管理、结果映射、参数绑定等。同时,Ibatis的插件机制(Interceptor)允许我们自定义拦截器,扩展其功能,例如添加日志记录、性能监控等...
8. **源码分析**:深入Ibatis源码,理解其执行流程和优化技巧。 9. **工具支持**:了解IDE中对Ibatis的支持,如插件安装和配置,以及如何利用它们提高开发效率。 通过以上知识点的学习,开发者能更好地掌握Ibatis-...
- **插件支持**:可以扩展 iBATIS 功能,例如日志、性能分析等。 开发者使用 iBATIS 可以实现更细粒度的数据库操作控制,避免了 EJB 的复杂性,同时保留了 JDBC 的灵活性。在 iBATIS 2.x 版本中,XML 是主要的配置...
6. **插件支持**:Ibatis允许用户自定义插件,可以通过拦截器对SQL执行过程进行扩展,如性能分析、日志记录等。 7. **结果集处理**:支持多种结果集处理方式,包括Map、List、单个对象以及自定义的Java集合类,便于...
对于想要深入了解iBatis源码或者寻找工具提升开发体验的人来说,这是一个不容错过的资源。通过阅读博客文章和研究提供的文件,开发者可以更好地掌握iBatis的精髓,从而在实际项目中发挥其优势。
在这个场景中,标签提到了"源码"和"工具",暗示我们将关注日志配置。Log4j是一个广泛使用的日志记录工具,它允许我们控制和记录应用的运行时信息,包括SQL语句。 2. **启用日志**: 要启用iBATIS的SQL打印,首先...
《深入解析iBatis 2.3.4.726源码》 iBatis,作为一款轻量级的Java持久层框架,以其灵活、高效的特点,在许多项目中得到了广泛应用。本文将针对iBatis 2.3.4.726版本的源代码进行详尽解读,帮助开发者深入了解其内部...
本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...
"lib"目录下存放着iBatis运行所需要的外部库,这些库可能包括日志、XML解析、反射支持等,它们与iBatis紧密配合,共同构成了强大的数据访问层。 总之,iBatis 2.3.2.715的源代码不仅为我们提供了深入学习和理解...
总的来说,iBATIS_DBL-2.1.7.597.zip提供了完整的iBATIS框架,开发者可以通过分析源码、阅读文档和了解依赖来学习和应用这一强大的数据访问工具。无论是对于初学者还是有经验的开发者,这都是一个宝贵的资源。
9. **源码解析**:对于对底层原理感兴趣的开发者,可能包含iBatis源码的解读,帮助理解其工作原理。 10. **进阶内容**:可能涵盖MyBatis(iBatis的升级版)的特性,以及如何使用插件扩展iBatis功能。 通过深入学习...
通过分析这个示例,开发者可以学习到如何在实际项目中整合这三个框架,以及如何设计和组织一个基于MVC模式的Java Web应用。对于初学者,这是一个很好的起点,对于经验丰富的开发者,这个示例可以帮助他们快速地搭建...
在这个源码分析中,我们将深入探讨Spring的核心概念、主要组件以及2.5版本的关键变化。 1. **依赖注入(Dependency Injection, DI)** Spring的核心特性之一是依赖注入,它允许开发者通过配置文件或注解来管理对象...
通过分析这个源码实例,开发者不仅可以学习到四大框架的基本使用,还能了解到如何在实际项目中进行组件间的协调和配置。这对于提升Java Web开发能力,尤其是大型企业级应用的开发经验,有着极大的帮助。同时,这也为...
5. **工具支持**:标签中的"工具"可能指的是使用一些辅助工具,如数据库管理工具(如SQL Developer)、日志分析工具或自动化测试工具,这些工具可以帮助开发者更好地管理和调试涉及CLOB的操作。 6. **源码解析**:...