架构设计
API接口层:接受外部请求,调用数据处理层,完成数据处理
传统api,需要实现dao层接口。
Mapper代理方式(getMapper)
数据处理层:负责sql查找、解析、执行、结果映射等处理,根据数据调用完成一次对数据的操作。
基础支撑层:负责连接数据库管理、事务管理、配置管理以及缓存处理,这些都是共通的东西,将他们提取出来。<br>为上层数据处理提供作为基础支撑。
主要构件
SqlSession:顶层API,表示和数据库交互的会话,完成crud
Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护。
StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler:对用户传递的参数转换成JDBC Statement 所需要的参数。
ResultSetHandler : 将JDBC返回的ResultSet结果集对象转换成List类型的集合。
TypeHandler : 对java数据类型和jdbc数据类型之间的映射和转换。
MappedStatement: MappedStatement维护了一条<select|update|delete|insert>节点的封装。
SqlSource :负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回。
BoundSql :表示动态生成的SQL语句以及相应的参数信息。
Configuration:MyBatis所有的配置信息都维持在Configuration对象之中。
总体流程
加载配置并初始化<br>
触发条件:加载配置文件
处理过程:主配置文件存入到configuration。<br>SQL的配置信息加载成为一个个MappedStatement,放在内存中。
接收调用请求
触发条件:调用Mybatis提供的API(sqlSession)
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
处理操作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:<br> (A)根据SQL的ID查找对应的MappedStatement对象。<br> (B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。<br> (C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。<br> (D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。<br> (E)释放连接资源。<br>
返回处理结果:将最终的处理结果返回
设计模式
构建者模式应用
mybatis初始化非常复杂,不是一个构造器能搞定的,所以要构造者模式<br>例如 SqlSessionFactoryBuilder调用 XMLConfigBuilder并创建DefaultSqlSessionFactory
工厂模式
mybatis使用的简单工厂,例如 DefaultSqlSessionFactory 重载了很多 openSession() 方法,根据不同参数来产出产品。<br>底层的openSessionFromDataSource通过 获得 Environment 对象、创建 Transaction 对象、创建 Executor 对象、<br>创建 DefaultSqlSession 对象构建出sqlSession
代理模式
mybatis 核心。当调用Configuration的getMapper方法时,会调用 mapperRegistry.getMapper() <br>该方法又调用mapperProxyFactory.newInstance(sqlSession)生成代理对象返回。<br>MapperProxy 实现了InvocationHandler的invoke,调用完拦截的方法后,MapperMethod最终调用了执行的方法。<br>