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

导读:本篇文章讲解 tk.mybatis:delete()和deleteByPrimaryKey()的区别(源码+生成结果),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

源码分析

在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的先例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93726.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!