MyBatis

felix.shao2025-05-04MyBatisMyBatis

MyBatis

前述

 以下一些内容可见官网说明 MyBatis官网open in new window

  • 简介
  • 入门
    • 安装
    • 作用域(Scope)和生命周期
  • XML 配置(全局配置)
  • XML 映射配置(Mapper 文件配置)
  • 动态配置
  • Java API
  • SQL 语句构建器
  • 日志

QA

传统 JDBC 介绍

 其执行流程如下。

  1. 加载 JDBC 驱动。
  2. 建立并获取数据库连接。
  3. 创建 JDBC Statements 对象。
  4. 设置 SQL 语句的传入参数。
  5. 执行 SQL 语句并获得查询结果。
  6. 对查询结果进行转换处理并将处理结果返回。
  7. 释放相关资源(关闭 Connection,关闭 Statement,关闭 ResultSet)。

 其弊端如下。

  • JDBC 底层没有用连接池,操作数据库需要频繁的创建和关闭连接,消耗很大的资源。
  • 原生的 JDBC 代码在 Java 中,一旦需要修改 SQL,Java 需要整体编译,不利于系统维护。
  • 使用 PreparedStatement 预编译的话,对变量进行设置 1、2、3 等数字,这样的序号不利于维护。
  • 返回 result 结果集也需要硬编码。
与传统的 JDBC 相比,MyBatis 的优点?

 优点如下。
1.1 开发效率提升。

  • Spring 无缝整合(MyBatis-Spring),与主流连接池(HikariCP/Druid)深度适配。
  • SQL 与代码解耦:XML/注解管理 SQL(SQL in XML/Annotations)。
  • 自动结果集映射(Auto Result Mapping):自动将 ResultSet 转换为 Java 对象。
  • 动态 SQL 支持(Dynamic SQL):通过 <if>/<foreach> 标签动态生成 SQL。

1.2 维护性优化。

对比维度JDBCMyBatis
SQL 维护硬编码在 Java 文件中独立 XML 文件存储
参数处理手动 setParameter自动参数绑定(#{ }/${ }
异常处理需处理 SQLException封装为统一异常体系

1.3 性能增强特性。

  1. 一级缓存(Local Cache):默认开启的 SqlSession 级别缓存。
  2. 二级缓存(Global Cache):可配置的 Mapper 级别缓存。
  3. 批处理优化(Batch Execution):内置 ExecutorType.BATCH 模式。

1.4 扩展能力。

  • 插件机制(Interceptor):可拦截 Executor/StatementHandler 等核心组件。
  • 类型处理器(TypeHandler):自定义数据类型转换规则。
  • 方言支持(Dialect):适配不同数据库特性。
如果项目中要用到原生的 Mybatis 去查询,该怎样写?
  • 配置 MyBatis:在项目中配置 MyBatis 的数据源、SQL 映射文件等。
  • 创建实体类:创建用于映射数据库表的实体类。
  • 编写 SQL 映射文件:创建 XML 文件,定义 SQL 语句和映射关系。
  • 编写 DAO 接口:创建 DAO 接口,定义数据库操作的方法。
  • 编写具体的 SQL 查询语句:在 DAO 接口中定义查询方法,并在 XML 文件中编写对应的 SQL 语句。
  • 调用查询方法:在服务层或控制层调用 DAO 接口中的方法进行查询。
Mybatis里的 # 和 $ 的区别?
  • Mybatis 在处理 #{} 时,会创建预编译的 SQL 语句,将 SQL 中的 #{} 替换为 ? 号,在执行 SQL 时会为预编译 SQL 中的占位符(?)赋值,调用 PreparedStatement 的 set 方法来赋值,预编译的 SQL 语句执行效率高,并且可以防止SQL 注入,提供更高的安全性,适合传递参数值。
  • Mybatis 在处理 ${} 时,只是创建普通的 SQL 语句,然后在执行 SQL 语句时 MyBatis 将参数直接拼入到 SQL 里,不能防止 SQL 注入,因为参数直接拼接到 SQL 语句中,如果参数未经过验证、过滤,可能会导致安全问题。

 总结。

  1. 使用 # 可以很大程度上防止 sql 注入。
  2. 有些特定场景只能用 $,如动态表。
MybatisPlus 和 Mybatis 的区别

 MybatisPlus 是一个基于 MyBatis 的增强工具库,旨在简化开发并提高效率。以下是 MybatisPlus 和 MyBatis 之间的一些主要区别。

  • CRUD 操作:MybatisPlus 通过继承 BaseMapper 接口,提供了一系列内置的快捷方法,使得 CRUD 操作更加简单,无需编写重复的 SQL 语句。
  • 代码生成器:MybatisPlus 提供了代码生成器功能,可以根据数据库表结构自动生成实体类、Mapper 接口以及 XML 映射文件,减少了手动编写的工作量。
  • 通用方法封装:MybatisPlus 封装了许多常用的方法,如条件构造器、排序、分页查询等,简化了开发过程,提高了开发效率。
  • 分页插件:MybatisPlus 内置了分页插件,支持各种数据库的分页查询,开发者可以轻松实现分页功能,而在传统的 MyBatis 中,需要开发者自己手动实现分页逻辑。
  • 多租户支持:MybatisPlus 提供了多租户的支持,可以轻松实现多租户数据隔离的功能。
  • 注解支持:MybatisPlus 引入了更多的注解支持,使得开发者可以通过注解来配置实体与数据库表之间的映射关系,减少了 XML 配置文件的编写。
MyBatis 运用了哪些常见的设计模式?
  • 建造者模式(Builder),如:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder 等。
  • 工厂模式,如:SqlSessionFactory、ObjectFactory、MapperProxyFactory。
  • 单例模式,例如 ErrorContext 和 LogFactory。
  • 代理模式,Mybatis 实现的核心,比如 MapperProxy、ConnectionLogger,用的 JDK 的动态代理;还有 executor.loader 包使用了 cglib 或者 javassist 达到延迟加载的效果。
  • 组合模式,例如 SqlNode 和各个子类 ChooseSqlNode 等。
  • 模板方法模式,例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和所有的子类例如 IntegerTypeHandler。
  • 适配器模式,例如 Log 的 Mybatis 接口和它对 jdbc、log4j 等各种日志框架的适配实现。
  • 装饰者模式,例如 Cache 包中的 cache.decorators 子包中等各个装饰者的实现。
  • 迭代器模式,例如迭代器模式 PropertyTokenizer。
Last Updated 5/4/2025, 9:44:09 PM
ON THIS PAGE