精华内容
下载资源
问答
  • mybatis逻辑删除

    千次阅读 2019-09-13 22:03:54
    github地址https://github.com/heng1234/mybatis_plus pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=...

    github地址https://github.com/heng1234/mybatis_plus

    pom.xml

    <?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 http://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.1.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.hlvy</groupId>
        <artifactId>mybatis_plus</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>mybatis_plus</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.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <!--引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题-->
           <!-- <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.0.1</version>
            </dependency>-->
    
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    <!--mybatis-plus-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.1.2</version>
            </dependency>
    <!--mybatis-plus-generator-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.1.2</version>
            </dependency>
    
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <!--freemarker-->
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.28</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    MybatisPlusConfig
    package com.hlvy.mybatis_plus.config;
    
    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.core.parser.ISqlParser;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
    import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
    import net.sf.jsqlparser.expression.Expression;
    import net.sf.jsqlparser.expression.LongValue;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * MybatisPlusConfig
     *
     * @author heng
     * @date 2019/4/17
     **/
    //Spring boot方式
    @EnableTransactionManagement
    @Configuration
    @MapperScan("com.hlvy.mybatis_plus.mapper")
    public class MybatisPlusConfig {
    
        /**
         * SQL执行效率插件
         */
        @Bean
        //@Profile({"dev","test"})// 设置 dev test 环境开启
        public PerformanceInterceptor performanceInterceptor() {
            return new PerformanceInterceptor();
        }
    
        /**
         * 逻辑删除 3.1版本及以下需要加入
         * @return
         */
       /* @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }*/
        /**
         * 分页插件
         * @return
         */
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    
       // @Bean
        public PaginationInterceptor paginationInterceptor1() {
            PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
            //paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持
            /*
             * 【测试多租户】 SQL 解析处理拦截器<br>
             * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
             */
            List<ISqlParser> sqlParserList = new ArrayList<>();
            TenantSqlParser tenantSqlParser = new TenantSqlParser();
            tenantSqlParser.setTenantHandler(new TenantHandler() {
                @Override
                public Expression getTenantId() {
                    return new LongValue(1L);
                }
    
                /**
                 * 设置id名字
                 * @return
                 */
                @Override
                public String getTenantIdColumn() {
                    return "id";
                }
    
                @Override
                public boolean doTableFilter(String tableName) {
                    // 这里可以判断是否过滤表
                /*
                if ("user".equals(tableName)) {
                    return true;
                }*/
                    return false;
                }
            });
            sqlParserList.add(tenantSqlParser);
            paginationInterceptor.setSqlParserList(sqlParserList);
          /*  paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
                @Override
                public boolean doFilter(MetaObject metaObject) {
                    MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
                    // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
                    if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
                        return true;
                    }
                    return false;
                }
            });*/
            return paginationInterceptor;
        }
    }

    user

    package com.hlvy.mybatis_plus.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.baomidou.mybatisplus.extension.activerecord.Model;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    
    import java.util.Date;
    
    /**
     * User
     *
     * @author heng
     * @date 2019/4/11
     **/
    @Data
    /**@auth
     * @TableName 指定数据库表名
     * extends Model<User> AR模式
     * @EqualsAndHashCode(callSuper = false) 去除AR模式继承没调用父类方法警告警告
     */
    @TableName("User")
    @EqualsAndHashCode(callSuper = false)
    public class User  extends Model<User> {
    
        /**
         * @TableId 指定主键列名及主键策略方式
         */
        @TableId(value = "id",type = IdType.NONE)
        private Long id;
        /**
         * 姓名
         *@TableField 指定数据库列名
         */
        @TableField(condition = SqlCondition.LIKE,value = "name")
        private String name;
    
        /**
         * 年龄
         */
        @TableField(condition = "%s&lt;#{%s}")
        private Integer age;
    
        /**
         * 邮箱
         */
        @TableField("email")
        private String email;
        /**
         * 直属上级id
         */
        private Long managerId;
        /**
         * 创建时间
         */
        private Date createdTime;
    
        /**
         * 修改时间
         */
        private Date updateTime;
    
        /**
         * 版本
         */
        private Integer version;
        /**
         * 0、未删除 1、已删除
         */
        @TableLogic//逻辑删除标识
        @TableField(select = false)//查询的时候不显示
        private Integer deleted;
    
    
        /** 备注  非数据库字段需要排除
         * 方法一加入transient 不让该变量序列化 不推荐
         *  方法二加入static 但是lombok不会生成get set方法需要自己手动添加 不推荐
         *  方法三  @TableField(exist = false) 默认是true 改为false表示不是数据库字段 推荐
         * */
        @TableField(exist = false)
        private /*static*/  /*transient*/ String remark;
    }
    

    userMapper

    package com.hlvy.mybatis_plus.mapper;
    
    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.core.toolkit.Constants;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.hlvy.mybatis_plus.entity.User;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    /**
     * UserMapper
     *
     * @author heng
     **/
    
    public interface UserMapper extends BaseMapper<User> {
    
       /* @Select("select * from user ${ew.customSqlSegment}")*/
       List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
    
    
       IPage<User> selectUserPage(Page<User> page,@Param(Constants.WRAPPER) Wrapper<User> wrapper);
    }
    

    application.yml  

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

    server:
      port: 9091
    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/mytest?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
    mybatis-plus:
      #MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。
      type-aliases-package: com.hlvy.mybatis_plus.entity
      #该配置请和 typeAliasesPackage 一起使用,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
      type-aliases-super-type: java.lang.Object
      #MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。
      mapper-locations: classpath*:mybatis/*.xml
      #MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。
      #config-location: classpath:mybatis-config.xml
      #启动时是否检查 MyBatis XML 文件的存在,默认不检查
      check-config-location: false
      global-config:
        db-config: #配置逻辑删除
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
          #id-type: none #全局策略
          #field-strategy: ignored #所有字段加入crud语句中 一般不这么设置 默认not_null
          #table-prefix: t_ #表的前缀
          #table-underline: true #表名是否使用下划线
        #configuration:#不能与config-location同时出现
        #map-underscore-to-camel-case: true
    #设置日志 级别
    logging:
      level:
        root: warn
        com.hlvy.mybatis_plus: trace
      pattern:
        console: '%P%m%n'

    test测试

    package com.hlvy.mybatis_plus.userTest;
    
    import com.baomidou.mybatisplus.core.toolkit.Wrappers;
    import com.hlvy.mybatis_plus.entity.User;
    import com.hlvy.mybatis_plus.mapper.UserMapper;
    import com.hlvy.mybatis_plus.service.UserService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    
    /**
     * UserTestNew
     * mp进阶
     * @author heng
     * @date 2019/4/11
     **/
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserTestNew {
    
        @Autowired
        private UserMapper userMapper;
        /**
         * 逻辑删除演示
         * 执行sql UPDATE User SET deleted=1 WHERE id=1171800278613643266 AND deleted=0
         */
        @Test
        public void deleteByIdOne() {
            System.out.println(userMapper.deleteById(1171800278613643266L));
        }
    
        /**
         * 查询未删除的会自动带入 where deleted=0
         * 执行sql  SELECT id,name,age,email,manager_id,created_time,update_time,version,deleted FROM User WHERE deleted=0
         */
        @Test
        public void selectOne() {
            List<User> list = userMapper.selectList(null);
            list.forEach(System.out::println);
        }
    
        /**
         * 修改 会自动带入 where deleted=0
         * 执行sql  UPDATE User SET age=17 WHERE id=5 AND deleted=0
         */
        @Test
        public void updateOne() {
          User user = new User();
          user.setId(5L);
          user.setAge(17);
          System.out.println(userMapper.updateById(user));
        }
    
        /**
         * 查询全局排除deleted字段
         * 实体类 属性加入  @TableField(select = false)//查询的时候不显示
         */
    
        /**同执行上面select可以看到 自定义的语句不可以排除被删除的也可以查询出来*/
        /**
         * select * from user WHERE age > 17  不会带deleted=0
         * 可以自己加上 .eq(User::getDeleted,0)
         * select * from user WHERE age > 17 AND deleted = 0
         * 也可以写到sql只剩下安德文
         */
        @Test
        public void selectListOne() {
            List<User> list = userMapper.selectAll(Wrappers.<User>lambdaQuery()
                    .gt(User::getAge,17).eq(User::getDeleted,0));
            list.forEach(System.out::println);
        }
    
    
    }

     

    展开全文
  • tkmybatis逻辑删除踩坑原理详解

    千次阅读 2020-07-15 17:29:53
    tkmybatis逻辑删除踩坑原理详解逻辑删除示例(前景提要)QuestionSolution解决方法总结 逻辑删除示例(前景提要) 在实体类中加入@LogicDelete字段,表示在数据库中对这张对应的表进行逻辑删除。 Question 在引入 ...

    逻辑删除示例(前景提要)

    在实体类中加入@LogicDelete字段,表示在数据库中对这张对应的表进行逻辑删除。
    你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    Question

    在引入 tkmybatis逻辑删除后,日常使用如下方法

    
        public int delete(T t);
    
        public int deleteByExample(Example example);
    
        public int deleteByCondition(Object condition);
    
        public int deleteByPrimaryKey(Object key);
    
    
    

    会对该表中的数据进行逻辑删除,此时逻辑删除是生效的。但是今天当使用了这个方法:

    public int deleteByIds(String ids);
    

    发现逻辑删除失效了,导致我以为@LogicDelete这块出问题了,后来先试了试别的删除方法发现逻辑删除是正常的。估计是deleteByIds方法本身的实现出了问题。怎么办呢?那只能去源码里面一探究竟了。

    Solution

    在这里插入图片描述
    跳入方法只有一个接口,方法上面的注解标注了provider类,跳入一探究竟。
    在这里插入图片描述
    在这里插入图片描述
    可以看出来,这个方法实现体根本就没有判断实体类是不是含有@LogicDelete注解,直接在拼SQL时,拼入Delete 关键字,这要能逻辑删除就见鬼了。
    接下来上一下实现了逻辑删除的代码片
    在这里插入图片描述
    在这里插入图片描述

    解决方法

    1.用deleteByExample\deleteByCondition代替deleteByIds方法
    2.或者自己写一段代码,来覆盖掉这个接口。

    总结

    嗯,有一些不太理解为什么要这么做,既然做了逻辑删除应该所有的删除方法都应该实现,结果这个却漏了,不知道是开发人员漏了还是故意的。希望以后的开发中不会像这样,给别人挖坑。

    展开全文
  • mybatis plus逻辑删除

    2020-06-19 14:47:23
    删除后数据库就没了,但是有时候需要我们在页面不显示但是是删除操作,这是可以使用mybatis-plus的逻辑删除。 一、在appliction.yml中配置 mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-...

    我们正常的删除都是物理删除。删除后数据库就没了,但是有时候需要我们在页面不显示但是是删除操作,这是可以使用mybatis-plus的逻辑删除。
    一、在appliction.yml中配置

    mybatis-plus:
      mapper-locations: classpath:/mapper/**/*.xml
      global-config:
        db-config:
          id-type: auto  
          logic-delete-value: 1  # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    

    二、 在实体上使用

    @TableLogic(value = "1",delval = "0")  //逻辑删除
       private Integer showStatus;
    

    mybatisplus版本须大于3.2

    展开全文
  • Mybatis Plus逻辑删除

    2020-10-21 18:58:44
    1、首先在实体类中的删除字段添加注解 @TableLogic @TableField(deleteFiled) private String deleteFiled; 2、在配置文件中设置: mybatis-plus: global-config: db-config: # 不配置的话默认也是1 ...

    1、首先在实体类中的删除字段添加注解

    @TableLogic

    @TableField(deleteFiled)

    private String deleteFiled;

     

    2、在配置文件中设置:

    mybatis-plus:
      global-config:
        db-config:
          # 不配置的话默认也是1
          logic-delete-value: 1
          # 不配置的话默认也0
          logic-not-delete-value: 0

     

    3、使用 baseMapper.deleteById(entityBean) 方法实现逻辑删除,也就是更新删除字段的值

    展开全文
  • #逻辑删除定义 logic-not-delete-value: 0 #0为未删除 logic-delete-value: 1 #1为已删除 mybatis-plus: global-config: db-config: # 逻辑删除定义 logic-not-delete-value: 0 logic-delete-value: 1 实体...
  • 7.MyBatis Plus逻辑删除

    2020-07-22 09:19:52
    7.MyBatis Plus逻辑删除 ​ 什么是逻辑删除? 举个例子,就好比回收站,并不是真正的删除数据,而是通过一个逻辑变量来使数据失效! 只对自动注入的sql起效: 插入: 不作限制 查找: 追加where条件过滤掉已...
  • Mybatis-逻辑删除实现

    2021-04-16 23:39:18
    步骤: 在实体类中添加注解@TableLogic注解,布尔值 如果逻辑删除的配置不是1和0,那么需要在yml中配置,如上图,删除的为可自定义。
  • 1.在实体类单个配置 value代表 默认逻辑未删除值(该值可无、会自动获取全局配置) delval 默认逻辑删除值(该值可无、会自动获取全局配置) 2.统一配置,在配置文件
  • mybatis批量删除(逻辑删除

    千次阅读 2016-10-08 10:18:00
    -- 批量删除 --&gt; 2 &lt;delete id="deleteAd" parameterType="java.util.List"&gt; 3 update cnt_advert set is_enable = '0' 4 where id in 5 &lt;foreach item...
  • 在项目中尝试着去使用了Mybatis plus的逻辑删除,开始的时候认为应该是使用xxxService.updateById(id)来更新数据的状态 TNotice notice = new TNotice(); notice.setId(id); notice.setDeleteStatus("1"); ...
  • mybatis-plus 逻辑删除

    2020-11-23 16:54:31
    mybatis-plus 逻辑删除
  • Mybatis plus逻辑删除失败的BUG

    千次阅读 2018-10-15 17:37:53
    开发调试的时候发现Mybatis Plus的逻辑删除失效了,看了下配置文件发现没有问题,通过查看以下源码发现 逻辑删除需要注入的bean,查看这个bean的源码如下 查看其中一个实例的类的源码,如通过ID逻辑删除...
  • 逻辑删除的意思就是只是在逻辑上删除了,在数据库里它还是存在的只是被打上了删除标记。 步骤1: 引入Mybatis Plus 3.3.0 的依赖 <!--MYBATISPLUS啟動器--> <dependency> <groupId>...
  • mybatis-plus逻辑删除

    2021-03-12 21:02:33
    当为表中字段定义逻辑删除is_delete = 1 为删除。is_delete = 0 默认 1. 配置application.yml mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-...
  • MyBatis-Plus 逻辑删除

    2021-02-19 15:12:47
    #配置逻辑删除 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 实体类字段上加上@TableLogic注解 @TableLogic //逻辑删除 private ...
  • Mybatis实现物理删除和逻辑删除。 1.首先明白什么是物理删除,什么是逻辑删除? 什么是物理删除呢?就是直接干掉数据库的数据,无法再恢复回来。但在当今的企业级项目中,物理删除已经非常少见,而是使用逻辑删除。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,168
精华内容 467
关键字:

mybatis逻辑删除