1.工作原理

  • Mybatis应用程序通过SQLSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SQLSessionFactory(SQLSessionFactory是县城安全的)
  • SQLSessionFactory的实力直接开启一个SQLSession,在通过SqlSession实例获取Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SQLSession。
  • sqlSession是单线程对象,因为是非线程安全的,是持久化操作的独享对象,类型JDBC的Connection,底层封装了JDBC链接。

    2.详细流程

  • 加载Mybatis全局配置文件(数据源,Mapper映射文件等),解析配置文件,Mybatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括参数映射配置,动态SQL语句,结果映射配置),其对应着select|update|delete|insert标签项
  • SQLSessionFactoryBuilder通过Configuration对象生成SQLSessionFactory,用来开发SqlSession。
  • SqlSession对象完成和数据的交互:
    • 用户程序调用Mybatis接口层api
    • SqlSession通过调用api的StatementID找到对应的MappeedStatement对象
    • 通过Executor将mappedStatement对象进行解析,SQL参数转化,动态SQL拼接,生成JDBC statement对象
    • JDBC执行SQL
    • 借助MappedStatement中的结果映射关系,将返回结果转化成HashMap,JavaBean等存储结构并返回
      Mybatis框架设计图

接口层

  • Mybatis将配置文件中的每一个节点抽象为一个Mapper接口。Mybatis的配置规范配置好后,通过SqlSession.getMapper(xxxMapper.class)方法,Mybatis会根据相应的接口信息,通过动态代理机制生成Mapper实例,确定StatementID,底层通过SqlSession.select(“statementId”, parameterOject)等来实现对数据库的操作。

    数据处理层

    • 通过传入参数构建动态SQL语句
      • Mybatis通过传入的参数值,使用Ognl来动态构造SQL语句
    • SQL语句的执行以及封装查询结果

      框架支撑层

    • 事物管理机制??
    • 连接池管理机制??
    • 缓存机制??
    • SQL语句配置方式??

3.Mybatis的主要构建及其相互关系

  • SqlSession:表示和数据库交互的会话,完成对数据库的CRUD
  • Executor:执行器,Mybatis的调度核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler:封装JDBC Statement操作,设置参数,将Statement结果集装换成List集合
  • ParameterHandler:负责对用户传递的参数转换成JDBC Statement所需参数
  • ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型集合
  • TypeHander:负责Java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement:维护一条select|update|delete|insert节点的封装
  • SQLSource:负责根据用户的parameterObject,动态生成SQL语句,将信息封装到BoundSQL对象中,并返回
  • BoundSQL:动态生成SQL语句以及相应的参数信息
  • Configuration:Mybatis所有的配置信息都绑定在该对象中