Mybatis-Plus新的版本(3.5.1+版本)的使用

主要功能包括:逻辑删除,创建时间和修改时间

逻辑删除:对于重要的数据,不能轻易的执行delete语句进行删除,一旦删除,数据无法恢复,这时可以进行逻辑删除

删除正确操作:假删除

1、给表添加字段,代表数据是否删除,

一般起名isdelete,0代表未删除,1代表删除,默认值为0

简单的数据库表

 注意:gmt_create和gmt_modified可以为null!

1、主要参考了

(1)

Mybatis—Plus代码自动生成器超详细讲解(3.5.1+版本)_****^_^****的博客-CSDN博客

(2)官方主页

代码生成器(3.5.1+版本) | MyBatis-Plus

2、来个例子试试看 

(1)

(2)

 

 (3)application.yml和上次的大部分一样,注意逻辑的配置修改了下!

1mybatis-plus创建项目_chencaw的专栏-CSDN博客

server:
  port: 8081
  servlet:
    context-path: /
 
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/productdemo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: ????
#  jackson:
#    date-format: yyyy-MM-dd HH:mm:ss
#    time-zone: GMT+8
#    serialization:
#      write-dates-as-timestamps: false
 
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    auto-mapping-behavior: full
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  global-config:
    # 逻辑删除配置
    db-config:
      # 删除前,注意这个配置,陈20211207
      logic-not-delete-value: 0
      # 删除后
      logic-delete-value: 1

(4)创建后的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 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.6.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>chenmpj17simple</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>chenmpj17simple</name>
    <description>chenmpj17simple</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--(1)mysql的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--runtime表示被依赖项目无需参与项目的编译,用在这里OK-->
            <scope>runtime</scope>
        </dependency>
        <!--(2)lombok相关的依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!--true表示两个项目之间依赖不传递;不设置optional或者optional是false,表示传递依赖。-->
            <optional>true</optional>
        </dependency>
        <!--(3)mybatisplus相关的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>
        <!--(3.1)mybatisplus代码生成相关的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <!--注意该版本开始生成方式不同了-->
            <version>3.5.1</version>
        </dependency>
        <!--(3.2)代码生成引擎模版-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
        <!--(3.3)mybatisplus 多数据源 -->
        <!--        <dependency>-->
        <!--            <groupId>com.baomidou</groupId>-->
        <!--            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
        <!--            <version>3.5.0</version>-->
        <!--        </dependency>-->
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>3.0.0</version>
            <scope>provided </scope>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
            <scope>provided </scope>
        </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>

 (5)生产代码的方法

package com.example.chenmpj17simple.codegenerate;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;

import java.util.Collections;

// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGeneratorFast {


    public static void main(String[] args) {
        //(1)第一步获取项目路径
        String projectPath=System.getProperty("user.dir");
        //(2)创建生产器
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/digitalfactorydb?autoReconnect=true&useUnicode=true&characterEncoding=utf8&&serverTimezone=GMT%2B8", "???user", "???password")
                // 全局配置 GlobalConfig
                .globalConfig(builder -> {
                    builder.author("chen")   // 设置作者名
                            .fileOverride()  // 开启覆盖已生成文件,默认值false
                            .enableSwagger() // 开启 swagger 模式,默认值false
                            .dateType(DateType.ONLY_DATE)  //定义生成的实体类中日期类型
                            // 指定输出目录,注意可根据包修改,20211206!!!!
                            .outputDir(projectPath+"/src/main/java");
                })
                // 包配置 PackageConfig
                .packageConfig(builder -> {
                    builder.parent("com.example.chenmpj17simple")        // 设置父包名,注意一定要根据包修改,20211206!!!!
                            .moduleName("midProduct")     // 父包模块名,默认值:无,注意根据包修改,20211206!!!!
                            // 上面两行代码加起来:com.example.chenmptest.midProduct.xxx(entity、service、controller等)
                            .entity("entity")       // Entity包名
                            .service("service")     // Service包名
                            .serviceImpl("serviceImpl") // ServiceImpl包名
                            .controller("controller")   // Controller包名
                            .mapper("mapper")           // Mapper包名
                            .xml("mapper")              // Mapper XML包名
                            // 路径配置信息,设置mapperXml生成路径
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,projectPath+"/src/main/resources/mapper"));
                })
                // 配置策略 StrategyConfig
                .strategyConfig(builder -> {
                    builder.addInclude("mid_product_category")                    // 增加表匹配,需要映射的数据库中的表名
                            //.addTablePrefix("p_")                 // 增加过滤表前缀,生成时将数据库表的前缀"p_"去掉
                            // 1.service策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService")         // 格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
                            // 2.实体策略配置
                            .entityBuilder()
                            .naming(NamingStrategy.underline_to_camel)  // 数据库表映射到实体的命名策略,下划线转驼峰命名
                            .enableLombok()                   // 开启 lombok 模型
                            .logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库),注意修改,陈20211206!!!
                            .enableTableFieldAnnotation()     // 开启生成实体时生成字段注解
                            .idType(IdType.AUTO)              // 全局主键类型,如用不到,注意修改,陈20211206!!!
                            // 3.controller策略配置
                            .controllerBuilder()
                            .formatFileName("%sController")   // 格式化文件名称
                            .enableRestStyle()                // 开启生成@RestController 控制器
                            // 4.mapper策略配置
                            .mapperBuilder()
                            .superClass(BaseMapper.class)     // 设置父类
                            .enableMapperAnnotation()         // 开启 @Mapper 注解
                            .formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
                            .formatXmlFileName("%sMapper");   // 格式化 xml 实现类文件名称
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

(5)修改自动时间的两个字段

    @ApiModelProperty("创建时间")
    @TableField(value = "gmt_create",fill = FieldFill.INSERT)
    private Date gmtCreate;

    @ApiModelProperty("更新时间")
    @TableField(value = "gmt_modified",fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;

 (7)添加自动处理

@Component
//编写处理器Handler来进行自动填充,把下面的代码直接写在自己的handler包内
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("start insert fill ....");
        this.setFieldValByName("gmtCreate", new Date(), metaObject);
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("start update fill ....");
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

(8)测试代码

package com.example.chenmpj17simple;

import com.example.chenmpj17simple.midProduct.entity.MidProductCategory;
import com.example.chenmpj17simple.midProduct.serviceImpl.MidProductCategoryServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Chenmpj17simpleApplicationTests {
    @Autowired
    private MidProductCategoryServiceImpl midProductCategoryService;
    @Test
    void contextLoads() {
    }
    @Test
    void  chenMidSelect()
    {
        System.out.println("chen");
        MidProductCategory product = midProductCategoryService.getById(2);
        System.out.println(product.getName());
        System.out.println(product.getGmtCreate());
        System.out.println("chen2");
    }
    @Test
    void  chenMidSave()
    {
        System.out.println("chen_save_start");
        MidProductCategory product = new MidProductCategory();
        product.setCategoryId("4");
        product.setName("chen3add");
        Boolean chenSaveB = midProductCategoryService.save(product);
        System.out.println(chenSaveB);

        System.out.println("chen_save_end");
    }

    @Test
    void  saveOrUpdate()
    {
        System.out.println("chen_saveupate_start");
        MidProductCategory product = new MidProductCategory();
        product.setId(4);
        product.setCategoryId("1u");
        product.setName("chenupdate");
        Boolean chenSaveB = midProductCategoryService.saveOrUpdate(product);
        System.out.println(chenSaveB);
        System.out.println("chen_saveupdate_end");
    }

}

3、分页

(1)配置文件

@Configuration
@MapperScan("com.example.*.*.mapper*")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return configuration -> configuration.setUseDeprecatedExecutor(false);
//    }
}

 (2)分页测试

    @Resource
    private MidProductCategoryMapper midProductCategoryMapper;
   @Test
    void mybatisplusselectpage() {
        LambdaQueryWrapper<MidProductCategory> userLambdaQueryWrapper = Wrappers.lambdaQuery();
        userLambdaQueryWrapper.like(MidProductCategory::getName , "c");

        Page<MidProductCategory> userPage = new Page<>(2, 3);//第2页,每页3个,注意:第一个参数当前页从1开始,
//        Page<Map<String , Object>> mapPage = new Page<>(1 , 2 , false);  //如果不查询总数
//        IPage<MidProductCategory> userIPage = midProductCategoryMapper.selectPage(userPage , userLambdaQueryWrapper);
        IPage<MidProductCategory> userIPage = midProductCategoryMapper.selectPage(userPage ,null);
        System.out.println("总页数: "+userIPage.getPages());
        System.out.println("总记录数: "+userIPage.getTotal());
        userIPage.getRecords().forEach( (e) -> {
                    System.out.println(e.getName());
                }
        );

    }

 4、完结了,mybatisplus推荐的下面两个函数好像有问题(要对应的用好,大家自己看下原理),暂时跳过

 this.strictInsertFill(....)
this.strictUpdateFill(....)
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值