目 录CONTENT

文章目录

Java MyBatisPlus

PySuper
2023-02-27 / 0 评论 / 0 点赞 / 7 阅读 / 0 字
温馨提示:
本文最后更新于2025-06-06,若内容或图片失效,请留言反馈。 所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

基础

以下一些内容可见官网说明 MyBatis官网

简介

入门

安装

作用域(Scope)和生命周期

XML 配置(全局配置)

XML 映射配置(Mapper 文件配置)

动态配置

Java API

SQL 语句构建器

日志

高级

传统 JDBC

执行流程

  1. 加载 JDBC 驱动

  2. 建立并获取数据库连接

  3. 创建 JDBC Statements 对象

  4. 设置 SQL 语句的传入参数

  5. 执行 SQL 语句并获得查询结果

  6. 对查询结果进行转换处理并将处理结果返回

  7. 释放相关资源(关闭 Connection,关闭 Statement,关闭 ResultSet)

弊端

  1. JDBC 底层没有用连接池,操作数据库需要频繁的创建和关闭连接,消耗很大的资源

  2. 原生的 JDBC 代码在 Java 中,一旦需要修改 SQL,Java 需要整体编译,不利于系统维护

  3. 使用 PreparedStatement 预编译的话,对变量进行设置 1、2、3 等数字,这样的序号不利于维护

  4. 返回 result 结果集也需要硬编码

MyBatis 的优点

与传统的 JDBC 相比,MyBatis 的优点?

  1. 开发效率提升

    • Spring 无缝整合(MyBatis-Spring),与主流连接池(HikariCP/Druid)深度适配

    • SQL 与代码解耦:XML/注解管理 SQL(SQL in XML/Annotations)

    • 自动结果集映射(Auto Result Mapping):自动将 ResultSet 转换为 Java 对象

    • 动态 SQL 支持(Dynamic SQL):通过 <if>/<foreach> 标签动态生成 SQL

  2. 维护性优化

对比维度

JDBC

MyBatis

SQL 维护

硬编码在 Java 文件中

独立 XML 文件存储

参数处理

手动 setParameter

自动参数绑定(#{ }/${ }

异常处理

需处理 SQLException

封装为统一异常体系

  1. 性能增强特性

    • 一级缓存(Local Cache):默认开启的 SqlSession 级别缓存

    • 二级缓存(Global Cache):可配置的 Mapper 级别缓存

    • 批处理优化(Batch Execution):内置 ExecutorType.BATCH 模式

  2. 扩展能力

    • 插件机制(Interceptor):可拦截 Executor/StatementHandler 等核心组件

    • 类型处理器(TypeHandler):自定义数据类型转换规则

    • 方言支持(Dialect):适配不同数据库特性

原生MyBatis查询

如果项目中要用到原生的 Mybatis 去查询,该怎样写?

  1. 配置 MyBatis:在项目中配置 MyBatis 的数据源、SQL 映射文件等

  2. 创建实体类:创建用于映射数据库表的实体类

  3. 编写 SQL 映射文件:创建 XML 文件,定义 SQL 语句和映射关系

  4. 编写 DAO 接口:创建 DAO 接口,定义数据库操作的方法

  5. 编写具体的 SQL 查询语句:在 DAO 接口中定义查询方法,并在 XML 文件中编写对应的 SQL 语句

  6. 调用查询方法:在服务层或控制层调用 DAO 接口中的方法进行查询

# vs $

  • Mybatis 在处理 #{} 时

    • 会创建预编译的 SQL 语句,将 SQL 中的 #{} 替换为 ? 号,在执行 SQL 时会为预编译 SQL 中的占位符(?)赋值

    • 调用 PreparedStatement 的 set 方法来赋值,预编译的 SQL 语句执行效率高

    • 并且可以防止SQL 注入,提供更高的安全性,适合传递参数值

  • Mybatis 在处理 ${} 时

    • 只是创建普通的 SQL 语句,然后在执行 SQL 语句时 MyBatis 将参数直接拼入到 SQL 里,不能防止 SQL 注入

    • 因为参数直接拼接到 SQL 语句中,如果参数未经过验证、过滤,可能会导致安全问题

总结

  1. 使用 # 可以很大程度上防止 sql 注入

  2. 有些特定场景只能用 $,如动态表

MybatisPlus vs Mybatis

MybatisPlus 是一个基于 MyBatis 的增强工具库,旨在简化开发并提高效率

以下是 MybatisPlus 和 MyBatis 之间的一些主要区别

  • CRUD 操作

    • MybatisPlus 通过继承 BaseMapper 接口

    • 提供了一系列内置的快捷方法,使得 CRUD 操作更加简单,无需编写重复的 SQL 语句

  • 代码生成器

    • MybatisPlus 提供了代码生成器功能

    • 可以根据数据库表结构自动生成实体类、Mapper 接口以及 XML 映射文件,减少了手动编写的工作量

  • 通用方法封装

    • MybatisPlus 封装了许多常用的方法

    • 如条件构造器、排序、分页查询等,简化了开发过程,提高了开发效率

  • 分页插件

    • MybatisPlus 内置了分页插件,支持各种数据库的分页查询,开发者可以轻松实现分页功能

    • 而在传统的 MyBatis 中,需要开发者自己手动实现分页逻辑

  • 多租户支持

    • MybatisPlus 提供了多租户的支持

    • 可以轻松实现多租户数据隔离的功能

  • 注解支持

    • MybatisPlus 引入了更多的注解支持

    • 使得开发者可以通过注解来配置实体与数据库表之间的映射关系,减少了 XML 配置文件的编写

设计模式

MyBatis 运用了哪些常见的设计模式?

  1. 建造者模式(Builder):如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder

  2. 工厂模式:如SqlSessionFactory、ObjectFactory、MapperProxyFactory

  3. 单例模式:例如 ErrorContext 和 LogFactory

  4. 代理模式:

    1. Mybatis 实现的核心,比如 MapperProxy、ConnectionLogger,用的 JDK 的动态代理

    2. 还有 executor.loader 包使用了 cglib 或者 javassist 达到延迟加载的效果

  5. 组合模式:例如 SqlNode 和各个子类 ChooseSqlNode 等

  6. 模板方法模式:例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和所有的子类例如 IntegerTypeHandler

  7. 适配器模式:例如 Log 的 Mybatis 接口和它对 jdbc、log4j 等各种日志框架的适配实现

  8. 装饰者模式:例如 Cache 包中的 cache.decorators 子包中等各个装饰者的实现

  9. 迭代器模式:例如迭代器模式 PropertyTokenizer

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区