Qouson's blog Qouson's blog
首页
  • Java 基础

    • 基础
    • String
  • Java 中级

    • 网络编程
  • Java 高级

    • JVM
    • 多线程
  • Spring
  • SpringMVC
  • SpringBoot
  • MySQL
  • Redis
  • MQ
  • ZooKeeper
  • git
  • linux
  • 设计模式
  • 数据结构与算法
  • 计算机基础
  • Java相关框架
  • 分布式
  • DDD领域驱动设计
  • 系统设计
  • 杂乱无章
Java知识图谱
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

qouson

Java界的小学生
首页
  • Java 基础

    • 基础
    • String
  • Java 中级

    • 网络编程
  • Java 高级

    • JVM
    • 多线程
  • Spring
  • SpringMVC
  • SpringBoot
  • MySQL
  • Redis
  • MQ
  • ZooKeeper
  • git
  • linux
  • 设计模式
  • 数据结构与算法
  • 计算机基础
  • Java相关框架
  • 分布式
  • DDD领域驱动设计
  • 系统设计
  • 杂乱无章
Java知识图谱
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • git

  • linux

  • 设计模式

  • 数据结构与算法

  • 计算机基础

  • Java相关框架

    • MyBatis
      • 源码分析
      • 常见问题
        • MyBatis优缺点
        • 优点
        • 缺点
        • MyBatis中的${}和#{}的区别
        • MyBatis和Hiberate的区别
        • 开发速度
        • 开发工作量
        • SQL优化
        • 对象管理
        • 缓存机制
        • MyBatis插件的原理
  • 分布式

  • DDD领域驱动设计

  • 系统设计

  • DevOps

  • python

  • 杂乱无章

  • 更多
  • Java相关框架
qouson
2024-06-01
目录

MyBatis

# MyBatis

mybatis 是一个支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。ORM(Object Relational Mapping)对象关系映射

# 源码分析

  • SqlSessionFactoryBuilder().build(inputStream),解析配置文件,创建SqlSessionFactory,封装到configuration中
    • XMLConfigBuilder().parse()
      • xml解析
      • 数据库环境配置
      • 类型处理器
      • 别名处理器
      • 插件
    • XmlMapperBuilder().parse()
      • 解析mapper.xml
      • CRUD
      • resultMap
  • 数据源
    • 解析proterties文件
    • 解析config.xml
    • xml映射到JavaBean
    • 创建数据源dataSource
  • 执行语句
    • mappers,有多种获取方式,优先级从上到下
      • package
      • resources
      • url
      • mapper interface classes
    • 封装成MappedStatement
  • 操作数据库
    • 执行器Eexcutor
      • 执行器类型
        • SIMPLE:默认
        • REUSE:复用
        • BATCH:批量
      • 一级缓存开启所在源码
        • BaseExecutor
        • SqlSession级别的
      • 开启二级缓存
        • CachingExecutor,包装BaseExecutor
        • 灵活性不高,一般不使用
    • 执行过程
      • configuration.getMappedStatement()
      • 语法引擎,改写sql
    • 缓存一致性
  • 插件(责任链模式)
    • 增强四大核心对象,动态代理
      • Eexcutor
      • StaementHandler
      • ParamterHandler
      • ResultSetHandler
    • 插件举例
      • 分页插件
      • 读写分离插件

# 常见问题

# MyBatis优缺点

# 优点

  • 基于SQL变成,编写SQL与程序解耦,便于管理
  • 封装了JDBC一套,减少代码量,减少连接维护
  • 很好的与多种数据库兼容,只要支持JDBC,MyBatis就能支持
  • 很好的与Spring集成

# 缺点

  • 提供映射标签,对开发人员编写SQL有一定要求

# MyBatis中的${}和#{}的区别

  • #{}是预编译处理,是占位符;${}是字符串替换,是拼接符
  • MyBatis在处理#{}时,会将sql中的#{}替换成?号,调用PreparedStatement的set方法来赋值
  • MyBatis在处理${}时,就是把${}替换成变量的值,用Statement来赋值
  • 使用#{}可以有效的防止SQL注入,提高系统安全性

# MyBatis和Hiberate的区别

# 开发速度

  • MyBatis上手容易,较快,敏捷开发
  • HiBerate上手较慢,较难,封装度高

# 开发工作量

  • MyBatis需要大量XML配置文件,开发工作量大
  • HiBerate需要编写实体类,开发工作量小,有良好的映射机制

# SQL优化

  • MyBatis可以精致优化
  • Hibernate会查出所有字段

# 对象管理

  • MyBatis没有对象状态管理
  • Hibernate有对象状态管理

# 缓存机制

  • MyBatis需要在每个表-对象映射中配置
  • Hibernate在SessionFactory中配置

# MyBatis插件的原理

  • 使用JDK动态代理
  • 只针对ParameterHandler,ResultSetHandler,StatementHandler,Executor四个接口进行增强,当执行这四个接口,就会进入拦截方法interceptor()
编辑 (opens new window)
上次更新: 2024/06/01, 23:33:02
计算机基础
分布式

← 计算机基础 分布式→

最近更新
01
杂乱无章
12-25
02
基础-大彬
11-14
03
集合-大彬
11-14
更多文章>
Theme by Vdoing | Copyright © 2023-2025 qouson
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式