mybatis
2020-12-13 22:15:53 0 举报
AI智能生成
mybatis笔记
作者其他创作
大纲/内容
mybatis
自定义持久层框架
传统jdbc开发存在的问题
1.数据库配置信息存在硬编码问题
使用配置文件
2.频繁创建、释放数据库连接
使用连接池连接
3.sql语句、参数设置、获取结果集存在硬编码问题
4.手动封装返回结果集,较为繁琐
采用反射、内省技术
自定义持久层框架思路
准备配置文件
核心配置文件:sqlMapConfig.xml(数据库配置文件)
加载配置文件
解析配置文件
2.创建sqlSessionFactory工厂对象:生产sqlSession
SqlSessionFactory接口其中定义了opensession()方法
DefaultSqlSessionFactroy实现SqlSessionFactory接口,重写openSession方法,返回DefaultSqlSession
DefaultSqlSession实现了sqlSession接口,实现其中的sql方法,动态代理方法
sql方法
动态代理
使用JavaBean保存解析的配置文件信息
核心配置类:configuration
映射配置类:MappedStatement
XMLMapperBuilder
1.使用SAXReader,将字节输入流读取为Document对象
2.根据Document对象获取根对象
3.获取根对象中的节点:\"namespace\"以及子节点\"select\",遍历获得子节点中的id、resultType、paramerType,并封装到MappedStatement对应的字段中
4.将封装好的MappedStatement添加到Configuration对象的MappedStatement集合中
XmlConfigBuilder
3.获取根对象中的子节点:\"property,遍历获得每个property的name和value
4.将获取到的数据库信息封装到连接池对象ComboPooledDataSource中
5.将连接池对象返回给Configuration对象的DataSource属性
6.解析mapper.xml,加载成字节输入流,返回给Configuration对象的MappedStatement集合
DefaultSqlSession
simpleExecutor实现了Executor接口的query方法
Executor
1.注册驱动,获取连接Connection connection = configuration.getDataSource().getConnection()
BoundSql完成对#{}的解析
1.将#{}使用?代替
标记处理类,配合标记解析器完成对占位符的解析、处理工作ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler()
标记解析器,三个参数:分别为openToken (开始标记)、closeToken (结束标记)、handler (标记处 理器)GenericTokenParser genericTokenParser = new GenericTokenParser(\"#{\
解析出的sqlString parseSql = genericTokenParser.parse(sql)
2.解析出#{}中的值进行存储
#{}中解析出来的参数名称List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings()
3.封装返回
3.获取预处理对象,preparedStatementPreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText())
5.执行sqlResultSet resultSet = preparedStatement.executeQuery()
6.封装返回结果集
动态代理方法
插件
执行器:Executor (update、query、commit、rollback等方法)
SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等方 法);
参数处理器ParameterHandler (getParameterObject、setParameters方法);
结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等方法);
原理:在四大对象创建的时候1、每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll(parameterHandler);2、获取到所有的Interceptor (拦截器)(插件需要实现的接口);调用 interceptor.plugin(target);返回 target 包装后的对象3、插件机制,我们可以使用插件为目标对象创建一个代理对象;AOP (面向切面)我们的插件可 以为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行
设计模式
Builder模式
例如SqlSessionFactoryBuilder、Environment;
工厂方法模式
例如SqlSessionFactory、TransactionFactory、LogFactory
单例模式
例如 ErrorContext 和 LogFactory;
代理模式
Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理还有executor.loader包使用了 cglib或者javassist达到延迟加载的效果
组合模式
例如SqlNode和各个子类ChooseSqlNode等;
模板方法模式
适配器模式
例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
装饰者模式
例如Cache包中的cache.decorators子包中等各个装饰者的实现;
迭代器模式
例如迭代器模式PropertyTokenizer;
注解实现
@Results注解
Mybatis缓存
查看顺序:二级缓存---->一级缓存--------->数据库
一级缓存
入口: SqlSession的clearCache()--->DefaultSqlSession的clearCache()--->Executor的clearLocalCache()--->BaseExecutor的clearLocalCache()--->PerpetualCache的clear()
级别:sqlsession级别
二级缓存
级别:namespace级别
commit()方法会清空2级缓存
架构原理
(1) API接口层:提供给外部使用的接口 API,开发人员通过这些本地API来操纵数据库。接口层一接收到 调用请求就会调用数据处理层来完成具体的数据处理。MyBatis和数据库的交互有两种方式:a. 使用传统的MyBati s提供的API ;b. 使用Mapper代理的方式
(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共 用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
主要构件
SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler
封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler
负责对用户传递的参数转换成JDBC Statement所需要的参数,
ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
TypeHandler
负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement
MappedStatement维护了一条<select | update | delete | insert>节点的封 装
SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql
表示动态生成的SQL语句以及相应的参数信息
0 条评论
回复 删除
下一页