zoukankan      html  css  js  c++  java
  • [一天一个进阶系列]

    前言:一直以来,很多人都是拿来主义,只停留在会使用的阶段,从未去研究挖掘其原理,剖析本质。现在慢慢探讨一下其内幕,抛砖引玉

    一、简介

    1)常用的持久化框架

    • Hibernate:是一款Java世界中最著名的ORM框架之一
    • JPA(Java Persistence API): 是EJB 3 .0中持久化部分的规范,但它可以脱离EJB的体系单
      独作为一个持久化规范进行使用
    • Spring JDBC:严格来说,Sring JDBC不能算是一个ORM架,它仅仅是使用模板方式对原生DBC行了一层非常薄的封装
    • MyBatis: MyBatis前身是Apache基金会的开源项目iBatis,在2010 年该项目脱离Apache基金会并正式更名为MyBatis

    2)使用步骤

    • 传统的JDBC编程中的查询操作为例进行说明,其主要步骤如下:
      • 1 注册数据库驱动类 ,明确指定数据库URL地址、数据库用户名、密码等连接信息
      • 2 通过DriverManager打开数据库连接
      • 3 通过数据库连接创建Statement对象
      • 4 通过 Statement 对象执行 SQL 语句,得到 ResultSet 对象
      • 5 通过 ResultSet 读取数据,并将数据转换成 JavaBean 对象
      • 6 关闭 ResultSetStatement 对象以及数据库连接,释放相关资源

      java操作数据库

    • 使用MyBatis,其主要步骤如下:
      • 1 配置mybatis-config.xml配置文件, 配置数据库的URL地址、数据库用户名和密码、别名信息、映射配置文件的位置以及一些全局配置信息
      • 2 应用程序首先会加载mybatis-config.xml配置文件
      • 3 井根据配置文件的内容创建 SqlSessionFactory 对象
      • 4 通过 SqlSessionFactory 对象创建 SqlSession 对象, SqlSession 接口中定义了执行SQL语句所需要的各种方法
      • 5 通过 SqlSession 对象执行映射配置文件中定义的 SQL 语句,完成相应的数据操作
      • 6 通过 SqlSession 对象提交事务,关闭 SqlSession 对象

    3)Mybatis整体架构

    • 整体结构图
    • 一条sql大致的执行过程
    ① 基础支持层
    • 反射模块

      • 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,Java中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射模块,该模块位于 org.apache.ibatis.reflection 包中,它对常见的反射操作做了进一步封装,提供了更加简洁方便的反射API
    • 类型转换模块

      • 功能
        • 1 别名机制
        • 2 转换机制:在为 SQL 语句绑定实参时, 会将数据由 Java 类型转换成 JDBC 类型;而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型
    • 日志模块:

      • 功能
        • 1 提供详细的日志输出信息
        • 2 集成第三方日志框架
    • 资源加载模块

      • 功能
        • 1 对类加载器进行封装,确定类加载器的使用顺序
        • 2 提供了加载类文件以及其他资源文件的功能
    • 解析器模块

      • 功能
        • 1 对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持
        • 2 为处理动态 SQL 语句中的占位符提供支持
    • 数据源模块:提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中

    • 事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现,与 Spring 框架集成,并由 Spring 框架管理事务

    • 缓存模块

      • 功能
      • 1 提供一级缓存和二级缓存
      • 简单的缓存使用图

        注意: MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时 ,优先考虑使用 RedisMemcache 等缓存产品
    • Binding模块:MyBatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作,开发人员无须编写自定义 Mapper 接口的实现, MyBatis 会自动为其创建动态代理对象

    ② 核心处理层
    • 配置解析
      • MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中
    • SOL 解析与 scripting 模块
      • 为了将开发人员从这项枯燥无趣的工作中解脱出来, MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点
      • scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参
    • SOL 执行:语句的执行涉及多个组件 ,其中比较重要的是ExecutorStatementHandlerParameterHandlerResulSetHandler,步骤如下:
      • 1 Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给 StatementHandler 完成
      • 2 StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过java.sql.Statement 对象执行 SQL 语句并得到结果集
      • 3 最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回
    • 插件:可以通过添加用户自定义插件的方式对 MyBatis 进行扩展,用户自定义插件也可以改变 Mybatis 的默认行为
    ③ 接口层
    • 接口层相对简单,其核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作

    总结

    • 本篇简单介绍了 MyBatis 整体架构及各层之间的功能。若要用好并深入,请关注下一篇原理剖析篇
    明明可以靠才华吃饭,非要靠脸~
  • 相关阅读:
    POJ 3624 Charm Bracelet 简单01背包
    POJ 1426 Find The Multiple BFS
    HDU 2612 Find a way BFS,防止超时是关键
    P3399 丝绸之路(线性二维dp)
    洛谷P1726 上白泽慧音(Tarjan强连通分量)
    codevs1557 热浪(堆优化dijkstra)
    P1462 通往奥格瑞玛的道路(二分答案+最短路)
    洛谷P1330 封锁阳光大学(二分图染色)
    洛谷P1341 无序字母对(欧拉回路)
    洛谷P1613 跑路(最短路+倍增)
  • 原文地址:https://www.cnblogs.com/lycsmzl/p/14361781.html
Copyright © 2011-2022 走看看