博客
关于我
第 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 两列互转
    查看>>
    MySQL 中开启二进制日志(Binlog)
    查看>>
    MySQL 中文问题
    查看>>
    MySQL 中日志的面试题总结
    查看>>
    mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
    查看>>
    MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
    查看>>
    Mysql 中的日期时间字符串查询
    查看>>
    mysql 中索引的问题
    查看>>
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>