老师我按照你写的进行测试出现了如下问题,麻烦老师帮我看一下代码如下

来源:8-1 SQL注入器简介及自定义方法实现

慕仰8533998

2020-05-26 16:02

package com.hxd.sqlAbout;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

public class DeleteAllMethod extends AbstractMethod {

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql="delete from "+tableInfo.getTableName();
        String method="deleteAll";
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);

        return addDeleteMappedStatement(mapperClass,method,sqlSource);
    }
}
package com.hxd.sqlAbout;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.methods.*;
import org.springframework.stereotype.Component;

import java.util.List;


@Component
public class SqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new DeleteAllMethod());
        return methodList;
    }
}
package com.hxd.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hxd.pojo.User;
import org.springframework.stereotype.Repository;


@Repository
public interface UserMapper extends BaseMapper<User> {
 int deleteAll();
}
@RequestMapping("deletealluser")
public String deleteAllUser(){
    int i= userService.deleteAllUser();
    if(i>0){
        return "删除所有成功";
    }
    return "删除所有失败";
}
public int deleteAllUser() {
    int i = userMapper.deleteAll();
    return i;
}

http://img3.mukewang.com/5ecccd0700012d8619160380.jpg

写回答 关注

2回答

  • 老猿
    2020-05-28 09:47:38

    你这个问题,看着提示信息,应该不是程序的问题,而是因为数据库外键的问题,你删除所有数据,由于有的数据行有外键的约束,不允许你进行物理删除。

  • 慕盖茨3274159
    2020-07-10 14:34:58
    * Consume Time:42 ms 2020-07-10 14:18:43
    *  Execute SQL:delete from users
    * org.springframework.dao.DataIntegrityViolationException:
    * ### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException:
    * Cannot delete or update a parent row: a foreign key constraint fails (`mp`.`users`, CONSTRAINT `manager_fks` FOREIGN KEY (`manager_id`) REFERENCES `users` (`id`)
    * 当因为外键发生报错时:
    * 问题主要是删除记录的时候删不了,最后发现是中间表的外键默认删除时是RESTRICT,
    *   当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。
    *   当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。
    *   当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
    *   解决:  把外键字段原来默认的Restrict改成CASCADE即可


MyBatis-Plus进阶

MyBatis-Plus框架进阶课程

23296 学习 · 118 问题

查看课程

相似问题