MyBatis
MyBatis
前述
以下一些内容可见官网说明 MyBatis官网
- 简介
- 入门
- 安装
- 作用域(Scope)和生命周期
- XML 配置(全局配置)
- XML 映射配置(Mapper 文件配置)
- 动态配置
- Java API
- SQL 语句构建器
- 日志
QA
传统 JDBC 介绍
其执行流程如下。
- 加载 JDBC 驱动。
- 建立并获取数据库连接。
- 创建 JDBC Statements 对象。
- 设置 SQL 语句的传入参数。
- 执行 SQL 语句并获得查询结果。
- 对查询结果进行转换处理并将处理结果返回。
- 释放相关资源(关闭 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 维护性优化。
对比维度 | JDBC | MyBatis |
---|---|---|
SQL 维护 | 硬编码在 Java 文件中 | 独立 XML 文件存储 |
参数处理 | 手动 setParameter | 自动参数绑定(#{ } /${ } ) |
异常处理 | 需处理 SQLException | 封装为统一异常体系 |
1.3 性能增强特性。
- 一级缓存(Local Cache):默认开启的 SqlSession 级别缓存。
- 二级缓存(Global Cache):可配置的 Mapper 级别缓存。
- 批处理优化(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 语句中,如果参数未经过验证、过滤,可能会导致安全问题。
总结。
- 使用 # 可以很大程度上防止 sql 注入。
- 有些特定场景只能用 $,如动态表。
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。