mybatis-plus sql注入原理

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

MP版本为2.3

注入主要靠com.baomidou.mybatisplus.mapper.AutoSqlInjector 来完成

①,mybatis先进行sql语句的映射,然后mybatis-plus再添加

②,我们在AutoSqlInjector .injectDeleteByIdSql 打一个断点

mybatis-plus sql注入原理_第1张图片

我们再看一下SqlMethod.DELETE_BY_ID 这个模板,原来也没啥神秘的,定义了一个sql模板,写了通用的sql语句,由此我们也知道,mp不能用于nosql,而且mybatis本身就不支持nosql,mp只是mybatis的增强工具,mybatis都做不到的事,mp能做到才有鬼呢,所以这些mp不支持nosql也是合理的

mybatis-plus sql注入原理_第2张图片

那mp支持的关系型数据库有哪些呢?我们可以通过看com.baomidou.mybatisplus.generator.config.rules.DbType得知:

 

③,如果是批量删除还是个假的批量,利用的是foreach循环,利用的mybatis的ExecutorType应该还是SIMPLE

④,利用 String.format 初步解析sql

mybatis-plus sql注入原理_第3张图片

⑤,利用mybatis的languageDriver 得到sqlSource 对象

mybatis-plus sql注入原理_第4张图片

⑥,调用addDeleteMappedStatement方法,添加Statement

时机是调用本对象的this.addMappedStatement方法,sql命令类型为delete

mybatis-plus sql注入原理_第5张图片

⑦,我们在AutoSqlInjector .addMappedStatement 打一个断点

mybatis-plus sql注入原理_第6张图片

这里我们可以看出,mp在添加sql时会先判断我们有无手动进行添加同名的sql,有则跳过

mybatis-plus sql注入原理_第7张图片

⑧,进入builderAssistant.addMappedStatement 方法

可以看出,先里利用传入的参数封装成一个MappedStatement 对象;再添加到Configuration的mappedStatements 中

mybatis-plus sql注入原理_第8张图片

转载于:https://my.oschina.net/u/3574106/blog/1915443

你可能感兴趣的:(mybatis-plus sql注入原理)