基础
以下一些内容可见官网说明 MyBatis官网
简介
入门
安装
作用域(Scope)和生命周期
XML 配置(全局配置)
XML 映射配置(Mapper 文件配置)
动态配置
Java API
SQL 语句构建器
日志
高级
传统 JDBC
执行流程
加载 JDBC 驱动
建立并获取数据库连接
创建 JDBC Statements 对象
设置 SQL 语句的传入参数
执行 SQL 语句并获得查询结果
对查询结果进行转换处理并将处理结果返回
释放相关资源(关闭 Connection,关闭 Statement,关闭 ResultSet)
弊端
JDBC 底层没有用连接池,操作数据库需要频繁的创建和关闭连接,消耗很大的资源
原生的 JDBC 代码在 Java 中,一旦需要修改 SQL,Java 需要整体编译,不利于系统维护
使用 PreparedStatement 预编译的话,对变量进行设置 1、2、3 等数字,这样的序号不利于维护
返回 result 结果集也需要硬编码
MyBatis 的优点
与传统的 JDBC 相比,MyBatis 的优点?
开发效率提升
Spring 无缝整合(MyBatis-Spring),与主流连接池(HikariCP/Druid)深度适配
SQL 与代码解耦:XML/注解管理 SQL(SQL in XML/Annotations)
自动结果集映射(Auto Result Mapping):自动将 ResultSet 转换为 Java 对象
动态 SQL 支持(Dynamic SQL):通过 <if>/<foreach> 标签动态生成 SQL
维护性优化
性能增强特性
一级缓存(Local Cache):默认开启的 SqlSession 级别缓存
二级缓存(Global Cache):可配置的 Mapper 级别缓存
批处理优化(Batch Execution):内置 ExecutorType.BATCH 模式
扩展能力
插件机制(Interceptor):可拦截 Executor/StatementHandler 等核心组件
类型处理器(TypeHandler):自定义数据类型转换规则
方言支持(Dialect):适配不同数据库特性
原生MyBatis查询
如果项目中要用到原生的 Mybatis 去查询,该怎样写?
配置 MyBatis:在项目中配置 MyBatis 的数据源、SQL 映射文件等
创建实体类:创建用于映射数据库表的实体类
编写 SQL 映射文件:创建 XML 文件,定义 SQL 语句和映射关系
编写 DAO 接口:创建 DAO 接口,定义数据库操作的方法
编写具体的 SQL 查询语句:在 DAO 接口中定义查询方法,并在 XML 文件中编写对应的 SQL 语句
调用查询方法:在服务层或控制层调用 DAO 接口中的方法进行查询
# vs $
Mybatis 在处理 #{} 时
会创建预编译的 SQL 语句,将 SQL 中的 #{} 替换为 ? 号,在执行 SQL 时会为预编译 SQL 中的占位符(?)赋值
调用 PreparedStatement 的 set 方法来赋值,预编译的 SQL 语句执行效率高
并且可以防止SQL 注入,提供更高的安全性,适合传递参数值
Mybatis 在处理 ${} 时
只是创建普通的 SQL 语句,然后在执行 SQL 语句时 MyBatis 将参数直接拼入到 SQL 里,不能防止 SQL 注入
因为参数直接拼接到 SQL 语句中,如果参数未经过验证、过滤,可能会导致安全问题
总结
使用 # 可以很大程度上防止 sql 注入
有些特定场景只能用 $,如动态表
MybatisPlus vs 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
评论区