主要功能包括:逻辑删除,创建时间和修改时间
逻辑删除:对于重要的数据,不能轻易的执行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(....)