MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析

作者 : admin 本文共2630个字,预计阅读时间需要7分钟 发布时间: 共26人阅读

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析

自定义持久层框架

JDBC问题分析

  1. 数据库配置信息存在硬编码问题 //解决:配置文件
  1. 频繁创建释放数据库连接 //解决:连接池
  1. Sql语句、设置参数、获取结果集参数均存在硬编码问题 //解决:配置文件
  1. 需要手动封装返回结果集,较为繁琐 //解决:反射、内省

//内省:即运行时获取JavaBean的properties,events和methods的过程称为Java内省。简而言之,即检视JavaBean内部的信息,如方法,属性,事件。主要用来运行时获取JavaBean的内部信息。

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图

     MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(1)

自定义持久层框架设计思路

使用端:(项目):自定义持久层框架的jar包

提供两部分配置信息:数据库配置信息、sql配置信息:sql语句、参数类型、返回值类型

使用配置文件来提供这两部分配置信息:

1)sqlMapConfig.xml:存放数据库配置信息,存放mapper.xml的全路径

2)Mapper.xml:存放sql配置信息

 

自定义持久层框架本身:(工程):本质就是对JDBC进行了封装

1)加载配置文件:根据配置文件的路径,加载配置文件成字节输入流,存储在内存中

创建Resources类 方法:InputStream getReSourcesAsStream(StrIng path)

2) 创建两个JavaBean:(容器对象):存放的就是配置文件解析出来的内容

Configuration:核心配置类:存放sqlMapperConfig.xml解析出来的内容

MapperStatement:映射配置类:存放mapper.xml解析出来的内容

3)解析配置文件:dom4j

创建类:SqlSessionFactoryBuilder 方法:build(InputStream in)

第一:使用dom4j解析配置文件,将解析出来的内容封装到容器对象中

第二:创建SqlSessionFactory对象;生产sqlSession:会话对象(工厂模式)

4)创建SqlSessionFactory接口及实现DefaultSqlSessionFactory

第一:openSession():生产sqlSession

5)创建SqlSession接口及实现类DefaultSession

定义对数据库的crud操作:selectList()

selectOne()

update()

delete()

6) 创建Executor接口及实现类SimpleExecutor实现类

query(Configuration,MapperStatement,Object…params):执行的就是JDBC代码

MyBatis基础回顾及高级应用

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(2)

Mybatis动态标签

Mybatis提供了9种动态的SQL标签:<if/>,<choose/>,<when/><otherwise/>,<trim/>,<where/>(可删除sql里的第一个and),<set/>,<foreach/>,<bind/>

Mybatis注解开发

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(3)

 

Mybatis缓存

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(4)

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(5)

PS:Mybatis会默认开启一级缓存

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(6)

 

先查询用户,然后修改用户,再次查询用户的时候,不会调用第一次缓存中的内容,而是对缓存进行了修改,重新执行了一条sql语句

一级缓存原理探究与源码分析

一级缓存是什么?

一级缓存的底层数据结构是一个HashMap。

创建流程是什么?

调用query()方法,判断是否有缓存存在,若存在,调用,反之,生成。

二级缓存回顾

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(7)

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(8)

注:二级缓存需要手动开启

注解形式:

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(9)

Xml形式:

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(10)

二级缓存中缓存的不是对象,而是数据,缓存命中时,会从二级缓存中拿取数据,重新封装成对象,进行返回。

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(11)

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(12)

Mybatis-Redis

为什么Redis默认文件名为redis.properties?

因为RedisConfigurationBuilder默认先从redis.properties加载相关配置。

 

Mybatis使用Redis实现二级缓存

导入mybatis-redis依赖,替换mybatis缓存实现类

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(13)

Mybatis插件

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(14)

插件原理:使用动态代理,对原生对象生成代理对象。

以下是Mybatis的四个核心对象

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(15)

自定义Mybatis插件

1.使用注解确定需要拦截哪个核心对象的哪个方法,将拦截器生成代理存储到拦截器链中MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(16)

2.在sqlMapConfig.xml中进行插件的配置

Mybatis源码剖析

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(17)

主要构件及相互关系

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(18)

Mybatis层次结构

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(19)

Mybatis执行Sql流程

Executor源码剖析

1)SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

2)ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String,Statement>内,供下一次使用。

3)BatchExecutor:执行update,将所有sql都添加到批处理中,等待统一执行,它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行批处理。与JDBC批处理相同。

这三种Executor的作用范围都在SqlSession生命周期范围内。

设计模式

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(20)

Builder

使用多个简单对象,一步一步构建成一个复杂对象。

主要步骤(以生产computer为例):

1)将需要构建的目标类分成多个部件

2)创建构建类

3)依次创建部件

4)将部件组装成目标对象

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(21)

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析插图(22)

工厂模式

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

使用场景:SqlSessionFactory

代理模式

代理(Proxy)是一种设计模式,提供了间接对目标对象进行访问的方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能.

这就符合了设计模式的开闭原则,即在对既有代码不改动的情况下进行功能的扩展。

使用场景:getMapper

 

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析

MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析


滴石it网-Java学习中高级和架构师教程_Java企业级开发项目实战下载 » MyBatis系列之Mybatis源码解读 持久层框架设计实现及mybatis源码分析

常见问题FAQ

发表回复

开通VIP 享更多特权,建议使用QQ登录