整点活,MyBatis-Plus学习笔记(SQL注入器)

前言

最后一章辣!!!jiajiajiajiajiajai
这个是自己学习时候记得笔记要是想详细了解可以去MP官网,上边有更详细的配置流程以及视频教学:MyBatis-Plus

概念

Mp的BaseMapper提供了很多方法,但这些方法可能不够使用,所以可以创建自定义方法

步骤

  1. 新建类 extends AbstractMethod
    实现injectMappedStatement方法,在这个方法中自定义执行接口
public class DeleteAllMethod extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        // 自定义方法
        // 1. 自定义sql语句
        String sql = "delete from "+tableInfo.getTableName();
        // 2. 定义在Mapper接口中方法名
        String methodName = "deleteAll";
        // 3. 创建sql源
        SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);
        // 4. 返回方法
        return addDeleteMappedStatement(mapperClass,methodName,sqlSource);
    }
}

  1. 创建SQL注入器 extends Default
@Component
public class MySQLInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        // 1. 获取父级创建的方法
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 2. 将自定义方法放到列表中
        methodList.add(new DeleteAllMethod());
        // 3. 返回
        return methodList;
    }
}

  1. 在对应的Mapper中创建该方法
    /**
     * 删除所有
     * @return 影响行数
     */
    int deleteAll();
  1. 进行调用
    public void deleteAll(){
        System.out.println("影响行数: "+typeMapper.deleteAll());
    }

执行结果(执行删除而不是逻辑删除)
整点活,MyBatis-Plus学习笔记(SQL注入器)_第1张图片

提出问题

(以删除为例子)如果要删除一个表中的数据可以这样解决,但是要删除多个表中数据时,还需要在每一个对应的操作包下都进行这些操作么?

解决问题

此时使用自定义Mapper即可

  1. 创建MyMapper< T > 继承BaseMapper,将自定义方法放到MyMapper里边
public interface MyMapper<T> extends BaseMapper<T> {
    /**
     * 删除所有
     * @return 影响行数
     */
    int deleteAll();
}
  1. 创建实际操作对象的Mapper继承MyMapper
public interface MyTypeMapper extends MyMapper<Type> {

}

3. 这时候继承MyMapper的Mapper都会获得自己的 deleteAll()方法

你可能感兴趣的:(整点活,MyBatis-Plus学习笔记(SQL注入器))