Mysatis架构分为三层及各层作用:

接口层对象是SqlSession,它是上层应用和MyBatis打交道的桥梁sqlSession提供了数据库的操作方法,调用核心处理

层的相应模块来完成具体的数据库操作。

核心处理层参数解析、参数映射、sql解析、sql执行、结果集映射、插件也属于核心层,这是 由于它的工作方式和拦截的对象决定的

Statement放到基础执行器,基础执行器逻辑将会非常臃肿,事务、缓存等.. 放到实现又会产生大量重复代码。所以MyBatis 作者才设计出StatementHandler 来封装Statement操作;

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor、ParameterHandler、ResultSetHandler、StatementHandler。

基础支持层:主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能。比如数据源、缓存、日志、xml解析、反射、IO、事务等等这些功能

流程

1、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂;

把配置文件mybatis-config.xml里面的一个个节点分别解析到Configuration对象内保存。

重点在于映射器的解析。

XMLMapperBuilder:解析mapper.xml;

xmlConfigbuilder:解析mybatis-config.xml;

XMLStatementBuilder:mapper中的sql通过parseStatementNode解析成MappedStatement;

2、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行

3、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

基本执行器:通过Configuration指定executorType(SIMPLE, REUSE重用, BATCH批处理)来创建对应Executor。

简单执行器:是 MyBatis 中默认使用的执行器,每执行一次 update 或 select,就开启一个 Statement 对象,用完就直接关闭 Statement 对象(可以是 Statement 或者是 PreparedStatment 对象)。

重用执行器:重用指的是重复使用 Statement,它会在内部使用一个 Map 把创建的 Statement 都缓存起来,每次执行 SQL 命令的时候,都会去判断是否存在基于该 SQL 的 Statement 对象,如果存在 Statement 对象并且对应的 connection 还没有关闭的情况下就继续使用之前的 Statement 对象,并将其缓存起来。因为每一个 SqlSession 都有一个新的 Executor 对象,所以我们缓存在 ReuseExecutor 上的Statement 作用域是同一个 SqlSession。

批处理执行器,用于将多个SQL一次性输出到数据库;

缓存执行器:缓存执行器,先从缓存中查询结果,如果存在,就返回;如果不存在,再委托给 Executor delegate 去数据库中取,delegate 可以是上面任何一个执行器。

4、对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数

5、statementHandler用于封装JDBC中的statement操作,即声明sql,设置参数、执行sql等;执行器中每执行一次SQL操作,都会通过Configuration 构建一个新的StatementHandler

6、执对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

7、执行正常则事务提交到DB,异常则回滚

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐