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注入器
@DS("user")public interface UserInfoMapper extends BaseMapper<UserInfoDO> {}
SQL注入器接口 ISqlInjector 定义在MyBatis-Plus的核心(core)包下,如图:

供应的默认可注入方法有这些:
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); }}