tk.MyBatis:通过设置safeDelete、safeUpdate,防止BaseMapper导致的全表数据操作

ty.mybatis 动态生成SQL原理,源码解析:ty.mybatis接口使用不慎导致的全表删除
一文中,从源码分析了tk.mybatis如何生成SQL
本文中,介绍一个可以避免使用tk mybatis不慎导致全表修改操作的配置

配置

在这里插入图片描述

在yml配置文件中设置safeDelete,见文档https://github.com/abel533/Mapper/wiki/3.config
在这里插入图片描述

原理/源码

设置配置后,项目启动时会读到此配置,设置到safeDelete中
在这里插入图片描述

在生成SQL模板时,通过配置项判断是否加空参数校验
在这里插入图片描述
如果设置了,会对生成的SQL加一句

<bind name="notAllNullParameterCheck" value="@tk.mybatis.mapper.util.OGNL@notAllNullParameterCheck(_parameter, '参数列表')"/>

notAllNullParameterCheck对应的代码如下,可以看出,如果 paremeter 对象中指定的 fields 全是 null,则抛出异常

/**
     * 检查 paremeter 对象中指定的 fields 是否全是 null,如果是则抛出异常
     *
     * @param parameter
     * @param fields
     * @return
     */
    public static boolean notAllNullParameterCheck(Object parameter, String fields) {
    
    
        if (parameter != null) {
    
    
            try {
    
    
                Set<EntityColumn> columns = EntityHelper.getColumns(parameter.getClass());
                Set<String> fieldSet = new HashSet<String>(Arrays.asList(fields.split(",")));
                for (EntityColumn column : columns) {
    
    
                    if (fieldSet.contains(column.getProperty())) {
    
    
                        Object value = column.getEntityField().getValue(parameter);
                        if (value != null) {
    
    
                            return true;
                        }
                    }
                }
            } catch (Exception e) {
    
    
                throw new MapperException(SAFE_DELETE_ERROR, e);
            }
        }
        throw new MapperException(SAFE_DELETE_EXCEPTION);
    }

猜你喜欢

转载自blog.csdn.net/weixin_43859729/article/details/112568861