Mybatis架构与原理学习 作者:消失er 来源:www.jianshu.com/p/15781ec742f2 MyBatis功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: API界面层:提供给外部使用的界面API,开发人员通过这些本地API来操纵数据库。界面层一接收到呼叫请求就会呼叫资料处理层来完成具体的资料处理。资料处理层:负责具体的SQL查询、SQL解析、SQL执行和执行结果对映处理等。它主要的目的是根据呼叫的请求完成一次数据库操作。基础支撑层:负责最基础的功能支撑,包括连线管理、事务管理、配置载入和快取处理,这些都是共用的东西,将他们抽取出来作为最基础的元件。为上层的资料处理层提供最基础的支撑。框架架构 框架架构讲解: 这张图从上往下看。MyBatis的初始化,会从mybatis-config.xml配置档案,解析构造成Configuration这个类,就是图中的红框。
载入配置:配置来源于两个地方,一处是配置档案,一处是Java程式码的注解,将SQL的配置资讯载入成为一个个MappedStatement物件(包括了传入引数对映配置、执行的SQL语句、结果对映配置),储存在内存中。SQL解析:当API界面层接收到呼叫请求时,会接收到传入SQL的ID和传入物件(可以是Map、JavaBean或者基本资料型别),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入引数物件对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和引数。SQL执行:将最终得到的SQL和引数拿到数据库进行执行,得到操作数据库的结果。结果对映:将操作数据库的结果按照对映的配置进行转换,可以转换成HashMap、JavaBean或者基本资料型别,并将最终结果返回。MyBatis核心类
1、SqlSessionFactoryBuilder
每一个MyBatis的应用程序的入口是SqlSessionFactoryBuilder。
它的作用是通过XML配置档案建立Configuration物件(当然也可以在程式中自行建立),然后通过build方法建立SqlSessionFactory物件。没有必要每次访问Mybatis就建立一次SqlSessionFactoryBuilder,通常的做法是建立一个全域性的物件就可以了。
示例程式如下:
org.apache.ibatis.session.Configuration 是mybatis初始化的核心。
mybatis-config.xml中的配置,最后会解析xml成Configuration这个类。
SqlSessionFactoryBuilder根据传入的资料流(XML)生成Configuration物件,然后根据Configuration物件建立预设的SqlSessionFactory例项。
2、SqlSessionFactory物件由SqlSessionFactoryBuilder建立:
它的主要功能是建立SqlSession物件,和SqlSessionFactoryBuilder物件一样,没有必要每次访问Mybatis就建立一次SqlSessionFactory,通常的做法是建立一个全域性的物件就可以了。SqlSessionFactory物件一个必要的属性是Configuration物件,它是储存Mybatis全域性配置的一个配置物件,通常由SqlSessionFactoryBuilder从XML配置档案建立。
这里给出一个简单的示例:
3、SqlSession
SqlSession物件的主要功能是完成一次数据库的访问和结果的对映,它类似于数据库的session概念,由于不是执行绪安全的,所以SqlSession物件的作用域需限制方法内。
SqlSession的预设实现类是DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor。Configuration前文已经描述这里不再多说。SqlSession对数据库的操作都是通过Executor来完成的。
SqlSession :预设建立DefaultSqlSession 并且开启一级快取,建立执行器 、赋值。
SqlSession有一个重要的方法getMapper,顾名思义,这个方式是用来获取Mapper物件的。什么是Mapper物件?
根据Mybatis的官方手册,应用程序除了要初始并启动Mybatis之外,还需要定义一些界面,接口里定义访问数据库的方法,存放界面的包路径下需要放置同名的XML配置档案。
SqlSession的getMapper方法是联络应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的界面型别和对应的XML配置档案生成一个代理物件,这个代理物件就叫Mapper物件。应用程序获得Mapper物件后,就应该通过这个Mapper物件来访问Mybatis的SqlSession物件,这样就达到里插入到Mybatis流程的目的。
4、Executor
Executor物件在建立Configuration物件的时候建立,并且快取在Configuration物件里。Executor物件的主要功能是呼叫StatementHandler访问数据库,并将查询结果存入快取中(如果配置了快取的话)。
5、StatementHandler
StatementHandler是真正访问数据库的地方,并呼叫ResultSetHandler处理查询结果。
6、ResultSetHandler
处理查询结果。
MyBatis成员层次&职责
SqlSession 作为MyBatis工作的主要顶层API,表示和数据库互动的会话,完成必要数据库增删改查功能Executor MyBatis执行器,是MyBatis 排程的核心,负责SQL语句的生成和查询快取的维护StatementHandler 封装了JDBC Statement操作,负责对JDBCstatement的操作,如设定引数、将Statement结果集转换成List集合。ParameterHandler 负责对使用者传递的引数转换成JDBC Statement 所需要的引数ResultSetHandler *负责将JDBC返回的ResultSet结果集物件转换成List型别的集合;TypeHandler 负责java资料型别和jdbc资料型别之间的对映和转换MappedStatement MappedStatement维护了一条节点的封SqlSource 负责根据使用者传递的parameterObject,动态地生成SQL语句,将资讯封装到BoundSql物件中,并返回BoundSql 表示动态生成的SQL语句以及相应的引数资讯Configuration MyBatis所有的配置资讯都维持在Configuration物件之中