热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatis架构分析

  我们都知道Mybatis是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度是为了消除所有的JDBC代码和参数的手工设置以及结果集的封装问题;基于

  我们都知道Mybatis是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度是为了消除所有的JDBC代码和参数的手工设置以及结果集的封装问题;基于这个一点,我们就可以知道MyBatis实际上就是对JDBC的封装,所以这节我们就来看下MyBatis是怎样对JDBC封装的,从而可以借鉴学习其他优秀框架在解决问题之初从架构设计层面的思考,然后通过执行流程分析,进一步深刻理解Mybatis的工作原理。

首先我们先来了解下MyBatis的架构设计

MyBatis 总共把功能架构分成了四部分:


接口层

  提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理, Mybatis提供了两种方式



  1. 下面的这些方法就是在 SqlSession 接口中提供的接口方法

T selectOne(String statement,Object parameter);
List selectList(String statement,Object parameter);
int insert(String statement,Object parameter);
int update(String statement,Object parameter);
int delete(String statement,Object parameter);


  1. Mapper代理的方式

    Mapper 代理的方式实际上就是通过创建接口(UserMapper 接口)的代理对象调用接口中的方法,最终执行方法调用是 Executor 对象,底层其实还是调用的传统的 API 方法。


数据处理层

数据处理层这部分主要就 JDBC 的核心内容了,包括参数映射、类型转换、SQL 解析、 SQL 执行以及结果的封装,这部分内容就可以理解成 JDBC 的核心内容,这里有几个重要类



  • ParameterHandler∶ SQL的参数处理

  • ResultSetHandler∶ 结果集处理

  • StatementHandler:封装了JDBC Statement操作,设置参数,转换结果集

  • Executor∶ MyBatis 的执行器,用于执行增删改查操作


SQL解析

  MyBatis支持两种 SQL 解析的方式,一种 xml、一种是注解;两种方式对于一些基础的 CRUD 区别不大,使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句, Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用 XML来映射语句


框架支撑层

这部分主要是框架抽取出来的通用组件包括数据源管理、事务管理、配置加载和缓存处理;为上层的数据处理层提供最基础的支撑



  • 数据源管理

    数据源的管理对于持久层的框架来说,可谓是非常的重要,稍有不慎就会浪费大量系统资源,MyBatis 也对此做了很好的支持, MyBatis 有三种内建的数据源类型 UNPOOLED、 POOLED 、 JNDI



    • UNPOOLED-这个数据源的实现会每次请求时打开和关闭连接

    • POOLED-这种数据源的实现利用"池"的概念,将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间

    • JNDI-这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI上下文的数据源引用。这种已经不用了



通常情况下,我们是会使用 POOLED 的,他可以帮我们节省很多宝贵的系统资源



  • 事务管理(transactionManager)

    在 MyBatis 中有两种类型的事务管理器(JDBC/MANAGED)它通过一个顶层的 Transaction 接口以及其不同实现JdbcTransactionManagedTransaction 来实现对事务的管理∶



    • JDBC-这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域,对应的实现类 JdbcTransaction

    • MANAGED-这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文),对应的实现类ManagedTransaction



对事务的管理,在和 Spring 整合之后,通常会用 Spring 的事务管理器



  • 缓存处理

    缓存对于持久层框架来说还是非常重要的,一定程度上可以减少和数据库的交互, MyBatis 的提供了两种缓存机制,一级缓存和二级缓存



    • 一级缓存∶ 是 SqlSession 级别的缓存,也就是会话级别的,如果两个相同的查询,第二次的查询会直接先从缓存中去拿,一级缓存也是默认开启的,这部分我们在源码分析的内容里会详细分析

    • 二级缓存:是 Mapper 级别的缓存,也就是一个 xxx.xml 内的查询是可以共用的,需要手动开启




引导层

  这部分是 MyBatis启动时核心配置文件的方式,严格来说也可以不算在架构层面,不过MyBatis也是提供了两种方式,一个是xml的方式,也是用的比较多的,一种是使用 Java API的方式比如在配置环境的时候



  • xml的方式

PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">









  • Java API的方式

Environment envirOnment= new Environment("development",transactionFactory,dataSource);
Configuration cOnfiguration= new Configuration(environment)) ;

虽然 MyBatis提供这两种方式,但是一般情况下还是使用 xml 的比较方便

小结:

这节内容主要从整体架构上分析了 Mybatis的架构设计,实际上是对JDBC的做了一些抽取和封装,主要分成了三层



  • API接口层

  • 数据处理层

  • 框架通用模块

本文原创自博客园文章,想了解Java相关知识,欢迎到我的博客踩踩~ 地址:https://www.cnblogs.com/reminis/



推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
author-avatar
Scarlett_girl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有