tk.mybatis:delete()和deleteByPrimaryKey()的区别(源码+生成结果)

源码分析

在DeleteMapper接口中,@DeleteProvider注解的type属性指定了BaseDeleteProvider类

	/**
     * 根据实体属性作为条件进行删除,查询条件使用等号
     *
     * @param record
     * @return
     */
    @DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL")
    int delete(T record);

BaseDeleteProvider类中,就是delete()方法本法

/**
     * 通过条件删除
     *
     * @param ms
     * @return
     */
    public String delete(MappedStatement ms) {
    
    
        //获取实体类
        Class<?> entityClass = getEntityClass(ms);
        StringBuilder sql = new StringBuilder();
        //如果设置了安全删除,就不允许执行不带查询条件的 delete 方法,默认false不开启
        if (getConfig().isSafeDelete()) {
    
    
            sql.append(SqlHelper.notAllNullParameterCheck("_parameter", EntityHelper.getColumns(entityClass)));
        }
        // 如果是逻辑删除,则修改为更新表,修改逻辑删除字段的值,实际没有,所以false
        if (SqlHelper.hasLogicDeleteColumn(entityClass)) {
    
    
            sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
            sql.append("<set>");
            sql.append(SqlHelper.logicDeleteColumnEqualsValue(entityClass, true));
            sql.append("</set>");
            //修改为UPDATE
            MetaObjectUtil.forObject(ms).setValue("sqlCommandType", SqlCommandType.UPDATE);
        } else {
    
    
            //执行的是这一行,sql = "DELETE FROM 表名 "
            sql.append(SqlHelper.deleteFromTable(entityClass, tableName(entityClass)));
        }
        //添加条件,isNotEmpty中变量默认为不判断
        sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));
        return sql.toString();
    }

deleteFromTable进行了表名解析

/**
     * delete tableName - 动态表名
     *
     * @param entityClass
     * @param defaultTableName
     * @return
     */
    public static String deleteFromTable(Class<?> entityClass, String defaultTableName) {
    
    
        StringBuilder sql = new StringBuilder();
        sql.append("DELETE FROM ");
        sql.append(getDynamicTableName(entityClass, defaultTableName));
        sql.append(" ");
        return sql.toString();
    }

whereAllIfColumns中进行了参数拼接

/**
     * where所有列的条件,会判断是否!=null
     *
     * @param entityClass
     * @param empty
     * @param useVersion
     * @return
     */
    public static String whereAllIfColumns(Class<?> entityClass, boolean empty, boolean useVersion) {
    
    
        StringBuilder sql = new StringBuilder();
        boolean hasLogicDelete = false;
		//添加的只是mybatis的标签
        sql.append("<where>");
        //获取全部列
        Set<EntityColumn> columnSet = EntityHelper.getColumns(entityClass);
        EntityColumn logicDeleteColumn = SqlHelper.getLogicDeleteColumn(entityClass);
        //当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
        for (EntityColumn column : columnSet) {
    
    
            if (!useVersion || !column.getEntityField().isAnnotationPresent(Version.class)) {
    
    
                // 逻辑删除,后面拼接逻辑删除字段的未删除条件
                if (logicDeleteColumn != null && logicDeleteColumn == column) {
    
    
                    hasLogicDelete = true;
                    continue;
                }
                sql.append(getIfNotNull(column, " AND " + column.getColumnEqualsHolder(), empty));
            }
        }
        //加乐观锁
        if (useVersion) {
    
    
            sql.append(whereVersion(entityClass));
        }
        if (hasLogicDelete) {
    
    
            sql.append(whereLogicDelete(entityClass, false));
        }

        sql.append("</where>");
        return sql.toString();
    }

在项目启动时生成SQL模板,

delete()结果如下(举例):

DELETE FROM db_test.t_test_table 
<where>
	<if test="id != null"> 
		AND id = #{id}
	</if>
	<if test="col != null"> 
	AND col = #{col}
	</if>
</where>

deleteByPrimaryKey()结果如下:

DELETE FROM db_test.t_test_table 
<where> 
	AND id = #{
    
    id}
</where>

当使用的时候,就像我们拿自己写在mapper.xml中的SQL一样

至于tk mybatis怎么与mybatis整合,参数怎么拼进动态SQL,就另说了

结论

从源码和运行结果可知,delete()在参数全null的情况下回删除全表

代码中不止有delete(),还有deleteByPrimaryKey()、deleteByCondition()、updateByPrimaryKeySelective等方法,update也有把未设置值的字段更新为null的先例

猜你喜欢

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