网站首页 > 开源技术 正文
MP版本为3.0.1
sql注入原理
①,入口类 com.baomidou.mybatisplus.core.injector.AbstractSqlInjector ,重点是这个方法
public void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) { String className = mapperClass.toString(); Set<String> mapperRegistryCache = GlobalConfigUtils.getMapperRegistryCache(builderAssistant.getConfiguration()); if (!mapperRegistryCache.contains(className)) { List<AbstractMethod> methodList = this.getMethodList(); Assert.notEmpty(methodList, "No effective injection method was found."); // 循环注入自定义方法,这里开始注入sql methodList.forEach(m -> m.inject(builderAssistant, mapperClass)); mapperRegistryCache.add(className); /** * 初始化 SQL 解析 */ if (GlobalConfigUtils.getGlobalConfig(builderAssistant.getConfiguration()).isSqlParserCache()) { SqlParserHelper.initSqlParserInfoCache(mapperClass); } } }
②,由AbstractMethod 的injectMappedStatement 方法完成具体的注入,
我们看到实际是有其实现类的一个个injectMappedStatement 来完成注入的
③,这里我以DeleteById 为例
@Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { //得到待解析sql的模板 SqlMethod sqlMethod = SqlMethod.DELETE_BY_ID; //利用语言驱动和配置信息,table元数据,和刚才得到的sql方法模板得到sqlSource SqlSource sqlSource = languageDriver.createSqlSource(configuration, String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(), tableInfo.getKeyProperty()), modelClass); //最后添加到mybatis的configuration里的mappedStatements中 return this.addDeleteMappedStatement(mapperClass, sqlMethod.getMethod(), sqlSource); }
④,DELETE_BY_ID的模板如下
由此我们可以猜出,在tableInfo 中必须要能得出表名和该表主键
执行AbstractSqlInjector #inspectInject 的原理
我们可以在该方法的第一行打一个断点
看我红框圈起来的部门,我们可以大致猜出,是spring容器在实例化组件时,在实例化组件后调用组件的初始化方法,而引起的一连串反应。
通过翻看源码,我大致解释一下
1,AbstractAutowireCapableBeanFactory调用组件的afterPropertiesSet方法,这个组件的beanName为userMapper,这是一个我定义的一个继承自BaseMapper的一个接口
2,不知怎么地,居然跑去调用 DaoSupport的afterPropertiesSet方法(知道的朋友欢迎留言)
3,然后调用到了其子类的MapperFactoryBean 的checkDaoConfig方法
重点是一行,这个configuration是继承自org.apache.ibatis.session.Configuration 的子类,是有mp自定义的一个类
configuration.addMapper(this.mapperInterface);
4,接下来调用com.baomidou.mybatisplus.core.MybatisMapperRegistry的addMapper方法
断点停在了86行
5,我们看这个parse方法
利用GlobalConfigUtils 得到ISqlInjector,然后调用其inspectInject方法
6,我们看看mp是如何得到这个ISqlInjector的
public static ISqlInjector getSqlInjector(Configuration configuration) { // fix #140 GlobalConfig globalConfiguration = getGlobalConfig(configuration); //从配置里拿,如果有,则用配置的 ISqlInjector sqlInjector = globalConfiguration.getSqlInjector(); if (sqlInjector == null) { //没有配置,默认给一个DefaultSqlInjector sqlInjector = new DefaultSqlInjector(); globalConfiguration.setSqlInjector(sqlInjector); } return sqlInjector; }
7,而 DefaultSqlInjector 是继承自 AbstractSqlInjector 类的
由于DefaultSqlInjector没有重写AbstractSqlInjector的inspectInject方法,
所以DefaultSqlInjector在调用inspectInject方法时,实际上会用父类AbstractSqlInjector的inspectInject方法。
猜你喜欢
- 2024-10-21 C#实战|人员管理系统[13]:修改密码功能的实现
- 2024-10-21 C#实战|人员管理系统[22]:按照所属组织名称查询人员列表
- 2024-10-21 C#实战|人员管理系统[33]:实现删除人员信息的功能
- 2024-10-21 C#实战|人员管理系统[32]:修改人员信息的实现
- 2024-10-21 实例讲解MyBatisPlus自定义sql注入器方法
- 2024-10-21 SQL辅助类(sql添加辅助数据库文件)
- 2024-10-21 C#知识|账号管理系统:使用带参数的SQL语句编程添加账号的方法。
- 2024-10-21 SQL注入攻防入门详解(简单的sql注入攻击教程)
- 2024-10-21 SQL - 编写SqlHelper帮助类,简化数据操作代码 173
- 2024-10-21 ADO.Net-SQLHelper帮助类 158(帮助列表)
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)