MybatisGenerator插件开发六【逻辑删除】

栏目: 数据库 · 发布时间: 5年前

内容简介:逻辑删除在项目中也是很常见的,比较常见的方式是添加一个逻辑比较简单,就是在Mapper接口和SqlMap文件中添加方法和对应的sql语句就可以了。将插件添加到项目中,并且运行完MybatisGenerator,我们来查看下生成的相关文件:

逻辑删除在项目中也是很常见的,比较常见的方式是添加一个 deleted 的标记位,当然也有其他的实现方式。本章节的插件针对的是添加标记位的方式来实现逻辑删除的。如果说没有和 deleted 标记位一起的唯一联合索引,那是很容易实现的,标志位只要两个值:0、1,然后通过 updateByExampleSelective 修改就可以了。但是往往我们表中会有唯一索引在,比如说名字不能重复之类的。这个时候我们采取的简单的处理方式是 set deleted = deleted + 1 来避免删除后不能再次添加同样数据的问题。索性这个插件就提供了两个方法: logicDeletelogicDeleteWithUIndex

修改Mapper接口和SqlMap文件

public class LogicDeletePluginextends PluginAdapter{

    @Override
    public boolean validate(List<String> list){
        return true;
    }

    /**
     * 修改Mapper类
     */
    @Override
    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable){
        addLogicDeleteMethod(interfaze);
        return true;
    }

    private void addLogicDeleteMethod(Interface interfaze){
        // 方法的返回值
        FullyQualifiedJavaType returnTypeInt = FullyQualifiedJavaType.getIntInstance();

        Method logicDeleteMethod = new Method();
        // 1.设置方法可见性
        logicDeleteMethod.setVisibility(JavaVisibility.PUBLIC);
        // 2.设置返回值类型 int类型
        logicDeleteMethod.setReturnType(returnTypeInt);
        // 3.设置方法名
        logicDeleteMethod.setName("logicDelete");
        // 4.设置参数列表
        FullyQualifiedJavaType paramType = PrimitiveTypeWrapper.getLongInstance();
        logicDeleteMethod.addParameter(new Parameter(paramType, "id"));
        interfaze.addMethod(logicDeleteMethod);

        Method logicDeleteWithUIndexMethod = new Method();
        // 1.设置方法可见性
        logicDeleteWithUIndexMethod.setVisibility(JavaVisibility.PUBLIC);
        // 2.设置返回值类型 int类型
        logicDeleteWithUIndexMethod.setReturnType(returnTypeInt);
        // 3.设置方法名
        logicDeleteWithUIndexMethod.setName("logicDeleteWithUIndex");
        // 4.设置参数列表
        FullyQualifiedJavaType paramTypeSelective = PrimitiveTypeWrapper.getLongInstance();
        logicDeleteWithUIndexMethod.addParameter(new Parameter(paramTypeSelective, "id", "@Param(\"id\")"));
        logicDeleteWithUIndexMethod.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "uIndexes", "@Param(\"uIndexes\")", true));
        interfaze.addMethod(logicDeleteWithUIndexMethod);
    }


    /**
     * 修改Mapper.xml
     */
    @Override
    public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable){
        addLogicDeleteXml(document, introspectedTable);
        addLogicDeleteWithUIndexXml(document, introspectedTable);
        return true;
    }

    private void addLogicDeleteXml(Document document, IntrospectedTable introspectedTable){
        XmlElement logicDeleteElement = new XmlElement("update");
        logicDeleteElement.addAttribute(new Attribute("id", "logicDelete"));
        logicDeleteElement.addAttribute(new Attribute("parameterType", "java.lang.Long"));

        logicDeleteElement.addElement(new TextElement("update " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
        logicDeleteElement.addElement(new TextElement("set deleted = 1, update_time = REPLACE(unix_timestamp(current_timestamp(3)),'.','') where id = #{id,jdbcType=BIGINT}"));

        document.getRootElement().addElement(logicDeleteElement);
    }

    private void addLogicDeleteWithUIndexXml(Document document, IntrospectedTable introspectedTable){
        XmlElement logicDeleteWithUIndexElement = new XmlElement("update");
        logicDeleteWithUIndexElement.addAttribute(new Attribute("id", "logicDeleteWithUIndex"));
        logicDeleteWithUIndexElement.addAttribute(new Attribute("parameterType", "map"));

        logicDeleteWithUIndexElement.addElement(new TextElement("update " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime() + " A,"));
        logicDeleteWithUIndexElement.addElement(new TextElement("(select C.deleted from " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime() + " C,"));
        logicDeleteWithUIndexElement.addElement(new TextElement("(select"));

        XmlElement foreachElement = new XmlElement("foreach");
        foreachElement.addAttribute(new Attribute("collection", "uIndexes"));
        foreachElement.addAttribute(new Attribute("index", "index"));
        foreachElement.addAttribute(new Attribute("item", "column"));
        foreachElement.addAttribute(new Attribute("separator", ","));
        foreachElement.addElement(new TextElement("${column}"));
        logicDeleteWithUIndexElement.addElement(foreachElement);

        logicDeleteWithUIndexElement.addElement(new TextElement("from " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime() + " where id = #{id,jdbcType=BIGINT}) D"));

        XmlElement whereElement = new XmlElement("where");
        XmlElement whereForachElement = new XmlElement("foreach");
        whereForachElement.addAttribute(new Attribute("collection", "uIndexes"));
        whereForachElement.addAttribute(new Attribute("index", "index"));
        whereForachElement.addAttribute(new Attribute("item", "column"));
        whereForachElement.addElement(new TextElement(" and C.${column} = D.${column}"));
        whereElement.addElement(whereForachElement);
        logicDeleteWithUIndexElement.addElement(whereElement);

        logicDeleteWithUIndexElement.addElement(new TextElement("order by C.deleted desc limit 1) B"));
        logicDeleteWithUIndexElement.addElement(new TextElement("set A.deleted = B.deleted + 1, A.update_time = REPLACE(unix_timestamp(current_timestamp(3)),'.','')"));
        logicDeleteWithUIndexElement.addElement(new TextElement("where A.id = #{id,jdbcType=BIGINT}"));
        logicDeleteWithUIndexElement.addElement(new TextElement("and A.deleted = 0"));

        document.getRootElement().addElement(logicDeleteWithUIndexElement);
    }
}

逻辑比较简单,就是在Mapper接口和SqlMap文件中添加方法和对应的 sql 语句就可以了。

查看生成文件

将插件添加到项目中,并且运行完MybatisGenerator,我们来查看下生成的相关文件:

public interface AdministratorMapper{
    ...
    int logicDelete(Long id);
    int logicDeleteWithUIndex(@Param("id")Long id, @Param("uIndexes")String ... uIndexes);
}
<updateid="logicDelete"parameterType="java.lang.Long">
   update administrator
   set deleted = 1, update_time = REPLACE(unix_timestamp(current_timestamp(3)),'.','') where id = #{id,jdbcType=BIGINT}
 </update>

 <updateid="logicDeleteWithUIndex"parameterType="map">
   update administrator A,
   (select C.deleted  from administrator C,
   (select
   <foreachcollection="uIndexes"index="index"item="column"separator=",">
     ${column}
   </foreach>
   from administrator where id = #{id,jdbcType=BIGINT}) D
   <where>
     <foreachcollection="uIndexes"index="index"item="column">
        and C.${column} = D.${column}
     </foreach>
   </where>
   order by C.deleted desc limit 1) B
   set A.deleted = B.deleted + 1, A.update_time = REPLACE(unix_timestamp(current_timestamp(3)),'.','')
   where A.id = #{id,jdbcType=BIGINT}
   and A.deleted = 0
 </update>

如何使用

使用方式如下:

这里同样用到了之前添加到Model类中的表字段枚举。

administratorMapper.logicDeleteWithUIndex(id, Administrator.COLUMNS.MOBILE.getColumn()

本章节就到这里了。以后要用插件来实现一些特殊的Sql,应该可以举一反三了。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

笨办法学Python 3

笨办法学Python 3

[美]泽德 A. 肖 / 王巍巍 / 人民邮电出版社 / 2018-6-1 / CNY 59.00

本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。本书是基于Python 3.6版本编写的。 本书结构非常简单,除“准备工作”之外,还包括52个习题,其中26个覆盖了输入/输出、变量和函数3个主题,另外26个......一起来看看 《笨办法学Python 3》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具