Mybatis小白(自用,想到啥写啥+图片摘要)
SqlSessionFactory工厂对象创建分析
Mybatis的两个配置文件
mybatis-configs.xml,为初始化入口文件,里面是基础环境的支撑。
XxxMapper.xml为mybatis中的映射文件。
XmlConfigBuilder 读取解析配置文件
XmlMapperBuilder 读取解析映射文件,解析为一条条的MapperedStatement ,并封装入Map<命名空间+id,sql语句,id,结果集,映射类型等等等>
Configuration,把上述两个配置文件封装,
SqlSessionFactoryBuilder读取Configuration,去构建SqlSessionFactory
基于建造模式,创建了各种配置对象,基于配置对象,构建了工厂对象(工厂模式的体现)
时序分析
用户调用,基于资源resource(配置文件),调用getResourceAsStream(resource),返回给用户一个输入流。
用户再调用SqlSessionFactoryBuilder对象的build方法,传进去这个流对象
底层需要解析这个流对象,传给XmlConfigBuilde,并通过XmlConfigBuilder对象中的parse方法解析这个流,并返回,Configuration对象,给SqlSessionFactoryBuilder对象。并调用build方法,
系统底层创建DefaultSqlSessionFactory,传入了config,再返回DefaultSqlSessionFactory给SqlSessionFactoryBuilder再返回给用户,就拿到了sqlSessionFactory
SqlSession对象应用过程分析(与数据库进行会话的入口对象)
一个工厂,可以对应多个会话对象(SqlSession对象),由DefaultSqlSession对象实现。调用方法执行的具体访问时,需要基于一个Executor(接口)执行器,进行操作,基于不同的sql请求,创建具体的Executor 策略模式的体现 。若默认开始了二级缓存,创建的就是CacheExecutor,没有开始二级缓存,就是SimpleExecutor,若OpenSession的时候,指定Executor类型,执行一个批处理的动作,底层就会创建BatchExecutor。
通过发送MappedStatement,到StatementHandler(处理器),若sql语句,没有预编译,就创建SimpleStatementHandler,若有预编译,则创建PrepareStatementHandler,若调用了存储过程,则创建了CallableStatementHandler.
ParameterHandler把对象持久化数据库,进行参数处理
ResultSetHandler,处理结果集
TypeHandler进行,数据库与java对象的类型转换
通过SqlSession对象的getMapper方法,创建代理对象
当我们调用DefaultSqlSession的getMapper(class)方法,系统底层调用Configuration的getMapper(class)方法,在调用MapperRegistry的getMapper(class,sqlSession),调用MapperProxyFactory的newInstance()创建了一个代理对象。
代理对象应用过程分析
用户拿到代理对象,去执行MapperProxy的invoke方法,通过MapperMethod(对CRUD的封装)的execute方法去执行具体的业务
最终都会到SelectXxx,效率更好。