mybatis
2020-12-13 22:15:53 0 举报
AI智能生成
mybatis笔记
作者其他创作
大纲/内容
自定义持久层框架
传统jdbc开发存在的问题
1.数据库配置信息存在硬编码问题
使用配置文件
2.频繁创建、释放数据库连接
使用连接池连接
3.sql语句、参数设置、获取结果集存在硬编码问题
使用配置文件
4.手动封装返回结果集,较为繁琐
采用反射、内省技术
自定义持久层框架思路
准备配置文件
核心配置文件:sqlMapConfig.xml(数据库配置文件)
sql配置文件:mapper,xml
加载配置文件
根据配置文件路径,加载配置文件:Resources
解析配置文件
1.使用dom4j解析配置文件,将解析出来的内容封装到configuration中
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
1.使用SAXReader,将字节输入流读取为Document对象
2.根据Document对象获取根对象
3.获取根对象中的子节点:"property,遍历获得每个property的name和value
4.将获取到的数据库信息封装到连接池对象ComboPooledDataSource中
5.将连接池对象返回给Configuration对象的DataSource属性
6.解析mapper.xml,加载成字节输入流,返回给Configuration对象的MappedStatement集合
DefaultSqlSession
sql方法
实际执行了simpleExecutor.query(configuration, mappedStatement, params)
simpleExecutor
实现了Executor接口的query方法
实现了Executor接口的query方法
Executor
1.注册驱动,获取连接
Connection connection = configuration.getDataSource().getConnection()
Connection connection = configuration.getDataSource().getConnection()
2.获取sql语句,转化sql语句
String sql = mappedStatement.getSql()
转化过程中,还需对#{}中的值进行解析存储
BoundSql boundSql = getBoundSql(sql)
String sql = mappedStatement.getSql()
转化过程中,还需对#{}中的值进行解析存储
BoundSql boundSql = getBoundSql(sql)
BoundSql
完成对#{}的解析
完成对#{}的解析
1.将#{}使用?代替
标记处理类,配合标记解析器完成对占位符的解析、处理工作
ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler()
ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler()
标记解析器,三个参数:分别为openToken (开始标记)、closeToken (结束标记)、handler (标记处 理器)
GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", parameterMappingTokenHandler
GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", parameterMappingTokenHandler
解析出的sql
String parseSql = genericTokenParser.parse(sql)
String parseSql = genericTokenParser.parse(sql)
2.解析出#{}中的值进行存储
#{}中解析出来的参数名称
List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings()
List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings()
3.封装返回
BoundSql boundSql = new BoundSql(parseSql, parameterMappings);
return boundSql;
return boundSql;
3.获取预处理对象,preparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText())
PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText())
4.设置参数,获取到参数的全路径
5.执行sql
ResultSet resultSet = preparedStatement.executeQuery()
ResultSet 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 (面向切面)我们的插件可 以
为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行
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达到延迟加载的效果
还有executor.loader包使用了 cglib或者javassist达到延迟加载的效果
组合模
式
式
例如SqlNode和各个子类ChooseSqlNode等;
模板方
法模式
法模式
例如SqlNode和各个子类ChooseSqlNode等;
适配器
模式
模式
例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
装饰者
模式
例如Cache包中的cache.decorators子包中等各个装饰者的实现;
迭代器
模式
例如迭代器模式PropertyTokenizer;
注解实现
@Results注解
@Results({@Result(column= ,property=, javaType= ,one=@one(select=""),many=@many(select="")),@Result()})
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代理的方式
到 调用请求就会调用数据处理层来完成具体的数据处理。
MyBatis和数据库的交互有两种方式:
a. 使用传统的MyBati s提供的API ;
b. 使用Mapper代理的方式
(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根
据调用的请求完成一次数据库操作。
据调用的请求完成一次数据库操作。
(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是
共 用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
共 用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
主要构件
SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数
据库增删改查功能
据库增删改查功能
Executor
MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓
存的维护
存的维护
StatementHandler
封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参
数、将Statement结果集转换成List集合。
数、将Statement结果集转换成List集合。
ParameterHandler
负责对用户传递的参数转换成JDBC Statement所需要的参数,
ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
TypeHandler
负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement
MappedStatement维护了一条<select | update | delete | insert>节
点的封 装
点的封 装
SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封
装到BoundSql对象中,并返回
装到BoundSql对象中,并返回
BoundSql
表示动态生成的SQL语句以及相应的参数信息
0 条评论
下一页