精华内容
下载资源
问答
  • MybatisPlus中的删除和逻辑删除

    千次阅读 2020-07-28 22:26:53
    在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧 首先假设我有这样一张表 实体类: package com.atguigu.mybatis_plus.entity; import ...

    删除又分为逻辑删除和物理删除,那么它们有什么区别呢?
    物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
    逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
    在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧
    首先假设我有这样一张表
    在这里插入图片描述
    实体类:

    package com.atguigu.mybatis_plus.entity;
    import java.util.Date;
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import lombok.Data;
    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        // @TableField(fill = FieldFill.UPDATE)
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        
    }
    

    userMapper接口:

    package com.atguigu.mybatis_plus.mapper;
    import com.atguigu.mybatis_plus.entity.User;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    // 继承BaseMapper后UserMapper就具有了CRUD功能
    public interface UserMapper extends BaseMapper<User>{
    }
    

    一、物理删除
    1、根据id删除记录

    @Test
        public void testLogicDelete() {
            int count = userMapper.deleteById(1L);  // 删除id为1的数据
            System.out.println("受影响的行数"+count);
        }
    

    2、批量删除

    @Test
    public void testDeleteBatchIds() {
        int result = userMapper.deleteBatchIds(Arrays.asList(2, 3, 4)); // 删除id为2,3,4的数据
        System.out.println(result);
    }
    

    结果:
    在这里插入图片描述
    物理删除比较简单,接下来我们看看逻辑删除怎么实现吧!
    二、逻辑删除
    (1)数据库修改,添加 deleted字段
    在这里插入图片描述(2)实体类修改,添加deleted 字段,并加上 @TableLogic 注解

     /*
        加@TableLogic的情况下,程序内部会将delete语句变为update语句
        实际上我们写的代码并不需要做出什么改变
        */
        @TableLogic
        private Integer deleted;
    

    (3)测试

    	/**
         * 逻辑删除
         */
        @Test
        public void testLogicDelete() {
            int count = userMapper.deleteById(5L);
            System.out.println("受影响的行数"+count);
        }
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    • 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
    • 测试后分析打印的sql语句,是一条update
    • 注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
      (5)测试逻辑删除后的查询,MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
    @Test
        public void testSelect() {
            List<User> users = userMapper.selectList(null); // 查询所有记录
            users.forEach(System.out::println); // 遍历输出
        }
    

    结果:
    在这里插入图片描述

    展开全文
  • plus,用了mybatis,但是mybatis-plus中有许多mybatis中没有的功能,就比如mybatis-plus自动集成了逻辑删除功能,而mybatis需要自己去写,今天我就来描述一下在springboot集成mybatis的情况下,怎么实现逻辑删除吧。...

    最近写了一个项目,没有用mybatis-plus,用了mybatis,但是mybatis-plus中有许多mybatis中没有的功能,就比如mybatis-plus自动集成了逻辑删除功能,而mybatis需要自己去写,今天我就来描述一下在springboot集成mybatis的情况下,怎么实现逻辑删除吧。

    1. 首先我们用一张表使用mybatis-generator自动生成mapper、mapper.xml、model的一些类。(这里不管你用什么表,但是需要表中必须有一个逻辑删除字段,一般我们都需要用is_deleted设置为逻辑删除字段)
    2. 我们额外什么插件都不需要配置,我们只需要在删除的时候,进行修改操作就可以了,我们修改我们的is_deleted的值就可以了。
    3. 当我们再次查询的时候,就需要修改mybatis-generator给我们自动生成的sql语句了
      (1)当我们在service中使用selectByPrimaryKey()方法时,我们就需要在mapper.xml中的加上and is_deleted = 0
      在这里插入图片描述
      (2)当我们在service中使用selectByExample()方法时,我们就不要再mapper.xml中修改sql语句中,我们最好在service中修改逻辑代码,因为对于分页筛选查询的方法,在mapper中已经封装好了,如果我们冒然修改,可能会导致500的错误。
      在这里插入图片描述
      好吧,是不是很简单,相比于mybatis-plus,我们集成mybatis实现逻辑删除更简单。
    展开全文
  • SpringBoot+Mybatis-Plus实现逻辑删除 所谓逻辑删除根本上就是我们指定一个字段更改它的状态来标记这条数据是否被删除,和普通的删除相比逻辑删除的数据并不会真正的丢失,只是不展示出来而已。但是我们在查询的时候...

    SpringBoot+Mybatis-Plus实现逻辑删除

    所谓逻辑删除根本上就是我们指定一个字段更改它的状态来标记这条数据是否被删除,和普通的删除相比逻辑删除的数据并不会真正的丢失,只是不展示出来而已。但是我们在查询的时候也是要考虑到的。Mybatis-Plus提供了这个功能。

    在这里插入图片描述

    官网的截图:侵删

    注意只对自动注入的sql有效,自己去写的sql还是要加入限制条件的


    下面就讲怎么去使用

    1. 建表

    必须要有代表逻辑删除的字段,类型在第一张图里 最好将这个字段设置成初始值为0,代表着未删除

    CREATE TABLE `user`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
      `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
      `age` int(10) NULL DEFAULT NULL COMMENT '年龄',
      `deleted` int(1) NULL DEFAULT NULL COMMENT '是否删除',
      PRIMARY KEY (`id`) USING BTREE
    )
    

    2. 创建一个Spring boot项目

    具体怎么来可以百度搜
    在这里插入图片描述
    大约是这种结构,小鸟是因为插件

    3. 引入依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.3</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <!--        数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    <!--        lombok 可以不用引入 如果不引入记得实体类生成get/set方法-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--        mabtis-plus-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>3.4.1</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.1</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-core</artifactId>
                <version>3.4.1</version>
            </dependency>
        </dependencies>
    </project>
    
    

    4.编写spring boot的配置文件 applicetion.yml

    !!!注意数据库用自己的

    server:
    #  启动后的端口号
      port: 8080
    spring:
    #  数据库设置  记得换成自己的设置
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/charts?serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
    mybatis-plus:
    #  mybatis xml文件的位置
      mapper-locations: classpath:mapper/*.xml
      global-config:
        db-config:
    #      字段删除时的标记
          logic-delete-value: 1
    #      字段未删除时的标记
          logic-not-delete-value: 0
    #      全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
          logic-delete-field: deleted
    

    5.实体类

    一定要加上这个注解

    package com.example.pojo;
    
    import java.io.Serializable;
    
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import lombok.Data;
    
    /**
     * @TableName user
     */
    //这个注解如果报错就是没有引入lombok 或者没有安装lombok插件 删除之后生成get/set方法即可
    @Data
    public class User implements Serializable {
        /**
         * id
         */
        private Long id;
    
        /**
         * 用户名
         */
        private String username;
    
        /**
         * 密码
         */
        private String password;
    
        /**
         * 年龄
         */
        private Integer age;
    
        /**
         * 是否删除
         * 这里一定要加这个注解  代表删除字段的标记
         */
        @TableLogic
        private Integer deleted;
    }
    

    6.Dao层

    package com.example.dao;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.pojo.User;
    import org.springframework.stereotype.Repository;
    
    /**
     * 注意继承BaseMapper类,里面有mybatis-plus为我们提供的一些方法
     * 而且只有这些提供的方法才能使用逻辑删除
     */
    @Repository
    public interface UserDao extends BaseMapper<User> {
    
    }
    

    太麻烦就不写service层了,直接从Conrtoller层调用Dao层,但是大家在学习和工作要养成规范的好习惯

    7.Controller层

    package com.example.controller;
    
    
    import com.example.dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("user")
    public class UserController {
        @Autowired
        UserDao userDao;
        @PostMapping("deleteUserById")
        public boolean deleteUserById(long id){
            //调用mybatis-plus提供的删除方法
            int result = userDao.deleteById(id);
            if (result>0){
                return true;
            }else {
                return false;
            }
        }
    }
    
    

    8.注意

    最后别忘了在启动类加这个注解,参数是dao包
    在这里插入图片描述

    启动

    如果看到下面的东西就是启动成功了
    在这里插入图片描述

    测试一下

    数据库
    在这里插入图片描述
    请求返回
    在这里插入图片描述
    再看数据库
    在这里插入图片描述
    最后查看数据库的时候别忘了刷新一下

    查询我就不写了,感兴趣的可以写一个查询试试看看是否回过滤掉,当然写个博客更好了
    最后附上Gitee地址:https://gitee.com/CXYxiaoming/mybatisplus_luojishanchu.git
    有问题可以私信,不一定回复的及时

    展开全文
  • 正在做一个调查问卷,怎么将答案选项和题目关联进行逻辑跳转, 问卷是可编辑的,题目可以增加删除,调整顺序
  • SpringBoot整合MyBatis-Plus,实现代码生成器,逻辑删除,自动填充等功能 mybatis-plus简介: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。...

    SpringBoot整合MyBatis-Plus,实现代码生成器,逻辑删除,自动填充等功能

    mybatis-plus简介:

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

    1.添加pom引用

        <!--mybatis-plus 依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!-- mybatis plus 代码生成器依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!-- 代码生成器模板 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>
    

    2.yml配置

    mybatis-plus:
      mapper-locations: classpath:/mybatis-mappers/*Mapper.xml
      typeAliasesPackage: com.tckj.wx.application.entity
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    

    3.启动类

    /**
     * @author WCH
     * @date 2020/6/11 11:49
     */
    @SpringBootApplication
    @MapperScan("com.tckj.wx.application.dao")
    public class SpringbootApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootApplication.class, args);
        }
        @Bean
        public RestTemplate restTemplate(){
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());
            return restTemplate;
        }
    
    }
    

    4.代码生成器

    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.core.toolkit.StringPool;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.InjectionConfig;
    import com.baomidou.mybatisplus.generator.config.*;
    import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
    import com.baomidou.mybatisplus.generator.config.po.TableInfo;
    import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * @author WCH
     * @date 2020/6/23 17:07
     */
    public class MysqlGenerator {
        public static void main(String[] args) {
            // 代码生成器
            AutoGenerator mpg = new AutoGenerator();
    
            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            String projectPath = System.getProperty("user.dir");
            gc.setOutputDir(projectPath + "/src/main/java");
            gc.setAuthor("WCH");
            gc.setOpen(false);
            // service 命名方式
    //        gc.setServiceName("%sService");
    //        // service impl 命名方式
    //        gc.setServiceImplName("%sServiceImpl");
    //        gc.setMapperName("%sMapper");
    //        gc.setXmlName("%sMapper");
            gc.setFileOverride(true);
            gc.setActiveRecord(true);
            // XML 二级缓存
            gc.setEnableCache(false);
            // XML ResultMap
            gc.setBaseResultMap(true);
            // XML columList
            gc.setBaseColumnList(true);
            gc.setSwagger2(true); //实体属性 Swagger2 注解
            mpg.setGlobalConfig(gc);
    
            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setDbType(DbType.MYSQL);
    
            dsc.setDriverName("com.mysql.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("root");
            dsc.setUrl("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8");
            mpg.setDataSource(dsc);
    
            // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent("com.tckj.wx.application");
            pc.setEntity("entity");
            pc.setService("service");
            pc.setMapper("dao");
            pc.setServiceImpl("service.impl");
            mpg.setPackageInfo(pc);
    
            // 自定义配置
            InjectionConfig cfg = new InjectionConfig() {
                @Override
                public void initMap() {
                    // to do nothing
                }
            };
    
            // 如果模板引擎是 freemarker
            String templatePath = "/templates/mapper.xml.ftl";
            // 如果模板引擎是 velocity
            // String templatePath = "/templates/mapper.xml.vm";
    
            // 自定义输出配置
            List<FileOutConfig> focList = new ArrayList<>();
            // 自定义配置会被优先输出
            focList.add(new FileOutConfig(templatePath) {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                    return projectPath + "/src/main/resources/mybatis-mappers/"
                            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                }
            });
            /*
            cfg.setFileCreate(new IFileCreate() {
                @Override
                public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                    // 判断自定义文件夹是否需要创建
                    checkDir("调用默认方法创建的目录");
                    return false;
                }
            });
            */
            cfg.setFileOutConfigList(focList);
            mpg.setCfg(cfg);
    
            // 配置模板
            TemplateConfig templateConfig = new TemplateConfig();
    
            // 配置自定义输出模板
            //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
            // templateConfig.setEntity("templates/entity2.java");
            // templateConfig.setService();
            // templateConfig.setController();
    
            // 生成带有Swagger注解的实体类
            templateConfig.setController("templates/controller.java");
            //templateConfig.setEntity("templates/controller.java.ftl");
            templateConfig.setXml(null);
            mpg.setTemplate(templateConfig);
    
            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            strategy.setNaming(NamingStrategy.underline_to_camel);
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
            //strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
            strategy.setEntityLombokModel(true);
            strategy.setEntityTableFieldAnnotationEnable(true);
            strategy.setRestControllerStyle(true);
            // 公共父类
    //        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
            // 写于父类中的公共字段
    //        strategy.setSuperEntityColumns("id");
            strategy.setTablePrefix(new String[] { "tb_"});
            strategy.setControllerMappingHyphenStyle(true);
            mpg.setStrategy(strategy);
            strategy.setInclude(new String[] { "tb_menu","tb_role","tb_user_role","tb_role_menu" });//表名
            mpg.setTemplateEngine(new FreemarkerTemplateEngine());
            mpg.execute();
        }
    }
    

    注意:代码生成器可以直接复制过去使用,根据自己实际情况修改数据库配置,包文件路径等, templateConfig.setController(“templates/controller.java”);这段代码是我自定义的controller模板,可以删除使用默认的

    5.controller调用service层的增删改查

    	@ApiOperation(value = "添加组织机构")
        @PostMapping("saveOrUpdate")
        public ResultHelper saveOrUpdate(@RequestBody Organization organization){
            boolean b = organizationService.saveOrUpdate(organization);
            return ResultHelper.succeed(organization);
        }
    
    
        @ApiOperation(value = "查询所有机构")
        @GetMapping("findList")
        public ResultHelper findList(){
            List<Organization> list = organizationService.list();
            return ResultHelper.succeed(list);
        }
    
        @ApiOperation(value = "删除机构")
        @ApiImplicitParam(name = "id",value = "机构id",required = false,dataType = "int",paramType = "query")
        @GetMapping("deleteOrganizationById")
        public ResultHelper deleteOrganizationById(@RequestParam Integer id){
            boolean b = organizationService.removeById(id);
            if (!b){
                return ResultHelper.failed2Msg("删除失败");
            }
            return ResultHelper.succeed("删除成功");
        }
    

    注意:service都实现com.baomidou.mybatisplus.extension.service.IService接口,里面所有放法都可以使用,其他方法可以点进去学习一下

    6.service调用dao层的增删改查

    public int addOrganization(Organization organization){
            int insert = organizationMapper.insert(organization);
            return insert;
        }
    
        public int updateByIdOrganization(Organization organization){
            int insert = organizationMapper.updateById(organization);
            return insert;
        }
    
        public List<Organization> findList(){
            return organizationMapper.selectList(null);
        }
    
        public int deleteOrganizationById(Integer id){
            return organizationMapper.deleteById(id);
        }
    

    注意:dao都实现com.baomidou.mybatisplus.core.mapper.BaseMapper接口,里面所有放法都可以使用,其他方法可以点进去学习一下

    7.分页需要使用mybatisplus自带插件,我使用的是配置类配置

    /**

    • @author WCH

    • @date 2020/6/24 10:09
      */
      @Configuration
      public class MybatisPlusConfig {

      @Bean
      public PaginationInterceptor getPaginationInterceptor(){
      PaginationInterceptor paginationInterceptor=new PaginationInterceptor();
      paginationInterceptor.setDialectType(“mysql”);
      return paginationInterceptor;
      }

    }

    配置成功之后就可以使用Page进行分页
    列:

     @ApiOperation(value = "机构分页查询")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "current",value = "当前页数",required = false,dataType = "int",paramType = "query",defaultValue = "1"),
                @ApiImplicitParam(name = "size",value = "每页显示数量",required = false,dataType = "int",paramType = "query",defaultValue = "10")
        })
        @GetMapping("findPage")
        public ResultHelper findPage(@RequestParam(required = false,defaultValue = "1") Integer current,
                                     @RequestParam(required = false,defaultValue = "10") Integer size){
            IPage<Organization> page = organizationService.page(new Page<>(current, size));
            return ResultHelper.succeed(page);
        }
    

    8.逻辑删除

    	@ApiModelProperty(value = "状态(0有效,1无效)")
        @TableLogic
        private Integer enabled;
    

    在字段上面添加@TableLogic注解在yml中配置逻辑删除值

    mybatis-plus:
        db-config:
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    

    配置成功之后调用查询方法会默认在sql后面加上where enable=0

    9.自动填充

    	@ApiModelProperty(value = "创建时间")
        @TableField(value = "create_time",fill = FieldFill.INSERT)
        private Date createTime;
    
        @ApiModelProperty(value = "修改时间")
        @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    

    使用fill = FieldFill.INSERT_UPDATE设置填充类型

    /**
     * @author WCH
     * @date 2020/6/24 11:16
     */
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            /*this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
            this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`)*/
            /* 上面选其一使用,下面的已过时(注意 strictInsertFill 有多个方法,详细查看源码) */
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
            //this.setInsertFieldValByName("operator", "Jerry", metaObject);
    
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
    //        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
    //        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`)
            /* 上面选其一使用,下面的已过时(注意 strictUpdateFill 有多个方法,详细查看源码) */
            //this.setFieldValByName("operator", "Tom", metaObject);
            //this.setUpdateFieldValByName("operator", "Tom", metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
    
    

    自定义处理器实现MetaObjectHandler接口,完成填充逻辑

    展开全文
  • 如题,指的是在restful风格的url设计中,怎么实现批量删除呢? 这里指的删除是真删除,不是逻辑删除。如果是逻辑删除,其实就是update,使用put方法即可 如果是需要删除一个条目,可以直接将需要删除的条目的id...
  • 磁盘管理之逻辑

    2016-08-31 17:50:09
    写在前面: 本文一共分个部分来讲解逻辑卷的一些操作及注意事项,其中第一部分介绍了什么是逻辑卷,逻辑卷的实现原理是什么,还有包括其中的一些名词解释;第二部分主要是介绍怎么创建,删除,和增加物理卷(PV);第...
  •  本文一共分个部分来讲解逻辑卷的一些操作及注意事项,其中第一部分介绍了什么是逻辑卷,逻辑卷的实现原理是什么,还有包括其中的一些名词解释;第二部分主 要是介绍怎么创建,删除,和增加物理卷(PV);第三部分是...
  • 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。 循环队列状态:初始时:Q.front=Q.rear=0front指针移动:Q.front=(Q.front+1)%MaxSizerear指针移动:Q.rear=(Q.rear+1)%MaxSize队列长度:(Q.rear+MaxSize-Q....
  • 透彻解读mysql的可重复读、幻读及实现原理

    万次阅读 多人点赞 2019-05-15 15:21:30
    二、mysql怎么实现的可重复读 举例说明MVCC的实现 MVCC逻辑流程-插入 MVCC逻辑流程-删除 MVCC逻辑流程-修改 MVCC逻辑流程-查询 三、幻读 快照读和当前读 四、如何解决幻读 事务隔离级别有四种,mysql默认...
  • MySQL的可重复读、幻读及实现原理

    千次阅读 2021-02-08 23:29:19
    二、mysql怎么实现的可重复读 举例说明MVCC的实现 MVCC逻辑流程-插入 MVCC逻辑流程-删除 MVCC逻辑流程-修改 MVCC逻辑流程-查询 三、幻读 快照读和当前读 四、如何解决幻读 事务隔离级别有四种,mysql默认使用的是可...
  • 按钮状态怎么实现就不说了,之前的DAILOG实例里面有, 单独把这个按钮拿出来重新记录一遍,不管是TB 还是ALV,想要添加一些按钮,最终的操作都是对展示数据的内表进行操作。 (讲这段代码小改一下,放在对应CODE得...
  • Java实现循环队列

    2021-06-05 17:30:41
    Java实现循环队列什么是循环队列循环队列操作1.自定义循环队列结构2.队列初始化3.判断队列是否为空4.判断队列长度5.队列入队6.队列出队7.取队头元素QueueDemoTest 什么是循环队列 顺序队列在操作时容易暴露假溢出...
  • B树的java实现

    千次阅读 2008-12-03 07:09:00
    上周看MIT, > 的时候, 觉得B tree 实现起来有点麻烦, 正好可以... 在动手写之前关键是明白B tree到底是怎么实现的。我先实现了insert, 因为这个方法简单一些, 也借机加深对B tree的认识。 再实现的删除方法。关键的注
  • 使用DAO模式实现电子宠物数据更新

    千次阅读 2018-03-26 13:56:03
    下面以电子宠物系统为例,看看具体是怎么实现的:1、定义父类BaseDao,实现数据库连接与关闭,和增、删、改的操作。2、定义接口类PetDao,定义了保存,删除,更新等各种对数据库的访问方法。3、定义实...
  • 双向链表的简单实现

    2014-12-10 15:59:54
    怎么个不一样就不废话了,但是总结一条,这种存储方式的不同使得数组便于随机存取,而链表在删除和插入方面效率要比数组高。 二、代码实现:(操作指针是要保持头脑清醒,时刻注意NULL,你懂得,哈哈) #include ...
  • 引子作为菜鸟的我面试过程中总是会被虐的体无完肤,即使知道是怎么一回事,但由于没有彻底掌握住,还是在关键时刻无法及时运用。所以多总结应该是我现在时常要做的事。遇到的这个机试题就是关于无限级分类的知识。...
  • 如果要牵扯到数据绑定等问题的话 会很复杂,但是我们可以把这个比较复杂的问题进行拆分,动态添加删除行和列,无非难点在于 怎么添加列 以及如何添加行,对于添加列逻辑可能稍显复杂 ,但是添加行倒是很简单,只需要...
  • 在emp中如何实现文件上传

    千次阅读 2009-04-12 23:16:00
    经常会有人问道emp怎么实现文件上传,这里我做一个简单的介绍:emp文件上传的设计思想是:所有的文件上传都由平台进行处理,平台将上传的文件统一放在一个临时的文件夹下,然后再由开发人员根据具体的业务需求对...
  • 删除是逻辑删除,就是把自己,还有关联的其他HISTORY都置零,没有DELETE FROM。关联的其他配置项有的是级联删除,也就是要把关联的另一个配置项主表的HISTORY也置零,有的是断开关系即可,就是把中间表HISTORY置零...
  • 在开发后台管理系统的时候,通常会有多个展示页面,比如book展示...这里我们以删除为例,看看怎么把多个函数重复的函数用一个函数实现所有的功能. 我们以book展示页和author的展示页为例子,通过一个delete函数,控制...
  • struts 1实现收发消息

    2009-08-23 18:28:01
    我没多少编程经验,也没做过啥项目,现在遇到以上问题不知道怎么解决,是数据库表设计时考虑的不周还是收发消息的逻辑方面的问题还是啥问题,希望有这方面经验的人能帮我一下,解决这个问题,技术方面我掌握的很有限...
  • 栈是操作受限的线性表,操作受限的意思是,栈的取出和压入都只能在一端进行,所以造成的结果就是元素的先进后出,而线性表是指栈中元素之间的逻辑关系是一对一的 允许插入和删除的一端,称之为栈顶,而固定无法操作的一端,...
  • 讲讲怎么实现一个 Virtual DOM 库。 <h3>snabbdom 总览 <p>snabbdom 的 ES6 改写代码可在 <a href="https://github.com/creeperyang/blog/tree/master/codes/snabbdom/">codes/snabbdom</a> 浏览,有 <code>id...
  • 作为一个声明式的UI框架,SwiftUI帮我们处理了几乎所有关于UI和数据之间的交互,这使我们不再需要关注数据变化时刷新UI和用户交互以后更新数据的逻辑。 为了实现数据和UI的绑定,我们需要利用Swift的一些关属性包装...
  • 针对线性表或栈或队列(三者任选一种逻辑结构),按要求完成类(模板)的实现,并使用提供的main函数测试程序。 2.完成时有几种选择: a.栈的实现。 b. 队列的实现。 c. 线性表的实现。 这里是栈的实现。...
  • 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚。希望在阅读本文后,能让你深入理解 Virtual DOM 算法,给你现有前端的编程...
  • (2)需要实现的功能: 1)用户根据口令进入系统 2)图书信息用文件保存,程序运行时从文件读入数据,程序结束前将数据保存在文件中 3)图书信息录入功能和浏览功能 4)排序功能(至少一种排序方式,如出版时间...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

逻辑删除怎么实现