type
status
date
slug
summary
tags
category
icon
password
AI summary

一、设计

思考:1、映射器的注册提供注册机处理,满足用户可以在使用的时候
提供一个包的路径即可完成扫描和注册
,2、对 SqlSession 进行规范化处理,让它可以把我们的映射器代理和方法调用进行包装
notion image
sqlsessionFactory:sqlSession的创建工厂,通过openSession()创建出sqlsession sqlsession:规范化处理,其中selectOne是数据库的查询操作,getMapper获取对应的映射器 MapperRegister:扫描包路径下的所有接口,并对其进行代理,注册到mapperProxyMap上 MapperProxyFactory:上一步有说明,映射器MapperProxy工厂,newInstance()方法创建映射器 MapperProxy:代理对象,对数据库进行操作

二、实现

notion image
MapperRegistry 提供包路径的扫描和映射器代理类注册机服务,完成接口对象的代理类注册处理。
SqlSession、DefaultSqlSession 用于定义执行 SQL 标准获取映射器以及将来管理事务等方面的操作。基本我们平常使用 Mybatis 的 API 接口也都是从这个接口类定义的方法进行使用的。
SqlSessionFactory 是一个简单工厂模式,用于提供 SqlSession 服务,屏蔽创建细节,延迟创建过程。

2.1代码结构

2.2映射器注册机类

MapperRegistry 映射器注册类的核心主要在于提供了 ClassScanner.scanPackage 扫描包路径,调用 addMapper 方法,给接口类创建 MapperProxyFactory 映射器代理类,并写入到 knownMappers 的 HashMap 缓存中。
另外就是这个类也提供了对应的 getMapper 获取映射器代理类的方法,其实这步就包装了我们上一章节手动操作实例化的过程,更加方便在 DefaultSqlSession 中获取 Mapper 时进行使用

2.3SqlSession的标准定义

目前只定义了selectOne查询,后续会新增
getMapper获取已注册在MapperRegistry 的代理对象

2.3SqlSession标准实现

MapperRegistry 获取代理对象

2.4SqlSessionFactory 工厂定义

简单工厂的接口,定义了开启sqlSession的能力
简单工厂实现,处理开启 SqlSession 时,对 DefaultSqlSession 的创建以及传递 mapperRegistry,这样就可以在使用 SqlSession 时获取每个代理类的映射器对象了

3.、测试

定义的接口
ApiTest
结果:
从结果来看,我们自定义的接口已经被MapperRegister 扫描到,完成了简单注册和代理功能

4、总结

SqlSessionFactory 的工厂实现类包装了 SqlSession 的标准定义实现类,并由 SqlSession 完成对映射器对象的注册和使用。
本章学习要注意几个重要的知识点,包括:映射器、代理类、注册机、接口标准、工厂模式、上下文。这些工程开发的技巧都是在手写 Mybatis 的过程中非常重要的部分,了解和熟悉才能更好的在自己的业务中进行使用。
B树与二叉树【手写Mybatis】step01:创建简单的代理工厂