MyBatis由于其以易使用性和学习成本较低,让大多人都会在项目选择使用MyBatis,但使用了那么久的MyBatis,慢慢的就想深入的了解一下MyBatis到底是如何工作。
如何了解MyBatis的工作机制?最好的办法就是看它的源码。那么如何来看MyBatis的源码呢?
介绍一下我看源码的方法,就是先从整体来看,接着根据自己的经验,先去推测这么一个机制或者方法可能的一个实现方法,然后带着自己的推测去源码中用debug的模式去寻找答案。这样子看源码不仅能让目的性更强,同时也更快的提升自己的代码水平,因为这样阅读源码,每一次都是将你的想法和那些优秀的开发大神的思路去碰撞,慢慢的你就变得和那些大神一样,去设计和开发程序。
下面开始阅读MyBatis的源码。
首先先介绍一下什么是MyBatis。对于这个问题,很多人可能第一反应就是MyBatis是一个半自动化的基于SQL的持久层框架。但是这些都是别人从官网上看到,然后自己的解读,不是你的解读,所以不妨抛开别人的理解,自己去官网 看看是如何解释什么是MyBatis。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- 从整体来看
先来了解一下MyBatis的整体的一个流程。
图来自CZengze的博客
项目启动之后,MyBatis会先读取配置文件,然后再通过SqlSessionFactoryBuilder的build方法来建立SqlSessionFactory。在SqlSessionFactoryBuilder中build()有多个实现,供不同的条件下使用,之后在通过SqlSessionFactory来创建SqlSession。在MyBatis中所有的操作都是基于SqlSession来完成的,SqlSession的生命周期是Method的级别的。
可以通过以下代码用debug的形式来体会一下MyBatis的运行流程
public static void main(String[] args)throws Exception {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
SqlSession sqlSession = build.openSession();
Connection connection = sqlSession.getConnection();
sqlSession.select("select * from 1", new ResultHandler() {
@Override
public void handleResult(ResultContext resultContext) {
resultContext.getResultCount();
}
});
connection.close();
}