mybatis技术内幕1-ORM

JDBC回顾

在java开发中可以使用jdbc完成数据库操作,使用jdbc的步骤如下:

  1. 注册数据库驱动
  2. 通过DriverManager获取数据库连接
  3. 通过数据库里连接创建Statement对象(PrepareStatment)
  4. 通过statement对象执行sql语句,得到resultSet对象
  5. 通过ResultSet读取数据,并将数据转换我javaBean对象
  6. 关闭ResultSet、Statement对象以及数据库连接,释放相关资源

在第5步中,需要完成关系模型到对象模型的转换,要使用比较通用的方式封装这种复杂的对象比较难,所以需要使用orm框架。

orm框架可以通过配置文件实现java对象与关系型数据库之间的转换。mybatis技术内幕1-ORM

常见的持久化框架

hibernate

hibernate主要有两类配置文件,一种是核心配置文件,一种是映射配置文件,映射配置文件就是将数据库中字段与java类中的属性相对应起来。

hibernate优点

  • hibernate的api没有侵入性,业务逻辑不需要继承hibernate任何接口,同时hibernate支持透明的持久化,延迟加载、由对象模型自动生成数据库表等。
  • hibernate具有良好的缓存机制

hibernate缺点

  • 数据库自身也是有自己组织方式,不是所有数据库概念都可以在hibernate中找到合适的映射,比如索引,存储过程以及函数等。
  • hibernate一般是查询所有列,如果想要查询部分字段时不好处理
  • 根据不同条件不好拼接sql

Spring JDBC

spring jdbc其实是使用模板方式对原生的jdbc进行了封装,这里面没有映射文件,对象查询语言以及缓存的概念,而是直接执行原生的sql语句。

Mybatis

mybatis可以通过映射文明或相应注解将resultSet映射为java对象,映射规则可以嵌套其他映射规则以及子查询,可以实现一对一,一对多,多对多的映射以及双向映射。

优点

  • 相对于hibernate,mybatis更轻量级,可控性比较高,可以在配置文件中直接写原生sql语句,因此可以优化sql,mybaits适合大数据量,高并发情形。
  • 具有良好的动态sql功能用于不同的查询条件

mybatis整体架构

mybatis整体架构分为三层,分别是基础层,核心处理层以及接口层
mybatis技术内幕1-ORM

基础支持层的部分模块

  • binding模块
    在dao中我们执行sqlSession的api时需要指定映射文件中定义的sql节点,但是binding模块可以让我们不用写dao的实现类,只需要有dao接口即可,将dao的接口与映射文件关联起来。
  • 解析器模块
    解析器主要提供了两个功能:一个功能是对Xpath进行封装,为mybatis初始化解析核心配置文件以及映射文件提供支持;另外一个功能是为处理动态sql语句中的占位符提供支持

核心处理层的部分模块

  • 配置解析
    mybatis初始化时将配置文件与接口中注解解析后形成相应对象并保存到configuration对象中。
  • sql执行涉及多个组件,比较重要的是executor(负责维护一级和二级缓存并且为事务提供支持),statementHandler,parameterHandler(完成实参绑定并得到结果集)以及resultSetHandler(结果集的映射)。