一文析透Mybatis动态代理-Mybatis动态代理


一文析透Mybatis动态代理-Mybatis动态代理

文章插图
Mybatis发展到现在,各位条友都非常熟悉了,对Mybatis的使用越发的顺手,今天本文介绍Mybatis的核心原理--动态代理,并且梳理出Mybatis源码的入口点 。
背景介绍
一文析透Mybatis动态代理-Mybatis动态代理

文章插图
Mybatis是一款优秀的ORM持久层框架,也就是把数据库字段映射为对象的属性;Mybatis将JDBC进行封装,对其中的驱动,连接,资源解析等操作集中处理,简化早期JDBC的繁琐开发,让我们在开发的过程中只专注于SQL语言的编写,SQL的性能优化 。
Mybatis之前的故事在ORM映射框架没有出现之前,都是基于JDBC来对业务数据进行常见的操作,SQL逻辑也经常嵌套在代码,极大的耦合性等
使用JDBC进行数据库操作最常见的步骤如下,一起来回顾一下 。
JDBC操作数据库
  1. 导入JDBC驱动包
  2. 通过DriverManager注册驱动
  3. 创建连接
  4. 创建Statement
  5. CRUD操作
  6. 操作结果集
  7. 关闭操作
【一文析透Mybatis动态代理-Mybatis动态代理】Mybatis操作数据库
  1. 引入JDBC驱动包,
  2. 引入Mybatis包
  3. CRUD操作 。
众所周知,Mybatis底层封装JDBC来实现的 。于是我将两者的使用流程做了一个对比:
  • 在JDBC的前三个操作中,主要是做驱动加载和数据库的连接等工作;在Mybatis中统一使用配置文件进行处理 。
  • 使用JDBC需要创建Statement,这个步骤涉及参数的填充绑定;在Mybatis中仅仅使用@Param或者是其他方式进行绑定,并没有直接通过sql字符串进行操作 。
  • 使用JDBC,需要在结果集自己去控制结果游标,结果集转换等工作;在Mybatis中按照指定的返回实体类返回结果 。
  • 使用JDBC操作完成后,需要统一关闭系统资源;Mybatis并不需要 。
于是对Mybatis做了一个猜想;猜想Mybatis相对比于JDBC帮我们做了什么;假如我来设计Mybatis的架构,怎么去设计才算完美 。
Mybatis架构设计
一文析透Mybatis动态代理-Mybatis动态代理

文章插图
一、配置类/配置文件
通过分析可得,Mybatis省略了JDBC的驱动连接等操作,那么将这些模板化的东西配置化统一管理处理 。所以首先需要一个配置文件,需要连接地址、连接驱动等信息通过配置文件记录处理
二、Mapper仓库&Mapper注册中心
Sql的操作单元,作为一个Mapper接口保存,这些mapper接口需要统一注册管理、解析、使用等 。
三、执行器
Mapper得到数据后,需要一个负责解析、检查、执行的部件
四、StementHandler
拿到真正可执行的SQL后,需要和数据库操作的功能 。所以需要StementHandler,StementHandler主要的作用是执行器怎么去执行,底层依赖的Stement怎么和数据库交互等作用
五、结果集Handler
执行完SQL后,按照接口返回值适配,映射解析返回等功能
六、字段处理器
在StementHandler和结果集Handler中间有一个字段映射处理器 。主要作用是字段的映射关系的建立 。
七、Spring整合适配
优秀的框架对spring的支持也需要自己的一个适配
八、拦截器
为了让框架更有可扩展性,在如上的步骤之间都可执行拦截器供用户自己扩展适配·
Mybatis核心--JDK动态代理分析Mybatis的架构,发现其中最主要的是Mapper,Mapper是这个框架的纽带,一个Mapper接口怎么实现参数和sql绑定,怎么拿到关联的sql进行操作,怎么将结果集安装我们的要求返回 。
接下来就来揭开这个谜底---JDK动态代理 。
一文析透Mybatis动态代理-Mybatis动态代理

文章插图
JDK动态代理是什么? 简单的一句话,就是:运行时创建一个实现了一组给定接口的新类 。我们以Mybatis解析Mapper来举例子 。
1.首先:假设我有一个Mapper接口
一文析透Mybatis动态代理-Mybatis动态代理

文章插图
SysUserMapper是一个接口,是不能直接实例化的;Java基础扎实的伙伴都知道,接口是不能被实例化的