Mybatis 可以解决什么?
- 重复代码
- 资源管理
- ResultSet POJO list Map Blog
- SQL 耦合
hibernate 框架是全自动的ORM,一致性好,只需要修改方言,自己没有编写sql语句.
缺点是不太灵活
Mybatis 框架是半自动的ORM.
Mybatis的特性
- 使用连接池对连接进行管理
- SQL和代码分离,集中管理
- 参数映射和动态sql
- 结果集映射
- 缓存管理
- 重复sql的提取(标签)
- 插件机制
Mybatis 全局配置文件
- configuration
- properties (属性)
- settings (设置)
- typeAliases (类型别名)
- typeHandles (类型处理器)
- objectFactory (对象工厂)
- plugins (插件)
- environments (环境配置)
- environment (环境变量)
- transactionMapper (事务管理器)
- dataSource(数据源)
- environment (环境变量)
- databaseldProvider (数据库工厂标识)
- mapper (映射器)
- cache 该命名空间的缓存配置
- cache-ref 引用其他命名空间的缓存配置
- resultMap 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素
- sql 可悲其他语句引用的可宠用语句块
- insert 映射插入语句
- update 映射更新语句
- delete 映射删除语句
- select 映射查询语句
- id
- paramenterType
- paramenterMap
- resultType
- resultMap
- flushCache
- useCache
- timeout
- fetchSize
- timeout
- fetchSize
- statementType
- resultSetType
动态SQL
- if 判断
- choose 条件判断(单选关系)
- trim 多余的and 和 逗号去掉
- foreach 对集合遍历(批量操作)
批量操作
减少io消耗 执行sql需要解析,验证,优化
嵌套查询
- 一对一
- 一对多
- 多对多
延迟加载
一对多的情况下用到延迟加载
没有用到的子查询不加载,用到的时候再加载.
通用mapper
利用泛型,把自动生成代码的mysql公共的方法名封装
mybatis工作流程
- Configuration 解析配置文件创建工厂类
- SqlSessionFactory
- SqlSession
- Executor
- StatementHandler
- 处理参数
- 处理结果集
Mybatis 架构分层
- 接口层
- sqlSession
- 核心层
- 配置解析
- 参数处理
- Sql执行
- 结果映射
- 基础层
- I/O
- 日志
- 缓存
- 数据源
- 事务
- 反射
缓存
一级缓存(localCacheScope)
作用范围是会话级别,更新操作会导致缓存更新.
二级缓存(cacheEnabled)
作用范围是namespace,和事务绑定.二级缓存也是在增删改后清空缓存. 二级缓存和事务是绑定到一块的,commit报错会回滚.保证数据库和缓存一致.
flushCache 是清空缓存,增删改操作默认flushCache是true,所以执行增删改操作后会清空缓存
核心对象
- Configuration 配置文件类
- DefaultSqlSession 调用增删改查的类
- Executor 执行器类
- StatementHandler 封装JDBC对数据库的操作方法
- ParameterHandler 处理请求参数类
- ResultSetHandler 处理结果集类
- MapperProxy 通过反射,找到代码调用哪个sql的类
- MappedStatement 存储Mapper文件中的解析数据,根据方法名找到sql,并且交给执行器执行的关键类
插件工作原理
- StatementHandler
- Executor
- 处理参数 ParameterHandler
- 处理结果集 ResultSetHandler
插件通过代理,对以上方法进行拦截增强.
- 编写 自定义插件,需要实现 intercept
- 注册
- 解析
插件使用的关键类
- interceptor 接口
- 自定义拦截器 (实现类)
- Plugin
- Invocation
- InterceptorChain
MyBatis 插件应用场景
- 水平分表 注解
- 权限控制
- 数据的加解密
源码
- 第一步
- 读取配置文件
- 解析mapper 增删改查解析为Mappedstatement 对象,配置文件解析为Configuration对象
- 第二步
- 创建会话
- 创建事务
- 创建执行器
- 插件逻辑
- 二级缓存
- 第三步
- 获取代理对象
- 第四步
- sql语句包装
- 插件处理
- 返回结果集
mybatis用到的设计模式
- 建造者模式
- 工厂模式
- 代理模式
- 模板方法模式
- 装饰者模式
- 单例模式
- 责任链模式
- 策略模式
- 适配器模式
pageHelper 使用
分页
ThreadLocal 线程分页副本
Mybatis 整合Spring
- 配置关键
- 整合的jar包
- SqlSessionFactoryBean
- MapperScannerConfigurer
- 注入使用
- 创建会话工厂
- 解析配置文件
- 创建Configuration
- 返回DefaultSqlSessionFactory
- 获取会话
DefaultSqlSessionFactory 不是线程安全的,Mybatis的SqlSessionTemplate替换它.
获取SqlsessionTemplate的两种方式
- 注入
- 继承SqlsessionDaoSupport