1、什么是Mybatis

  • mybatis就是一个封装来jdbc的持久层框架,它支持自定义 SQL、存储过程以及高级映射。它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架;

  • Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。

2、基本原理

MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。

3、MyBatis的主要成员

  • Configuration MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中

  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能

  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等

  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所对应的数据类型

  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合

  • TypeHandler 负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换

  • MappedStatement MappedStatement维护一条<select|update|delete|insert>节点的封装

  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

  • BoundSql 表示动态生成的SQL语句以及相应的参数信息

以上主要成员在一次数据库操作中基本都会涉及,在SQL操作中重点需要关注的是SQL参数什么时候被设置和结果集怎么转换为JavaBean对象的,这两个过程正好对应StatementHandler和ResultSetHandler类中的处理逻辑。

4、工作原理解析

Mybatis应用程序通过SqlSessionFactoryBuildermybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加**@Configuration**)来构建SqlSessionFactory(SqlSessionFactory是线程安全的);

然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

详细流程如下:

  • 1、解析配置文件(MyBatis-config.xml、Mapper.xml),MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。;

  • 2、SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。

  • 3、SqlSessionFactory创建会话SqlSession;

  • 4、执行器将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象,使用Paramterhandler填充参数,使用statementHandler绑定参数。

  • 5、JDBC执行sql,借助MappedStatement中的结果映射关系,使用ResultSetHandler将返回结果转化成HashMap、JavaBean等存储结构并返回。

  • 6、关闭sqlsession会话。

5、mybatis层次图