1. 添加依赖
<!-- freemarker模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</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.5.3</version>
</dependency>
<!-- Mybatis Plus 代码生成器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<!-- lombok简化代码的工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
完整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>
<!-- 引入spring boot 统一版本父项目管理依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.lv</groupId>
<artifactId>autonomy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>autonomy</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 项目的热加载重启插件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- freemarker模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</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.5.3</version>
</dependency>
<!-- Mybatis Plus 代码生成器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<!-- lombok简化代码的工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2. 数据库和mybatis-plus配置
在resources
文件夹下新增 application.yml
spring:
# 数据源配置
datasource:
username: username
password: password
url: jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis-plus配置
mybatis-plus:
# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML文件位置)
mapperLocations: classpath:mapper/*.xml
configuration:
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
map-underscore-to-camel-case: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. MybatisPlus配置
新建MybatisPlusConfig.java
,MybatisPlus分页插件设置
package com.lv.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* MybatisPlus配置
* @return
*/
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"com.lv.**.mapper"})
public class MybatisPlusConfig {
/**
* 分页插件
* @return
*/
@Bean
public MybatisPlusInterceptor mpInterceptor(){
// 1. 定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
// 2. 添加具体的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
新建MyMetaObjectHandler.java
,MybatisPlus自动填充设置
package com.lv.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* Mybatis plus自动填充
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "version", Integer.class, 0);
this.strictInsertFill(metaObject, "deleted", Boolean.class, false);
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
//更新数据时,直接更新字段
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
}
4. MybatisPlus代码自动生成
新增CodeGenerator.java
package com.lv;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
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.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* 自动代码生成
*/
public class CodeGenerator {
private static final String datasourceUrl="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
private static final String datasourceUsername="username";
private static final String datasourcePassword="password";
private static final String projectPath = System.getProperty("user.dir"); // 项目路径
public static void main(String[] args) {
// https://baomidou.com/pages/981406 配置文档地址
// 代码生成器
FastAutoGenerator.create(datasourceUrl, datasourceUsername, datasourcePassword)
.globalConfig(initGlobalConfig()) // 全局配置
.packageConfig(initPackageConfig()) // 包配置
.strategyConfig(initStrategyConfig()) // 策略配置
.templateEngine(new FreemarkerTemplateEngine()) // 模板引擎配置 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
// 处理 all 情况
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
private static Consumer<GlobalConfig.Builder> initGlobalConfig() {
return builder -> {
builder.outputDir(projectPath + "/src/main/java") // 指定输出目录
.author("lxd")
.enableSwagger() // 开启swagger
.dateType(DateType.TIME_PACK) // 时间策略
.commentDate("yyyy-MM-dd") // 注释日期
.disableOpenDir(); // 禁止打开输出目录
};
}
private static Consumer<PackageConfig.Builder> initPackageConfig() {
return builder -> {
builder.parent("com.lv") // 父包名
.entity("entity")
.service("service")
.serviceImpl("service.impl")
.controller("controller")
.mapper("mapper")
.xml("mapper")
.pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "/src/main/resources/mapper/")); // 设置mapperXml生成路径
};
}
private static BiConsumer<Function<String, String>, StrategyConfig.Builder> initStrategyConfig() {
return (scanner, builder) -> {
builder.enableSkipView() // 开启跳过视图
.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔。所有输入 all")))
//.addTablePrefix("t_") // 增加过滤表前缀
/* Entity 策略配置 */
.entityBuilder()
.enableFileOverride() // 覆盖已生成文件
.naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 下划线转驼峰命名
.columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
.enableLombok() // 开启lombok模型
.versionColumnName("version") // 乐观锁字段名(数据库字段)
.logicDeleteColumnName("deleted") // 逻辑删除字段名(数据库字段)
.addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表字段填充
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
.enableChainModel()
/* Controller 策略配置 */
.controllerBuilder()
.enableFileOverride() // 覆盖已生成文件
.formatFileName("%sController") // 格式化文件名称
.enableRestStyle() // 开启生成@RestController 控制器
.enableHyphenStyle() // 开启驼峰转连字符
/* Service 策略配置 */
.serviceBuilder()
.enableFileOverride() // 覆盖已生成文件
.formatServiceFileName("%sService") // 格式化 service 接口文件名称
.formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
/* Mapper 策略配置 */
.mapperBuilder()
.enableFileOverride() // 覆盖已生成文件
.enableMapperAnnotation() // 开启 @Mapper 注解
.formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
.formatXmlFileName("%sMapper"); // 格式化 xml 实现类文件名称
};
}
}
运行CodeGenerator,请输入表名,多个英文逗号分隔,所有输入 all。
生成controller、entity、mapper、service、serviceImpl、xxMapper.xml文件