Mybatis可以干什么?

本文详细解读了Mybatis框架的特性、配置、工作流程、设计模式及应用,包括SQL分离、动态SQL、插件机制,以及与Spring集成等内容,助你理解ORM的半自动优势和实践技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(数据源)
    • 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

插件通过代理,对以上方法进行拦截增强.

  1. 编写 自定义插件,需要实现 intercept
  2. 注册
  3. 解析

插件使用的关键类

  1. interceptor 接口
  2. 自定义拦截器 (实现类)
  3. Plugin
  4. Invocation
  5. InterceptorChain

MyBatis 插件应用场景

  1. 水平分表 注解
  2. 权限控制
  3. 数据的加解密

源码

  • 第一步
  1. 读取配置文件
  2. 解析mapper 增删改查解析为Mappedstatement 对象,配置文件解析为Configuration对象
  • 第二步
  1. 创建会话
  2. 创建事务
  3. 创建执行器
  4. 插件逻辑
  5. 二级缓存
  • 第三步
  1. 获取代理对象
  • 第四步
  1. sql语句包装
  2. 插件处理
  3. 返回结果集

mybatis用到的设计模式

  1. 建造者模式
  2. 工厂模式
  3. 代理模式
  4. 模板方法模式
  5. 装饰者模式
  6. 单例模式
  7. 责任链模式
  8. 策略模式
  9. 适配器模式

pageHelper 使用

分页

ThreadLocal 线程分页副本

Mybatis 整合Spring

  • 配置关键
    • 整合的jar包
    • SqlSessionFactoryBean
    • MapperScannerConfigurer
    • 注入使用
  • 创建会话工厂
    • 解析配置文件
    • 创建Configuration
    • 返回DefaultSqlSessionFactory
  • 获取会话

DefaultSqlSessionFactory 不是线程安全的,Mybatis的SqlSessionTemplate替换它.
获取SqlsessionTemplate的两种方式

  1. 注入
  2. 继承SqlsessionDaoSupport
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值