在进行解析之前我们将mybatis进行零件话的拆分,简单的描述每一个mybaitis零件(类)是如何进行工作的,然后mybatis如何将这些零件进行组装形成一个完整的框架进行对外的服务。 mybatis核心组件介绍
SqlSessionFactoryBuilder 用于创建sqlSessionFactory,他通过使用java自带的xpath读取配置文件创建sqlSessionFactory对象,并且将配置文件里的东西存入configuration,
Configuration: 用于描述MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取,此对象在mybatis解析配置文件的时候生成,他采用中介者模式,将大量mybatis的属性和对象封装在里面,其他对象需要的时候可以直接从这个对象里面取出使用,类似于spring 的容器,避免对象之间复杂的耦合关系,可以理解为mybatis的简易Ioc
mapperProxyFactory mapperProxyFactory,在读取配置文件的时候在读取每一个mapper的时候会创建对应的mapperProxy,方便以后创建mapper,创建对应的mapper也就是通过反射代理创建一个mapperProxy,这里创建出来的mapperProxy是懒加载的,需要用的时候创建,创建了之后有spring就放入容器里面。
sqlSessionFactory 用于创建sqlSession的工厂,通过当前的环境变量,和事务属性,为每一个执行查询的线程创建一盒sqLSession
• SqlSession: SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口,sqlsession就是用户直接使用mybatis的顶级接口,同时也是线程私有的对象,不安全不能共享,以及缓存就是sqlSession级别
• Executor: Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
• MappedStatement: MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装,一个MappedStatement对象对应Mapper配置文件中的一个select/update/insert/delete节点,主要描述的是一条SQL语句,也就是说一个mapper.xml文件解析之后可以产生多个MapperStatement,解析完了之后存储在configuration对象里面存储方式如下
Map<String, MappedStatement> mappedStatements;
key就是:mapper的nameSpace+方法名 value: mappedStatements
• StatementHandler: StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
• ParameterHandler: 当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。
• ResultSetHandler: ResultSetHandler封装了对JDBC中的ResultSet对象操作,当执行SQL类型为SELECT语句时,ResultSetHandler用于将查询结果转换成Java对象。
• TypeHandler: TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。 了解了MyBatis的核心组件后,我们再来了解一下使用MyBatis操作数据库的过程
mybatis核心工作流程图
上面介绍了mybatis的核心组件及其作用,其实不论什么项目,不论什么框架,设计者都会像进行模块的划分,总体的设计,然后分组开发,所以不论是项目还是框架,都可以看作是一个一个的零件的组合,每一个零件就是一个模块,就像变形金刚似的,当然当某一个零件(模块)有问题或者不符合你的要求的时候,我们也可以将这个模块拿出来,运用重写,继承,重载等java 的特新对项目里的一个小零件(模块)进行改造,从而打造符合你们自己的框架,这也就是二次开发。下面我画了一个流程图去描述mybatis是如何进行工作的(图片太长,我就简单分成三张,从上往下看即可)
!