博客
关于我
第 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/

    你可能感兴趣的文章
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    Mysql 拼接多个字段作为查询条件查询方法
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>
    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
    查看>>
    MySQL 数据库的高可用性分析
    查看>>
    MySQL 数据库设计总结
    查看>>
    Mysql 数据库重置ID排序
    查看>>
    Mysql 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>