Mybatisplus创建Spring Boot工程打包错误解决方法

Posted 买个等离子电视

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatisplus创建Spring Boot工程打包错误解决方法相关的知识,希望对你有一定的参考价值。

目录

打包问题解决方法在文章末尾

 创建Spring Boot工程

a.初始化工程

b.引入依赖

编写代码

a.配置application.yml

了解一下配置application.properties

 application.yml配置

b.启动类

c.创建实体类


 

 创建Spring Boot工程

a.初始化工程

 

 

dependencies:依赖关系 

b.引入依赖

 在pom.xml的dependencies中加入依赖关系

        <!--mybaties-plus启动器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--lombok用于简化实体类开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

 这里要特别注意我们的springboot工程刚创建的时候是没有添加版本的,有爆红错误,Plugin 'org.springframework.boot:spring-boot-maven-plugin:' not found。

这里只需要加上和开头处和父类版本一样的version即可 

 然后我们对maven进行刷新,让其安装对应的依赖关系,直到这些爆红的错误消失为止,如果有的错误没有消失(但是我们IDEA中已经安装完了相应的依赖),这个时候我们最好进行重启一下IDEA。

编写代码

a.配置application.yml

首先区分properties文件和yml文件的不同

properties   使用‘.’来进行分隔                     

yml   使用‘:’来进行分隔

yml中的一些格式比properties的要求要高。

创建application.yml只需要复制application.properties粘贴到resources中然后修改文件名即可。

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

了解一下配置application.properties

8.0版本以上的mysql需要引用的Driver是:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

5.0版本以上的mysql需要引用的Driver是:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

查看springboot使用的mysql版本需要在pom.xml中按ctrl打开mysql查看版本

 application.yml配置

 

spring:
  #配置数据源信息系
  datasource:
    #配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    #配置连接数据库的个人信息
    url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
    username: root
    password: abc123

 SpringBoot 版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区,否则会报错java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more

b.启动类

package com.atzeren.mybatiesplus;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MybatiesplusApplication 

    public static void main(String[] args) 
        SpringApplication.run(MybatiesplusApplication.class, args);
    

c.创建实体类

package com.atzeren.mybatiesplus.pojo;

import lombok.*;

/**
 * @Program:mybatiesplus
 * @description:pojo
 * @author: jiangzeren
 * @create: 2022-11-01 16
 **/
@Data
public class User 
    private Long id;
    private String name;
    private Integer age;
    private String email;


打包出错

C:\\Users\\jiangzeren\\.jdks\\corretto-1.8.0_342\\bin\\java.exe -Dmaven.multiModuleProjectDirectory=D:\\IDEAAA\\mybatiesplus "-Dmaven.home=D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\plugins\\maven\\lib\\maven3" "-Dclassworlds.conf=D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\plugins\\maven\\lib\\maven3\\bin\\m2.conf" "-Dmaven.ext.class.path=D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\plugins\\maven\\lib\\maven-event-listener.jar" "-javaagent:D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\lib\\idea_rt.jar=56330:D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\bin" -Dfile.encoding=GBK -classpath "D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\plugins\\maven\\lib\\maven3\\boot\\plexus-classworlds-2.6.0.jar;D:\\IDEAAA\\IntelliJ IDEA 2020.3.4\\plugins\\maven\\lib\\maven3\\boot\\plexus-classworlds.license" org.codehaus.classworlds.Launcher -Didea.version=2020.3.4 compile
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< com.atzeren:mybatiesplus >----------------------
[INFO] Building mybatiesplus 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The artifact mysql:mysql-connector-java:jar:8.0.31 has been relocated to com.mysql:mysql-connector-j:jar:8.0.31
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ mybatiesplus ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 2 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.543 s
[INFO] Finished at: 2022-11-01T16:20:17+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project mybatiesplus: Input length = 1 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Process finished with exit code 1

 遇到这一类问题可以参考以下几篇文章Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources_慢来来的博客-CSDN博客_pom文件进入父工程快捷键

看了这几篇博客,发现还是没有什么很大的用处,于是我将尚硅谷的pom.xml打开,复制粘贴到了我的pom.xml中,发现再次刷新maven之后运行成功了。

 对比代码发现原来是java版本的问题,把java.version改为1.8即可。

<?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.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atzeren</groupId>
    <artifactId>mybatiesplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatiesplus</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</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybaties-plus启动器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--lombok用于简化实体类开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.5</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!--修改版本-->
                <version>3.1.0</version>
            </plugin>
        </plugins>
    </build>

</project>

这只是我遇到的问题,仅对我有效,如果你也是jdk版本默认设置为17或者18也可能会产生这个问题,为了验证是不是jdk产生的影响,我又重新将jdk版本设置为了17,发现仍然出现之前的情况。

 正确方法打包之后get、set方法、构造器都会自动创建,,这样的话在实际开发过程中我们就不用这么麻烦了。

 

 

Spring-boot-mybatisPlus

文章目录

Spring boot 整合MybatisPlus

上一节 springboot JPA

springboot JPA

源码

源码

MybatisPlus

简介

​ mybatisPlus 是mybatis的一个增强,在mybatis的基础上只做增强不做改变,简化使用mybatis后的代码开发,

使mybaits 更加标准的ORM; 提高开发效率。

mybatisPlus 官网

springboot 整合MybatisPlus

  1. 添加依赖

    springboot 项目中我们引入mybatisPlus 的starter

 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
<!--mybatisPlus starter-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
  1. 配置文件中配置相关信息

    spring:
      application:
        name: mybatisplus-demo
    ## 数据源配置
      datasource:
        url: jdbc:mysql://localhost:3306/mytest?useSSL=false&charsetEncoding=utf8
        username: root
        password: 123456
        driver-class-name: com.mysql.jdbc.Driver
    ## mybatis puls 相关配置
    mybatis-plus:
      configuration:
        map-underscore-to-camel-case: true # 默认true 下划线和驼峰命名转换
        ## sql 打印
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        ## 配置 mapper 文件的相关位置
      mapper-locations: classpath:mapper/**/*.xml
      ## 别名
      type-aliases-package: com.xiaodu.springboot.mybatis.plus.entity 
    
sql 打印
	配置mybatisPlus 的 log-impl
mybatis-plus:
  configuration:
    ## sql 打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImp
  1. 创建相关的entity, mapper

    entity

    @Data
    public class UserEntity 
    
        private String uId;
    
        private String uName;
    
    
    

    mapper

    @Mapper
    public interface UserMapper 
        void insertUser(UserEntity userEntity);
    
    

    mapper.xml

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.xiaodu.springboot.mybatis.plus.mapper.UserMapper">
    
        <insert id="insertUser" parameterType="userEntity">
           insert into t_user  values(#uId, #uName)
        </insert>
    
    </mapper>
    

    以上和我们在mybatis 中的使用一模一样,这也提现了mybaitsPlus 的特性,不做更改,低侵入。

    测试运行

    @SpringBootApplication
    public class MybatisPlusApplication implements ApplicationRunner 
    
        @Autowired
        private UserMapper userMapper;
    
    
        public static void main(String[] args) 
    
            SpringApplication.run(MybatisPlusApplication.class, args);
        
    
        @Override
        public void run(ApplicationArguments args) throws Exception 
            UserEntity userEntity = new UserEntity();
            userEntity.setUId("11111");
            userEntity.setUName("222222");
            userMapper.insertUser(userEntity);
        
    
    

mybatisPlus 通用mapper

​ mybaits Plus 内置了通用mapper, 我们只需要继承baseMapper 即可实现简单的CRUD

  1. mapper 继承 BaseMapper

    @Mapper
    public interface UserMapper extends BaseMapper<UserEntity> 
    
        void insertUser(UserEntity userEntity);
    .
    
  2. 实体类添加相关注解映射信息

    @Data
    @TableName(value = "t_user")
    public class UserEntity 
    
        @TableId(value = "u_id", type = IdType.AUTO)
        private String uId;
    
        @TableField(value = "u_name")
        private String uName;
    
    

    这样我们就可以使用BaseMapper中的所有方法,而不需要自己写mapper 和sql

    baseMapper 中的crud方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUgJhetN-1625032636014)(C:\\Users\\huayu\\AppData\\Roaming\\Typora\\typora-user-images\\1621386879181.png)]

    MybatisPlus 提供的实体映射相关注解

    官方文档注解

    @TableName

    使用在entity类上,表名映射

    属性类型是否必须默认值描述
    valueStringN“”表名
    schemaStringN”“数据库模式名
    keepGlobalPrefixbooleanNfalse是否保持使用全局的 tablePrefix 的值
    resultMapStringN“”结果集映射,对应xml中或者注解中resultMap的ID
    excludePropertyString[]N需要排除的属性名
    autoResultMapbooleanNfalse是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入)

    @TableId

    标注在属性上,主键注解; 如果字段为id; 则不加该注解,mybatisPlus也以识别为字段为主键

    属性类型是否必须默认值描述
    valueStringN“”主键字段名
    typeEnumNIdType.NONE主键类型

    IdType简述

    描述
    AUTO支持数据主键自增
    NONE不设置,默认等于INPUT类型 用户自己设置ID
    INPUT用户输入ID
    ASSIGN_ID分布式id(雪花算法生成)
    ASSIGN_UUID使用uuid生成id

    @TableField

    标注在字段上,表字段标识

    属性类型是否必须默认值描述
    valueStringN“”数据库字段值,默认开启下划线转驼峰
    existbooleanNtrue是否为数据库表字段
    conditionStringNSqlCondition.EQUAL字段 where 实体查询比较条件
    updateStringN“”字段 update set 部分注入, 该注解优于 el 注解使用 . 例1:@TableField(… , update="%s+1") 其中 %s 会填充为字段 输出 SQL 为:update 表 set 字段=字段+1 where … 例2:@TableField(… , update=“now()”) 使用数据库时间*输出 SQL 为:update 表 set 字段=now() where …
    insertStrategyFieldStrategyNFieldStrategy.DEFAULT当为insert操作时,验证字段拼接sql时的验证策略;例如判断是否为null 的策略FieldStrategy.NOT_NULL; 其他具体参照官网或者源码
    updateStrategyFieldStrategyNFieldStrategy.DEFAULT当为update操作时,验证字段拼接sql时的验证策略;同insertStrategy
    whereStrategyFieldStrategyNFieldStrategy.DEFAULTwhere 条件验证策略
    fillFieldFillNFieldFill.DEFAULT字段填填充策略
    selectbooleanNtrue是否是select 查询语句中查询字段
    jdbcTypeJdbcTypeNJdbcType.UNDEFINEDJDBC类型
    typeHandlerTypeHandlerNUnknownTypeHandler.class类型处理器

MybatisPlus 通用Service

​ MybatisPlus 内置了Iservice 和他的实现类 ServiceImpl, 提供了基本的crud 以及按照条件 和分页查询,count等常用方法。

使用

  1. 继承Iservice

    public interface UserService extends IService<UserEntity> 
    
    
  2. 实现类继承ServiceImpl, 同时实现我们自己的service,这样我们也可以写自己的逻辑方法

    @Service
    @Slf4j
    public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService 
    
    
    
    

    测试

        public void testBaseService() 
            System.out.println(userService.getById("123"));
            System.out.println(userService.count());
        
    
    

MybatisPlus 分页

springboot 项目中集成

  1. 添加分页插件
    // mybatisPlus 分页
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() 
       MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(1000L);
        paginationInnerInterceptor.setOverflow(false);
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
       return mybatisPlusInterceptor;
    
  1. 方法调用传入参数page

    // 构建page	
    Page<UserEntity> page = new Page<>(1,3);
    // 分页查询
    Page<UserEntity> page1 = userService.page(page);
    // 获取数据
    System.out.println(page1.getRecords());
    

MybatisPlus 条件查询

​ MybatisPlus 封装了Wrapper 进行条件的构造; 通常使用他的字类 QueryWrapper 和 UpdateWrapper,以及他们的lambda形式: LambdaQueryWrapper 和 LambdaUpdateWrapper

使用示例

QueryWrapper

​ 查询条件封装

        // queryWrapper
        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        // 使用like,column 为数据库字段
        queryWrapper.like("u_name", "110");
        //SELECT u_id,u_name FROM t_user WHERE (u_name LIKE ?)
        List list = userService.list(queryWrapper);

QueryWrapper 继承字AbstractWrapper,AbstractWrapper提供了大量的sql条件拼接,例如:

  • allEq

  • eq

  • ne

  • get

  • ge

  • lt

  • le

  • between

  • notBetween

  • like

  • notLike

  • likeLeft

  • isNull

  • in

  • notIn

  • or

  • and

  • 具体使用很简单,可以参考官方文档Mybatis-Plus 条件构造器

queryWrapper也支持传入一个Entity,entity中使用注解 @TableFiled 通过codition进行where查询比较条件;

  // 使用  @TableField 设置  condition = SqlCondition.LIKE;进行like 操作
        UserEntity u = new UserEntity();
        u.setUName("aaa");
        QueryWrapper<UserEntity> queryWrapper1 = new QueryWrapper<>(u);
        // SELECT u_id,u_name FROM t_user WHERE u_name LIKE CONCAT('%',?,'%')
        System.out.println(userService.list(queryWrapper1));
UpdateWrapper

​ update语句条件封装

 // updateWrapper
        UpdateWrapper<UserEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper
                .set("u_id", "123")
                .set("u_name", "aaa")
                .eq("u_id", "123"); // 条件
        // UPDATE t_user SET u_id=?,u_name=? WHERE (u_id = ?)
        System.out.println(userService.update(updateWrapper));

​ 接收两个参数的条件封装

        UserEntity userEntity = new UserEntity();
        UpdateWrapper<UserEntity> updateWrapper2 = new UpdateWrapper<>();
        updateWrapper2.eq("u_id","123");
        userEntity.setUName("aaa");
        // 接收2个参数,第一个参数为 set的值, 第二个参数updateWrapper 为条件
        // UPDATE t_user SET u_name=? WHERE (u_id = ?)
        System.out.println(userService.update(userEntity, updateWrapper2));
LambdaQueryWrapper

lambdaQueryWrapper 和queryWrapper使用上基本一致的,只不过运用了lambda的语法特性进行条件的构造。

      // LambdaQueryWrapper
        LambdaQueryWrapper<UserEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(UserEntity::getUId)
                .eq(UserEntity::getUName, "aaa");
        System.out.println(userService.list(lambdaQueryWrapper));
LambdaUpdateWrapper
    // LambdaUpdateWrapper
       LambdaUpdateWrapper<UserEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
       lambdaUpdateWrapper.set(UserEntity::getUName,"bbb")
                .eq(UserEntity::getUId,"123");
       System.out.println(userService.update(lambdaUpdateWrapper));

MybatisPlus AR

mybatisPlus 扩展的ActiveRecord 模式,即领域模型;简单说就是 数据库和实体映射,操作实体就是在操作数据库,而不用在通过dao或者mapper。

使用示例

我们直接操作实体就能又mapper的功能

    private void testAR() 
        UserEntity userEntity = new UserEntity();
        System.out.println(userEntity.selectAll());
        userEntity.selectOne(new LambdaUpdateWrapper<UserEntity>().eq(UserEntity::getUId,"123"));
        userEntity.selectList(new LambdaQueryWrapper<UserEntity>().like(UserEntity::getUName,"aaa"));
    

主键生成策略

前面我已经知道了在@TableId 上指定 type 来设置主键的生成策略; 并且 mybatisplus 默认提供的IdType 支持

  1. AUTO(数据库自增)

  2. NONE(不设置,等于全局设置)

  3. INPUT(用户输入)

  4. ASSIGN_ID(分布式id,雪花算法)

  5. ASSIGN_UUID(UUID)

    @TableId(value = "u_id", type = IdType.ASSIGN_ID)
        private String uId;
    ...
        
        
        private void testId() 
            UserEntity userEntity  = new UserEntity();
            userEntity.setUName("aaa");
            //INSERT INTO t_user ( u_id, u_name ) VALUES ( ?, ? )
            //Parameters: 1396074749305671681(String), aaa(String); 自动生成了id
            userEntity.insert();
        
    

    上面示例我们使用分布式id生成策略,mybatisplus 在insert操作的时候会自动生成id。

逻辑删除

​ 逻辑删除不同于物理删除,就是数据还在,增加一个是否删除的标识;逻辑删除执行的是update语句,查询的时候带上这个标识的判断;

例如 字段 is_del, 他的值为 1 和0 ; 1为真 0为假; 查询的时候带上条件 is_del = 1; 删除的时候为update table set is_del = 1; 添加的时候 默认0即可。

mybatisplus 帮我们省去了这些麻烦的操作,我们只需要添加一个注解@TableLogic 即可

mybatisplus逻辑删除的默认值, 一般情况下使用默认值即可。

// mybatisplus 源码中逻辑删除的定义 
/**
         * 逻辑删除全局值(默认 1、表示已删除)
         */
        private String logicDeleteValue = "1";
        /**
         * 逻辑未删除全局值(默认 0、表示未删除)
         */
        private String logicNotDeleteValue = "0";

如何使用

​ 记得在库表中添加该字段

​ alter table t_user add column is_del tinyint not null;

​ 实体类添加标识字段, 数据库中也同样添加

 @TableField(value ="is_del")
    @TableLogic
    private String del;
    // 测试逻辑删除
    private void testTableLogic() 
        UserEntity u = new UserEntity();
        String id = "logic";
        u.setUId(id);
        u.setUName("testLogic");
        // 逻辑删除对插入是不做限制的, 所以需要我们手动设置
        u.setDel(0);
        // INSERT INTO t_user ( u_id, u_name, is_del ) VALUES ( ?, ?, ? )
        boolean insert = u.insert();
        
        System.out.println("---------删除--------");
        // UPDATE t_user SET is_del=1 WHERE u_id=? AND is_del=0
        // 删除执行的update 语句, set is_del = 1;
        u.deleteById();
        
        System.out.println("**********更新*********");
        //UPDATE t_user SET u_name=? WHERE u_id=? AND is_del=0
        // 也会带上条件  is_del =0 (没被删除的才会更新)
        u.updateById();

        System.out.println("===查询=====");
        // SELECT u_id,u_name,is_del AS del FROM t_user WHERE u_id=? AND is_del=0
        // 查询语句中自动添加条件 is_del = 0
        UserEntity userEntity = u.selectById();

    

通过测试可知:

(0 为 否, 1 为是)

  1. 新增:不做操作
  2. 删除:where条件会带上is_del = 0, 并设置 set is_del=1
  3. 更新: where条件会带上is_del=0
  4. 查询: where条件会带上is_del =0

改变逻辑删除字段默认值

  1. 通过 注解@TableLogic

     // 配置 1 是 2否
        @TableLogic(value = "2", delval = "1")
        private Integer del;
    
    1. 全局配置
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    

自动填充功能

在 阿里巴巴开发规范中说明:

【强制】表必备三字段: id , gmt _ create , gmt _ modified

所以我们按照规范说明添加 创建时间 gmt_create, 更新时间 gmt_modified

alter table t_user add column gmt_create datetime not null;

alter table t_user add column gmt_modified datetime not null;

这个字段是必须的,我们在mybaits 篇章中 通过 使用mybatis的拦截器 进行了 创建时间和更新时间的设置;

现在这个mybatisplus 自动帮助我们做了。

如何使用

使用 @TableFiled 的填充属性fill

    @TableField(value ="is_del", fill = FieldFill.INSERT)
    // 配置 1 是 2否
    @TableLogic(value = "2", delval = "1")
    private Integer del;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime gmtCreate;

    @TableField (fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime gmtModified;

添加 MetaObjectHandler

    @Bean
    public MetaObjectHandler dateTimeMetaObjectHandler() 
        return new MetaObjectHandler()

            @Override
            public void insertFill(MetaObject metaObject) 
                // insert
                this.strictInsertFill(metaObject, "gmtCreate",LocalDateTime::now, LocalDateTime.class);
                // update
                this.strictUpdateFill(metaObject, "gmtModified", LocalDateTime::now, LocalDateTime.class);
                // del 逻辑删除字段默认值
                this.strictInsertFill(metaObject, "del",() -> 2, Integer.class);
            

            @Override
            public void updateFill(MetaObject metaObject) 
                this.strictUpdateFill(metaObject, "gmtModified", LocalDateTime::now, LocalDateTime.class);
            
        Spring-boot-mybatisPlus

Spring-boot-mybatisPlus

Spring-boot-mybatisPlus

Spring boot+Mybatisplus用AR模式实现逻辑删除操作

spring boot + MyBatisPlus 一对多、多对一、多对多的解决方案

spring boot项目自定义数据源,mybatisplus分页逻辑删除无效解决方法