首页 » SEO优化 » phpmysqlisql注入技巧_MyBatis实战四之MyBatisPlus的SQL注入器扩展

phpmysqlisql注入技巧_MyBatis实战四之MyBatisPlus的SQL注入器扩展

duote123 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

public interface BaseMapper<T> extends Mapper<T> { int insert(T entity); int deleteById(Serializable id); int deleteByMap(@Param("cm") Map<String, Object> columnMap); int delete(@Param("ew") Wrapper<T> queryWrapper); int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList); int updateById(@Param("et") T entity); int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper); T selectById(Serializable id); List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList); List<T> selectByMap(@Param("cm") Map<String, Object> columnMap); T selectOne(@Param("ew") Wrapper<T> queryWrapper); Integer selectCount(@Param("ew") Wrapper<T> queryWrapper); List<T> selectList(@Param("ew") Wrapper<T> queryWrapper); List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper); List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper); <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper); <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);}什么是MyBatis-Plus SQL注入器

我们在利用MyBatis-Plus时,dao层都会去继续BaseMapper接口,这样就可以用BaseMapper接口所有的方法,BaseMapper中每一个方法实在便是一个SQL注入器

phpmysqlisql注入技巧_MyBatis实战四之MyBatisPlus的SQL注入器扩展

@DS("user")public interface UserInfoMapper extends BaseMapper<UserInfoDO> {}

SQL注入器接口 ISqlInjector 定义在MyBatis-Plus的核心(core)包下,如图:

phpmysqlisql注入技巧_MyBatis实战四之MyBatisPlus的SQL注入器扩展
(图片来自网络侵删)

供应的默认可注入方法有这些:

SQL 自动注入器接口 ISqlInjector

注入器配置

全局配置 sqlInjector 用于注入 ISqlInjector 接口的子类,实现自定义方法注入。

public interface ISqlInjector { / <p> 检讨SQL是否注入(已经注入过不再注入) </p> @param builderAssistant mapper 信息 @param mapperClass mapper 接口的 class 工具 / void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass);}

ISqlInjector SQL自动注入器接口 类图:

自定义自己的通用方法可以实现接口 ISqlInjector 也可以继续抽象类 AbstractSqlInjector 注入通用方法 SQL 语句 然后继续 BaseMapper 添加自定义方法,全局配置 sqlInjector 注入 MP 会自动将类所有方法注入到 mybatis 容器中。

那如果我们想自定义SQL注入器呢,我们该如何去做?

下面是MyBatis-Plus供应了几个扩展SQL注入器。

自带扩展SQL注入器

1、AlwaysUpdateSomeColumnById : 根据id更新字段(全量更新不忽略null字段),updateById默认会自动忽略实体中null值字段。

2、InsertBatchSomeColumn : 真实批量插入,saveBatch实在是伪批量插入。

3、LogicDeleteBatchByIds : 逻辑删除增加添补功能,比如删除的时候添补更新韶光、更新人。

4、Upsert : 插入一条数据(选择字段插入)。

如何自定义SQL注入器?

在实际开拓过程中,当Mybatis-Plus自带的一些SQL注入器不知足我们的条件时,我们就须要自定义SQL注入器,全体流程也非常大略

这里我们以一个很大略的insertBatchSomeColumn方法为例进行学习。

在MyBaseMapper中添加batchInsert方法

import com.baomidou.mybatisplus.core.mapper.BaseMapper;import java.util.List;public interface MyBaseMapper<T> extends BaseMapper<T> { int insertBatchSomeColumn(List<T> list);}

定义SQL注入器InsertBatchSqlInjector

/ 批量插入SQL注入器 @author yangyanping @date 2023-10-31 /public class InsertBatchSqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { List<AbstractMethod> methodList = super.getMethodList(mapperClass); //添加InsertBatchSomeColumn方法 methodList.add(new InsertBatchSomeColumn()); return methodList; }}

MyBatisPlusConfig 配置类

@Configuration@MapperScan("com.mysql.dao.user")public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } @Bean public InsertBatchSqlInjector insertBatchSqlInjector() { return new InsertBatchSqlInjector(); }}单元测试

@RunWith(SpringRunner.class)@SpringBootTest(classes = WebApplication.class)public class SqlInjectorTest { @Resource private UserInfoDao userInfoDao; @Test public void batchInsert() { List<UserInfo> list = new ArrayList<>(); for (long i = 100; i <= 110; i++) { UserInfo userInfo = new UserInfo(); userInfo.setId(i); userInfo.setNickName("user_" + i); userInfo.setGender(1); userInfo.setType(1); userInfo.setGrade(1); userInfo.setIsVip(1); userInfo.setAddress(""); userInfo.setCreateTime(new Date()); list.add(userInfo); } userInfoDao.insertBatchSomeColumn(list); }}

标签:

相关文章

letv登录php技巧_乐视网独播刀剑神域人气旺

《刀剑神域》讲述了一个发生在网络角色扮演游戏“刀剑神域”中的奇妙故事。参加了游戏的主人公桐人得知了“在游戏中去世去的人在现实中也会...

SEO优化 2024-12-14 阅读0 评论0

php反射hasmethod技巧_php反射机制用法详解

面向工具编程中工具被授予了自省的能力,而这个自省的过程便是反射。反射,直不雅观理解便是根据到达地找到出发地和来源。比如,一个光秃秃...

SEO优化 2024-12-14 阅读0 评论0