mybatis入门知识点学习笔记整理
2022-11-18 18:08:03 0 举报
AI智能生成
登录查看完整内容
mybatis入门知识点学习笔记整理
作者其他创作
大纲/内容
移植性好
效率高
对象化程度高
JPA优势
自由灵活性能较高
易于阅读和维护
支持动态SQL语句
Mybatis优势
简单操作还得写SQL
XML中大量SQL维护
自身功能有限但支持插件
Mybatis劣势
Mybatis对比JPA
无侵入损耗小强大的CRUD
支持Lambda多种数据库
主键自动生成支持AR模式
自定义全局操作关键词自动转义
内置代码生成器分页性能分析插件
内置全局拦截插件sql注入剥离器
MyBatis-Plus
建库建表
引入依赖
配置
编码
测试
步骤
接口中写抽象方法
XML或注解写SQL
Service中调接口
Controller中调用
SSM传统编程模式
@TableName("XX")
@TableId
@TableField("XX")
常用注解
transient
static
@TableField(exit=false)
排除非表字段
基本使用
快速入门
baseMapper.insert(entity)
Create
baseMapper.selectById(id)
baseMapper.selectBatchIds(idList)
baseMapper.selectByMap(columnMap)
普通查询
like
lt
ge
between
isNotNull
likeRight
orderByDesc
orderByAsc
or
and
nested
apply
inSql
in
last
groupBy
having
baseMapper.selectList(queryWrapper)
条件构造器
select()不列出全部字段
condition控制条件加入到where语句中
@TableField(condition=SqlCondition.LIKE)可控制实体的属性
实体对象作为创建条件构造器时的参数
allEq全部eq
常用于select()一起使用
selectMaps(queryWrapper)
常用于只返回一列
selectObjs(queryWrapper)
用于返回记录数
selectCount(queryWrapper)
返回一条记录多条报错
selectOne(queryWrapper)
其它使用条件构造器的方法
好处防误写
lambda条件构造器
使用注解或xml
使用条件构造器的自定义SQL
优化:构造Page时传false可不查总记录
多表分页查询时可用自定义SQL
分页查询
Retrieve
updateById(entity)
根据id更新
根据条件构造器更新
条件构造器中set方法使用
Update
deleteById(id)
根据id删除
baseMapper.deleteByMap(columnMap)
baseMapper.deleteBatchIds(idList)
普通删除
delete(queryWrapper)
条件构造器删除
Delete
CRUD
直接用实体操作数据库
首先实体类要继承Model
其次mapper要继承basemapper
MP中的实现
AR模式
AUTO
NONE
INPUT
UUID
ID_WORKER
ID_WORKER_STR
MP主键策略
类中定义
局部主键策略
yml中配置id-type
全局主键策略
主键策略
config-location
mapper-locations
type-aliases-package
基本配置
map-underscore-to-camel-case
进阶配置
field-strategy
table-prefix
DB策略配置
MP配置
基本方法
saveBatch(list)
saveOrUpdateBatch(list)
批量操作方法
lambdaQuery()
lambdaUpdate()
链式调用方法
通用service
(1) API接口层:提供给外部使用的接口 API,开发人员通过这些本地API来操纵数据库。接口层一接收<br>到 调用请求就会调用数据处理层来完成具体的数据处理。<br>MyBatis和数据库的交互有两种方式:<br>a. 使用传统的MyBati s提供的API ;<br>b. 使用Mapper代理的方式
(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根<br>据调用的请求完成一次数据库操作。
(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是<br>共 用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数<br>据库增删改查功能
SqlSession
MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓<br>存的维护
Executor
封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参<br>数、将Statement结果集转换成List集合。
StatementHandler
负责对用户传递的参数转换成JDBC Statement所需要的参数,
ParameterHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
ResultSetHandler
负责java数据类型和jdbc数据类型之间的映射和转换
TypeHandler
MappedStatement维护了一条<select | update | delete | insert>节<br>点的封 装
MappedStatement
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封<br>装到BoundSql对象中,并返回
SqlSource
表示动态生成的SQL语句以及相应的参数信息
BoundSql
主要构件
架构原理
查看顺序:二级缓存---->一级缓存--------->数据库
入口: SqlSession的clearCache()--->DefaultSqlSession的clearCache()--->Executor的clearLocalCache()--->BaseExecutor的clearLocalCache()--->PerpetualCache的clear()
级别:sqlsession级别
一级缓存
级别:namespace级别
commit()方法会清空2级缓存
二级缓存
Mybatis缓存
@Results注解
注解实现
例如SqlSessionFactoryBuilder、Environment;
Builder<br>模式
例如SqlSessionFactory、TransactionFactory、LogFactory
工厂方<br>法模式
例如 ErrorContext 和 LogFactory;
单例模<br>式
Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理<br>还有executor.loader包使用了 cglib或者javassist达到延迟加载的效果
代理模<br>式
例如SqlNode和各个子类ChooseSqlNode等;
组合模<br>式
模板方<br>法模式
例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
适配器<br>模式
例如Cache包中的cache.decorators子包中等各个装饰者的实现;
<div>装饰者</div><div>模式</div>
例如迭代器模式PropertyTokenizer;
<div>迭代器</div><div>模式</div>
设计模式
执行器:Executor (update、query、commit、rollback等方法)
SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等方 法);
参数处理器ParameterHandler (getParameterObject、setParameters方法);
结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等方法);
原理:在四大对象创建的时候<br>1、每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll(parameterHandler);<br>2、获取到所有的Interceptor (拦截器)(插件需要实现的接口);调用 interceptor.plugin(target);返<br>回 target 包装后的对象<br>3、插件机制,我们可以使用插件为目标对象创建一个代理对象;AOP (面向切面)我们的插件可 以<br>为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行
插件
使用配置文件
1.数据库配置信息存在硬编码问题
使用连接池连接
2.频繁创建、释放数据库连接
3.sql语句、参数设置、获取结果集存在硬编码问题
采用反射、内省技术
4.手动封装返回结果集,较为繁琐
传统jdbc开发存在的问题
核心配置文件:sqlMapConfig.xml(数据库配置文件)
准备配置文件
加载配置文件
sql方法
动态代理
DefaultSqlSession实现了sqlSession接口,实现其中的sql方法,动态代理方法
DefaultSqlSessionFactroy实现SqlSessionFactory接口,重写openSession方法,返回DefaultSqlSession
SqlSessionFactory接口其中定义了opensession()方法
2.创建sqlSessionFactory工厂对象:生产sqlSession
解析配置文件
核心配置类:configuration
映射配置类:MappedStatement
使用JavaBean保存解析的配置文件信息
自定义持久层框架思路
1.使用SAXReader,将字节输入流读取为Document对象
2.根据Document对象获取根对象
3.获取根对象中的节点:"namespace"以及子节点"select",遍历获得子节点中的id、resultType、paramerType,并封装到MappedStatement对应的字段中
4.将封装好的MappedStatement添加到Configuration对象的MappedStatement集合中
XMLMapperBuilder
3.获取根对象中的子节点:"property,遍历获得每个property的name和value
4.将获取到的数据库信息封装到连接池对象ComboPooledDataSource中
5.将连接池对象返回给Configuration对象的DataSource属性
6.解析mapper.xml,加载成字节输入流,返回给Configuration对象的MappedStatement集合
XmlConfigBuilder
1.注册驱动,获取连接<br>Connection connection = configuration.getDataSource().getConnection()
标记处理类,配合标记解析器完成对占位符的解析、处理工作<br>ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler()
解析出的sql<br>String parseSql = genericTokenParser.parse(sql)
1.将#{}使用?代替
#{}中解析出来的参数名称<br>List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings()
2.解析出#{}中的值进行存储
3.封装返回
BoundSql<br>完成对#{}的解析
3.获取预处理对象,preparedStatement<br>PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText())
5.执行sql<br>ResultSet resultSet = preparedStatement.executeQuery()
6.封装返回结果集
simpleExecutor<br>实现了Executor接口的query方法
动态代理方法
DefaultSqlSession
自定义持久层框架
mybatis入门知识点学习笔记整理
0 条评论
回复 删除
下一页