持久层框架设计实现及mybatis源码分析

自定义持久层框架

JDBC问题分析

  1. 数据库配置信息存在硬编码问题 //解决:配置文件

  1. 频繁创建释放数据库连接 //解决:连接池

  1. Sql语句、设置参数、获取结果集参数均存在硬编码问题 //解决:配置文件

  1. 需要手动封装返回结果集,较为繁琐 //解决:反射、内省

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

     

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

使用端:(项目):自定义持久层框架的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提供了9种动态的SQL标签:<if/>,<choose/>,<when/><otherwise/>,<trim/>,<where/>(可删除sql里的第一个and),<set/>,<foreach/>,<bind/>

Mybatis注解开发

 

Mybatis缓存

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

 

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

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

一级缓存是什么?

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

创建流程是什么?

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

二级缓存回顾

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

注解形式:

Xml形式:

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

Mybatis-Redis

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

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

 

Mybatis使用Redis实现二级缓存

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

Mybatis插件

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

以下是Mybatis的四个核心对象

自定义Mybatis插件

1.使用注解确定需要拦截哪个核心对象的哪个方法,将拦截器生成代理存储到拦截器链中

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

Mybatis源码剖析

主要构件及相互关系

Mybatis层次结构

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生命周期范围内。

设计模式

Builder

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

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

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

2)创建构建类

3)依次创建部件

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

工厂模式

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

使用场景:SqlSessionFactory

代理模式

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

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

使用场景:getMapper

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值