聊聊Mybatis的总体流程

Posted 周杰伦本人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊Mybatis的总体流程相关的知识,希望对你有一定的参考价值。

@[TOC]

聊聊Mybatis的总体流程

我们前几篇文章分析了各个模块,今天我们吧这几个模块串起来,看看这些模块是怎么被Mybatis使用的

我们先看一下Mybatis是怎么使用的

       String configName = "mybatis_config.xml";

        Reader reader = Resources.getResourceAsReader(configName);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        SqlSession sqlSession = sqlSessionFactory.openSession();
         List<User> list = sqlSession.selectList("com.lagou.mapper.UserMapper.getUserByName");

第一步加载配置,生成SqlSessionFactory

先是加载配置文件,

SqlSessionFactoryBuilder().build是加载配置的入口,方法中先是配置文件的加载和解析,对应方法方法是XMLConfigBuilder的parse(),主要是全局配置文件和mapper文件,主配置文件会被解析到Configuration类中,mapper文件的sql信息会被加载到MappedStatement中,这部分功能在我的Mybatis的初始化的文章中介绍了,感兴趣的可以看看,这里就不多介绍了,这里要说一下,Configuration的mappedStatements集合是用来保存的MappedStatement对象:Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>(),StrictMap继承HashMap,重写put()方法,当key存在重复的时候会报错,这个集合的key是MappedStatement的id,即类的全限定名+方法名,value为MappedStatement

解析完配置通过SqlSessionFactoryBuilder的build()创建DefaultSqlSessionFactory对象,参数是Configuration对象

第二步建立会话,生成SqlSession对象

然后调用DefaultSqlSessionFactory的openSession()来创建会话,具体代码逻辑我在聊聊Mybatis的SqlSession的文章中介绍了,这里就不多说了

第三步就是调用SqlSession的api

根据类的全限定名加方法名获取对应的MappedStatement对象,调用Executor的query()方法进行执行sql,Executor是MyBatis执⾏器,负责SQL语句的⽣成和查询缓存的维护,query方法中先看缓存有没有,没有调用数据库进行查询,具体方法是根据传⼊的参数创建StatementHandler对象来执⾏查询,StatementHandler中封装了JDBC Statement操作,如设置参数、将Statement结果集转换成List集合。StatementHandler会对PreparedStatement的对象通过prepareStatement()方法设置值,方法中调用parameterize()方法,具体是根据 TypeHandler 来对preparedStatement 进 ⾏设置参数,TypeHandler是负责java数据类型和jdbc数据类型之间的映射和转换的,Executor创建Statement对象,StatementHandler对Statement对象实例化,并执行sql语句,返回List结果集,调用ResultSetHandler的handleResultSets()方法对ResultSet进行结果映射,ResultSetHandler是负责将JDBC返回的ResultSet结果集对象转换成List类型的集合

最后释放连接资源

总结

这篇文章从使用Mybatis的角度深入源码分析,过了一遍整体的流程,梳理了一下知识点,会对理解Mybatis工作原理有所帮助

以上是关于聊聊Mybatis的总体流程的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 的工作原理解析

聊聊手写Mybatis 注解配置方式

聊聊Mybatis集成Spring 注解方式

聊聊Ribbon源码解读

聊聊Mybatis的事务模块

聊聊 MyBatis 缓存