博客
关于我
第 3 章 MybatisPlus 注入 SQL 原理分析
阅读量:156 次
发布时间:2019-02-28

本文共 1901 字,大约阅读时间需要 6 分钟。

MybatisPlus SQL注入原理分析

MybatisPlus是一种基于Java的动态SQL框架,它能够通过注解或配置文件自动为Mapper接口的CRUD方法注入对应的SQL语句。以下是其注入SQL语句的核心原理和实现机制。

核心类解析

1. Configuration(全局配置)

MybatisPlus的全局配置存储了数据库连接信息和框架设置,包括环境、数据库ID、连接超时、语句类型等。这些配置在整个应用中被共享和使用。

2. MappedStatement(SQL语句映射)

MappedStatement对象描述了Mapper接口方法对应的SQL语句,包含以下字段:

  • resource:对应的XML文件或资源路径。
  • configuration:全局配置对象。
  • id:SQL语句的唯一标识符。
  • fetchSize:默认结果集大小。
  • timeout:默认查询超时时间。
  • statementType:SQL语句类型(如prepared)。
  • sqlSource:存储SQL语句的资源,分为StaticSqlSource和DynamicSqlSource。

3. SqlMethod(SQL操作类型)

SqlMethod是一个枚举类,定义了MybatisPlus支持的SQL操作类型及其对应的SQL模板。例如,INSERT_ONE对应插入一条数据,DELETE_BY_ID对应删除一条记录。

4. TableInfo(表信息)

TableInfo类用于获取数据库表的元信息,包括表名、主键信息、字段信息等。它帮助MybatisPlus自动获取表结构信息,用于动态SQL的字段映射。

5. SqlSource(SQL源)

SqlSource分为StaticSqlSource和DynamicSqlSource。StaticSqlSource用于存储预先确定的静态SQL语句,DynamicSqlSource用于动态拼接SQL语句,适用于条件构造器。

6. SqlNode(SQL节点)

SqlNode是动态SQL语句的构建单元,支持多种节点类型,如IfSqlNode(条件语句)、StaticTextSqlNode(静态文本节点)等。这些节点通过拼接构建完整的动态SQL语句。

7. MapperBuilderAssistant(构建助手)

MapperBuilderAssistant负责缓存、SQL参数和结果集的处理。它通过addMappedStatement方法构建MappedStatement对象,并将其添加到全局配置中的mappedStatements集合中。

8. AbstractMethod(抽象方法)

AbstractMethod是一个抽象父类,用于注入SQL语句。它定义了一系列方法,如addSelectMappedStatementForTable和addSelectMappedStatementForOther,用于根据表信息或其他条件构造MappedStatement。子类如SelectById、SelectCount等会重写这些方法,构造具体的SQL语句。

9. AbstractSqlInjector(SQL注入器)

AbstractSqlInjector是注入SQL语句的核心类。它通过inspectInject方法遍历Mapper接口的方法,调用相应的注入器(如DefaultSqlInjector)来注入具体的SQL语句。

注入SQL的实现流程

  • Mapper接口定义:开发者在Mapper接口中定义CRUD方法,注解或配置SQL语句。
  • 注入器初始化:通过AbstractSqlInjector遍历Mapper接口,获取所有需要注入的方法。
  • 构造SQL语句:根据SqlMethod定义的模板,结合表信息和其他条件,构造具体的SQL语句。
  • 注册SQL映射:将构造好的MappedStatement对象添加到全局配置中,完成SQL语句的注册。
  • 动态SQL的实现

    动态SQL通过SqlNode构造节点,根据条件动态拼接SQL语句。例如,IfSqlNode处理条件语句,StaticTextSqlNode处理静态文本节点。这些节点通过apply方法在上下文中动态拼接,生成最终的动态SQL。

    总结

    MybatisPlus通过全局配置、SQL语句映射、动态SQL构造等机制,实现了对Mapper接口方法的SQL注入。其注入流程涵盖了从配置读取、SQL语句构造、注册到全局配置的完整过程。通过动态SQL技术,MybatisPlus能够灵活处理复杂的查询逻辑,提高开发效率。

    转载地址:http://hlfc.baihongyu.com/

    你可能感兴趣的文章
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>
    Mysql Can't connect to MySQL server
    查看>>
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>
    mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>
    MySQL Cluster与MGR集群实战
    查看>>
    multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
    查看>>
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>