200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > MyBatis源码分析(一)MyBatis整体架构分析

MyBatis源码分析(一)MyBatis整体架构分析

时间:2022-01-24 01:36:18

相关推荐

MyBatis源码分析(一)MyBatis整体架构分析

文章目录

系列文章索引一、为什么要用MyBatis1、原始JDBC的痛点2、Hibernate 和 JPA3、MyBatis的特点4、MyBatis整体架构5、MyBatis主要组件及其相互关系6、MyBatis源码的特点 二、源码环境搭建未完待续

系列文章索引

MyBatis源码分析(一)MyBatis整体架构分析

MyBatis源码分析(二)SqlSessionFactory的构建及配置文件读取过程

MyBatis源码分析(二、续)SqlSource创建流程,SQL如何解析?如何将#{id}变成?的

MyBatis源码分析(三)SqlSession的执行主流程

MyBatis源码分析(四)插件拦截器的原理及使用

MyBatis源码分析(四、续)MyBatis分页插件拦截器设计与实现

MyBatis源码分析(五)一级缓存与二级缓存的原理

MyBatis源码分析(六)MetaObject工具类的使用与源码分析

MyBatis源码分析(七)MyBatis与Spring的整合原理与源码分析

深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

一、为什么要用MyBatis

1、原始JDBC的痛点

在传统JDBC场景下,SQL 夹杂在Java代码中耦合度高,导致硬编码内伤。并且维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见,更何况代码冗长,开发效率低。

工作时间比较长的小伙伴,或者参与过老项目的小伙伴们,对下面的代码肯定不陌生。

Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");// 加载驱动} catch (ClassNotFoundException e) {e.printStackTrace();}conn = DriverManager.getConnection("url");PreparedStatement pst = null;try {conn.setAutoCommit(false);pst = conn.prepareStatement("select * from user");ResultSet resultSet = pst.executeQuery();// 循环操作resultSet获取每行每列的数据。。。。mit();} catch (SQLException e) {e.printStackTrace();try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}} finally {try {if (pst != null) pst.close();} catch (SQLException e) {e.printStackTrace();}}

所以,市面上有很多数据库的操作工具,都在尽可能的封装JDBC这一套流程,使开发人员可以更专注于业务开发。

MyBatis也不例外,都绕不开这一套JDBC的操作流程。

2、Hibernate 和 JPA

操作简便,开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生产的 SQL,不容易做特殊优化基于全映射的全自动框架,大量字段的POJO 进行部分映射时比较困难。 反射操作太多,导致数据库性能下降

3、MyBatis的特点

轻量级,性能出色 SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据开发效率稍逊于Hibernate,但是完全能够接受

MyBatis提供的可以自定义复杂sql的机制,可以完美的结合sql优化,应对当前环境数据多查询慢的情况。

所以说,MyBatis 是一个 半自动的ORM(Object Relation Mapping) 框架。

4、MyBatis整体架构

mybatis架构四层作用:

Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。

数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作.

框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑.

引导层:引导层是配置和启动MyBatis 配置信息的方式

5、MyBatis主要组件及其相互关系

SqlSession:是Mybatis对外暴露的核心API,提供了对数据库的DRUD操作接口。

Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护

StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如PrepareStatement参数的设置以及结果集的处理。

ParameterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置

ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回

TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能

MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明SQL的封装

Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块

6、MyBatis源码的特点

MyBatis的源码不像Spring的源码那样,注释写的并没有很清楚明白。

而且提供的扩展点确实也有限,不过对于开发人员却也是足够了。

所以,很多公司推出了MyBatis-Plus来对MyBatis进行了增强,由于MyBatis的扩展机制较差,MyBatis-Plus几乎所有的扩展点都是对MyBatis源码的复写,而不是通过接口来扩展。

MyBatis源码可以说是略有瑕疵,虽比不上Spring,但是也是目前最好用的ORM框架之一了。

不同版本MyBatis源码可能会稍有不同,但是主流程是差不多的,思想是没有变化的。

二、源码环境搭建

mybatis源码地址:/mybatis/mybatis-3

或者根据官方文档,编写测试代码进行测试:/mybatis-3/zh/getting-started.html

我们就直接按照官方文档的方式,进行源码分析。

未完待续

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。