首页 > 技术文章 > mybatis之源码阅读记录

atinalove 2020-08-22 21:41 原文

   使用mybatis已经有几年了,之前只是在项目中配置和使用,但是没有去追究它的内部实现的细节,后来也偿试去学习源码,看过一些文章,但是不得入门。后来在mybatis官网的入门指引找找到了灵感,终于对mybatis的实现有了一定的理解

 

  在mybatis的官网上介绍了我们在不依赖spring类容器的情况下使用mybatis,这种方式对于我们了解原理我认为的很有帮助的,以下的我根据官网上的介绍自己写来了解源码的代码:

 

  

  public static void main(String []args) throws IOException {

//配置文件
String resource = "mybatis-config.xml";
InputStream fileInputStream = Resources.getResourceAsStream(resource);

//session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(fileInputStream);

SqlSession sqlSession = sqlSessionFactory.openSession();

//代理Mapper接口
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

Student student = mapper.selectStudent(5L);
// System.out.println(student.getName());
// sqlSession.selectOne("select * from t_member where ID=?","1006640980");
}


在上面的示例代码中,我们可以看见mybatis相关的类中比较重要的有三个类,SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,这个是我们从示例中可以看出来的,这三个类的作用分别是
SqlSessionFactoryBuilder这个类负责从mybatis-config.xml文件中解析我们对于数据库配置和连接数据库
SqlSessionFactory这个类负责管理我们和数据库连接的对话,从这个类的命名我们可以看出这里mybatis使用的工厂模式来管理数据库对话
SqlSession这个类就是我们和数据库之间交互的对话

虽然示例代码中可以看到看到一些重要的东西,但是还有重要的一点在代码中没有体现。我们知道,mybatis的一个重要的技术的代理,在这里我们并没有看到代理的实现


后来通过运行代码和debug单步调试,在sqlSession.getMapper方法中,我们看到了如下代码:

 

 

在这段代码中,出现了两个重要的类,MapperRegistry,和 MapperProxyFactory,以及MapperProxy类,

MapperRegistry中存储接口和对应代理对象的关系,

MapperProxyFactory类是生产Mapper接口代理类的工厂类,

MapperProxy类我们可以看到这个类实现了 InvocationHandler接口,实现这个接口的我们都知道这是一个代理类

 

至此,对于mybatis的源码有了一定的了解,对于它的基本实现的原理也有了一定的理解

 

ps:虽然对于mybatis的实现原理有了一定的理解 ,但是对于spring整合mybatis时的流程还有一些不懂,有待日后研究







推荐阅读