MyBatis源码解析一

90 阅读2分钟

MyBatis作为一个流行的半自动ORM框架,里面融合了许多优秀的设计理念,分析其源码骨架能够帮你建立良好的项目设计经验。由于其比较复杂,我会分成几篇来讲,一起踏上征服的旅程吧!

首先把MyBatis源码包导入到idea,再新建一个项目依赖本地包,这样我们就可以进行调试调用了。

因为MyBatis不同于Tomcat,它依赖于外部调用才能启动.

MyBatis的基础支撑层基于iBatis,它在iBatis的基础上增加了外观模式,方便编码人员更直观的使用。

因此,我们看一下它的核心包:

优秀的地方在于,每个模块之间的耦合度较低,一个包就是一个单独的模块。所以我们在分析单个模块的时候,相关类都会在同一个包中,是不是很方便。

日志模块

MyBatis没有提供日志的实现类,仅仅提供了一个Log接口,规定了trace、debug、warn、error四个级别:

public interface Log {

  boolean isDebugEnabled();

  boolean isTraceEnabled();

  void error(String s, Throwable e);

  void error(String s);

  void debug(String s);

  void trace(String s);

  void warn(String s);

}

此处我们以log4j来看,MyBatis是怎么集成日志插件的:

我们打开这个Log4jImpl,看看它是怎么把日志插件集成进来的:

首先,它实现了Log接口,然后将Log的相关处理转交给Logger对象(log4j中实际的打印类)来处理,典型的适配器模式。其他的日志插件也是如此,可以看一下Log模块的类图:

这是一个工厂模式,通过它的工厂代码我们就可以看到日志插件的加载顺序:

当执行数据库操作的时候,就会打印出相应的日志:

那么问题来了,我们在代码中并没有写打印语句呀,它是在哪里调用的呢?

这就是MyBatis的优秀之处,真正做到了业务与技术分离