聊聊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的总体流程的主要内容,如果未能解决你的问题,请参考以下文章