Generator【SpringBoot集成】代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Generator【SpringBoot集成】代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)

保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码。

数据库表

CREATE TABLE `student` (
  `id` int(64) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
  `create_time` datetime DEFAULT NULL COMMENT '入库时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

1.依赖

代码生成工具使用 mybatis-plus-generator,generator默认使用的模板为 velocity-engine-core,也可以使用freemarker(需要额外设置)。接口文档使用 knife4j-spring-boot-starter。

<!--代码生成插件-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <!--代码生成模板-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
        <!--可选代码生成模板-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>
        <!--接口文档-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>
        <!--strategy.setEntityLombokModel(true);如果设置为true是需要lombok的-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

yml配置

mybatis-plus:
  mapper-locations: classpath*:/com/example/demo/**/mapper/xml/*.xml
  global-config:
    db-config:
      logic-not-delete-value: 0
      logic-delete-value: 1

2.代码生成类

如果要使用freemarker模板,需要额外配置 .setTemplateEngine(new FreemarkerTemplateEngine()); 启用 .setSwagger2(true);

class CodeGenerator {
    /**
     * 项目根路径
     */
    private static final String PROJECT_PATH = "E:\yuanzheng-codebase\m-framework\codegenerator";
    /**
     * 注释@auth 名称
     */
    private static final String AUTH = "auth";
    /**
     * 父包全限定类名
     */
    private static final String PARENT = "com.example.demo";
    /**
     * 模块名称
     */
    private static final String MODEL_NAME = "student";
    /**
     * 忽略的表前缀
     */
    private static final String[] IGNORE_TABLE_PFX = new String[]{"table_", "t_"};
    /**
     * 要生成的表名
     */
    private static final String TABLE_NAMES = "student";
    /**
     * 数据源配置
     */
    private static final DataSourceConfig DSC = new DataSourceConfig();
    static {
        DSC.setDbType(DbType.MYSQL);
        DSC.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true");
        DSC.setDriverName("com.mysql.cj.jdbc.Driver");
        DSC.setUsername("root");
        DSC.setPassword("root");
    }
    @Test
    void test() {
        main(null);
    }
    static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        /*
         * 全局配置
         */
        GlobalConfig gc = new GlobalConfig();
        // 输出路径
        gc.setOutputDir(PROJECT_PATH + "/src/main/java");
        // 设置作者
        gc.setAuthor(AUTH);
        // 生成代码后,是否打开文件夹
        gc.setOpen(false);
        // 是否覆盖原来代码
        gc.setFileOverride(false);
        // 去掉service的I前缀,一般只需要设置service就行
//        gc.setServiceName("%sService");
//        gc.setMapperName("%sMapper");
//        gc.setXmlName("%sMapper");
//        gc.setServiceImplName("%sServiceImpl");
//        gc.setControllerName("%sController");
        // 日期格式
        gc.setDateType(DateType.ONLY_DATE);
        // 实体属性 Swagger2 注解,实体类上会增加注释
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);
        /*
         * 数据源配置
         */
        mpg.setDataSource(DSC);
        /*
         * 配置模板(generator默认的是velocity,使用freemarker的话要打开此项设置)
         */
        // mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        /*
         * 包配置
         */
        PackageConfig pc = new PackageConfig();
        pc.setParent(PARENT);
        pc.setModuleName(MODEL_NAME);
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
        /*
         * 策略配置
         */
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude(TABLE_NAMES);
        strategy.setTablePrefix(IGNORE_TABLE_PFX);
        // 包的命名规则,使用驼峰规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 列的名称,使用驼峰规则
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否使用lombok(要确认项目是否有lombok)
        strategy.setEntityLombokModel(true);
        // 是否使用
        strategy.setRestControllerStyle(true);
        // 逻辑删除(要结合数据表字段使用)
        strategy.setLogicDeleteFieldName("is_delete");
        // 自动填充字段
        TableFill fillInsert = new TableFill("create_time", FieldFill.INSERT);
        TableFill fillUpdate = new TableFill("update_time", FieldFill.UPDATE);
        List fillLists = new ArrayList();
        fillLists.add(fillInsert);
        fillLists.add(fillUpdate);
        strategy.setTableFillList(fillLists);
        //乐观锁
        //strategy.setVersionFieldName("version");
        mpg.setStrategy(strategy);
        // 执行
        mpg.execute();
    }
}

3.生成后的结构

Student

可以看到代码生成设置的逻辑删除字段、INSERT和UPDATE填充字段的注释。

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="Student对象", description="")
public class Student implements Serializable {
    private static final long serialVersionUID=1L;
    @ApiModelProperty(value = "编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "年龄")
    private Integer age;
    @ApiModelProperty(value = "是否删除")
    @TableLogic
    private Integer isDelete;
    @ApiModelProperty(value = "入库时间")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
}

DateObjectHandler

处理一下填充字段。

@Component
public class DateObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

Controller

简单测试一下。

@RestController
@RequestMapping("/student")
@Api(value = "学生", tags = {"增删改查"})
public class StudentController {
    @Autowired
    private IStudentService studentService;
    @GetMapping("/get")
    @ApiOperation(value = "获取学生列表")
    public List<Student> getStudents() {
        LambdaQueryWrapper<Student> query = Wrappers.lambdaQuery(Student.class);
        return studentService.list(query);
    }
    @PostMapping("/add")
    @ApiOperation(value = "新增学生信息")
    public boolean addStudent(@ApiParam Student student) {
        return studentService.save(student);
    }
    @PostMapping("/update")
    @ApiOperation(value = "修改学生信息")
    public boolean updateStudent(@ApiParam Student student) {
       return studentService.updateById(student);
    }
    @GetMapping("/del")
    @ApiOperation(value = "删除学生信息")
    public boolean deleteStudent(@ApiParam(name = "id",value = "唯一ID") Integer id) {
        return studentService.removeById(id);
    }
}

4.使用 http://ip:port/doc.html

新增一条数据后,creatTime字段自动填充了;

修改后,updateTime字段也自动填充了;

删除后,查询列表已经没有数据了;

查询数据库,可以看到数据是逻辑删除了。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
276
分享
相关文章
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
178 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
204 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
98 35
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
使用ChatGPT生成关于登录产品代码的单元测试代码
使用ChatGPT生成关于登录产品代码的单元测试代码
51 16
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
104 13
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
阿里云短信服务提供API/SDK和控制台调用方式,支持验证码、通知、推广等短信类型。需先注册阿里云账号并实名认证,然后在短信服务控制台申请资质、签名和模板,并创建AccessKey。最后通过Maven引入依赖,使用工具类发送短信验证码。
2006 3
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
114 1
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句

热门文章

最新文章