mybatis逻辑删除[通俗易懂]

mybatis逻辑删除[通俗易懂]github地址https://github.com/heng1234/mybatis_pluspom.xml<?xmlversion=”1.0″encoding=”UTF-8″?><projectxmlns=”http://maven.apache.org/POM/4.0.0″xmlns:xsi=”http://www.w3.org/2001/XMLSche…

大家好,又见面了,我是你们的朋友全栈君。

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);
    }


}

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137005.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 牛顿法和梯度下降法_最优化次梯度法例题

    牛顿法和梯度下降法_最优化次梯度法例题我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等。最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素

  • Keras中创建LSTM模型的步骤[通俗易懂]

    Keras中创建LSTM模型的步骤[通俗易懂]目录写在前面概述环境1、定义网络2、编译网络3、训练网络4、评估网络5、进行预测一个LSTM示例总结写在前面本文是对The5StepLife-CycleforLongShort-TermMemoryModelsinKeras的翻译,新手博主,边学边记,以便后续温习,或者对他人有所帮助概述深度学习神经网络在Python中很容易使用Keras创建和评估,但您必须遵循严格的模型生命周期。在这篇文章中,您将了解创建、训练和评估Keras中长期记忆(LSTM)循环神经网络的分步生

  • gis中char是什么字段_输入一个字符串统计字母个数

    gis中char是什么字段_输入一个字符串统计字母个数维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abcQ abcQ ab

  • Android 三重缓存

    Android 三重缓存文章目录内存缓存Bitmap内存复用在Android应用中不可避免地要显示很多图片,如果不做处理,不管图片是否显示过,每次启动时都需要从网络拉取,这就极大影响了图片加载速度和浪费用户流量,并且整个应用中的图片内存无法控制在一个总的范围内。因此,图片缓存在一个图片加载模块中很重要并且不可缺少。目前比较流行的图片框架,如Glide、Fresco等,都使用了“内存-本地-网络”三级缓存策略。首…

  • WAP网页设计入门 [转]「建议收藏」

    WAP网页设计入门 [转]「建议收藏」WAP网页设计入门[转]手机专用网页(WML篇)1.基本规则2.基本格式和文件头3.显示文本4.显示图片5.锚和任务6.显示表单7.事件8.CGI编程   这里介绍WAP协议标准组织所制定的标记语言WML,由于和以前介绍的HDML在手机浏览器专用网页的特征上基本一致,所以概念部分就略去了,直接讲述语言。1。基本规则  * WML使用XML文档字符集…

    2022年10月25日
  • 六大算法之动态规划_leetcode迷宫最短路径

    六大算法之动态规划_leetcode迷宫最短路径在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。示例 1:输入:nums1 = [1,4,2], nums2 = [1,2,4]输出:2解释:可以画出两条不交叉的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号