百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

通过Mybatis Plus实现代码生成器,常见接口实现讲解

ztj100 2025-02-18 14:22 17 浏览 0 评论

收藏等于学会,赶紧关注吧!

前言

代码自动生成是根据我们的数据表,逆向生成Controller、Service、Mapper接口以及Mapper的xml文件的代码,不用再手动创建文件写通用的注解等,以此来提高开发效率,当然你也可以通过Mybatis-Plus的代码生成器封装进自己的系统中来二次实现,加入前端实现可视化的代码生成,我们这里实现一个在控制台操作的代码生成器

一、什么是代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,而且对单表都有默认实现,极大提升开发效率。

二、怎么用

2.1、使用步骤

  • 引入mybatis-plus、generator、velocity、mysql、spring-boot-starter-web、swagger【非必要】、lombok【非必要】依赖
  • 创建代码生成器类,并完成代码生成的相关配置
  • 配置多张表,批量生成模块代码

2.2、项目引入依赖

特别说明:MyBatis-Plus 从 3.0.3 之后移除了代码生成器模板引擎的默认依赖,需要手动添加相关依赖:

我这里使用maven搭建的spring-boot项目,项目名为 buye-test 相关依赖如下:



    
    
        buye
        com.buye
        1.0.0
    
    4.0.0
    buye-test

    
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            com.baomidou
            mybatis-plus-boot-starter
        

        
        
            com.baomidou
            mybatis-plus-generator
        

        
        
            org.apache.velocity
            velocity-engine-core
        

        
        
            mysql
            mysql-connector-java
        

        
        
            org.projectlombok
            lombok
        

        
        
            io.springfox
            springfox-boot-starter
        
    


父工程中主要定义依赖了版本,下边贴出父工程的依赖:




    4.0.0

    com.buye
    buye
    pom
    1.0.0
    
    
        buye-test
    

    
        1.0.0
        UTF-8
        UTF-8
        1.8
        3.0.0
        3.4.3.4
        3.4.1
        2.3
        1.18.22
    

    
    
        
            
            
                org.springframework.boot
                spring-boot-dependencies
                2.5.6
                pom
                import
            
            
            
            
                com.baomidou
                mybatis-plus-boot-starter
                ${mybatis-plus.version}
            

            
            
                com.baomidou
                mybatis-plus-generator
                ${mp-generator.version}
            

            
            
                org.apache.velocity
                velocity-engine-core
                ${velocity.version}
            

            
            
                org.projectlombok
                lombok
                ${lombok.version}
            

            
            
                io.springfox
                springfox-boot-starter
                ${swagger.version}
                
                    
                        io.swagger
                        swagger-models
                    
                
            
        
    


这里您可以根据自己的需求来创建项目,只需要将这些依赖引入即可,具体依赖见 buye-test 工程,没有引入任何多余依赖

2.2.1、模板引擎依赖

这里我引入的模板引擎是 Velocity(默认也就是无需做配置),MyBatis-Plus还支持FreemarkerBeetl,您可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎,如果您也是用 Velocity 引擎则无需引入以下依赖,如果您使用其他模板引擎,请将上文的maven依赖中的 Velocity 依赖替换掉。

Freemarker 依赖:


    org.freemarker
    freemarker
    版本可以通过mavne中央仓库查询,选择您想用的版本

Beetl依赖:


    com.ibeetl
    beetl
    版本可以通过mavne中央仓库查询,选择您想用的版本

2.3、创建代码生成器类

您在项目创建一个类即可,代码中的注释值得详细看一下,所有的代码解释都在其中,如果还有哪里不明白的评论区见,如果您觉得非常清晰,请给个赞吧。代码如下:

package com.buye.gen;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
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;

/**
 * 整个流程分为6部分
 * 1、创建AutoGenerator 代码生成器对象
 * 2、做全局配置
 * 3、数据源配置
 * 4、包配置
 * 5、策略配置
 * 6、执行代码生成
 * @Date 2021/11/27 11:18
 * @Created 添甄
 */
public class BuyeCodeGenerator {

    public static void main(String[] args) {
        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();
        /*
         * 2、创建全局配置对象
         *  1)、可以通过该对象配置生成文件的输出位置,类上的@Author注解等
         *  2)、在下边我们会使用一些常用的配置
         */
        GlobalConfig gc = new GlobalConfig();
        // 获取本项目的项目路径,不过该路径在有些情况下会出现问题,所以一般在设置文件输出路径时我会写绝对路径
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        // 设置生成文件的输出路径,这里前部分使用的一个绝对路径,后部分是一个mavne项目的目录结构
        // 当然您也可以 D:\code\buye\buye-test\src\main\java 这样的一个完整绝对路径
        gc.setOutputDir("D:\\code\\buye\\buye-test" + "/src/main/java");
        // 设置生成文件(也就是类)上方的@Author注解
        gc.setAuthor("添甄");
        //生成后是否打开资源管理器
        gc.setOpen(false);
        //重新生成时文件是否覆盖
        gc.setFileOverride(false);
        // mp生成service层代码,默认接口名称第一个字母有I,去掉Service接口的首字母I
        gc.setServiceName("%sService");
        // 主键策略,这里的策略和您的实际项目需要设置
        // 在 https://blog.csdn.net/qq_36386908/article/details/121465444 文章中讲过主键策略了
        gc.setIdType(IdType.ASSIGN_ID);
        // 定义生成的实体类中日期类型
        gc.setDateType(DateType.ONLY_DATE);
        //开启Swagger2模式
        gc.setSwagger2(true);
        // 将配置加入到代码生成器中
        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/buye?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setDbType(DbType.MYSQL);
        // 将数据源设置仅代码生成器中
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        // 模块名
        pc.setModuleName("mp");
        pc.setParent("com.buye");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        // 将包配置设置进代码生成器中
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 设置表名,根据数据库表生成实体类和其他文件
        strategy.setInclude("sys_user");
        //数据库表映射到实体的命名策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        //生成实体时去掉表前缀
        strategy.setTablePrefix(pc.getModuleName() + "_");
        //数据库表字段映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setEntityLombokModel(true);
        //restful api风格控制器
        strategy.setRestControllerStyle(true);
        //url中驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        // 将策略设置仅代码生成器
        mpg.setStrategy(strategy);
        // 6、执行
        mpg.execute();
    }
}

2.3.1、执行测试

其中有数据表如下:


运行代码:


上边我们仅仅是实现了单表,我们一般的项目也在几十张,甚至百张以上的表,一个一个生成起步很慢,我们只需要将代码生成类中的策略配置中的 strategy.setInclude("sys_user","sys_dept");配置需要生成代码的表。

setInclude(String... include)这个函数的参数是一个可变参数,并且将数据存储到一个Set集合中筛选掉用户不小心传入的重复数据。


注意:这里并不是是说一次性生成所有的表,我们还配置了模块记得吗?根据模块去生成就可以啦



以上就是我们的代码生成的具体操作,在项目中如果能用就用,毕竟可以省略掉很多重复的工作。无论是单表还是多表都给您介绍到。我们没有结束,接下来再翻一翻生成的代码深入理解一下。

三、深挖生成的代码

注意:这里代码生成与代码生成类中的配置息息相关。

3.1、公共部分

每个类上都有的公共部分


2.4、使用其他模板引擎

如果您要使用其他模板引擎:

  • 请替换模板引擎依赖
  • 在代码生成类中配置模板引擎

默认的就够用啦,别瞎折腾了

// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

3.2、实体类

知道为什么引入 lombok 和 swagger了吧

3.3、Mapper接口

3.4、mapper的xml文件

这个文件空空如也,仅仅有一个namespace配置

3.5、Service接口

这里仅仅继承了IService接口,该接口是MyBatis-Plus的,稍后会和 BaseMapper、以及Service实现类中继承的 ServiceImpl 一起介绍

3.6、Service实现类

之前我们的实现类也就是实现接口,但是这里他还帮我们继承了一个 ServiceImpl

3.7、Controller

四、MyBatis-Plus基础接口

mybatis-plus中的源码都是中文注释,阅读门槛较低,推荐您阅读一遍,因篇幅问题,以下仅贴出部分代码

4.1、BaseMapper

这个是每个Mapper接口都继承的接口,里边拥有单表的所有CRUD实现、批量操作以及分页查询,部分代码截图如下:

4.2、IService接口

该接口为Service的顶级接口,进一步封装 CRUD 采用 get 【查询单行 】remove 【删除】 list 【查询集合】 page 【分页】的前缀命名方式区分 Mapper 层避免混淆

4.3、ServiceImpl实现类

该实现类接受两个泛型

  • 对应模块的Mapper接口
  • 对应模块的实现类
    可以将Mapper直接进行注入,并且提供getBaseMapper方法提供mapper的获取,方便别的service层调用,并且对sqlSession、单表的CRUD操作做了默认实现,酸爽无比。

五、测试代码

接下来在Controller中写一个添加供您参考,其余的操作都一样

package com.buye.mp.controller;

import com.buye.mp.entity.SysUser;
import com.buye.mp.service.SysUserService;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

/**
 * 

* 用户信息表 前端控制器 *

* * @author 添甄 */ @RestController @RequestMapping("/mp/sys/user") public class SysUserController { @Autowired private SysUserService userService; /** * 添加用户 * @param sysUser * @return */ @PostMapping public Map addUser(@RequestBody SysUser sysUser) { // 添加,直接调用service,因为有默认实现,所以其他地方就不用写代码了 boolean saveCount = userService.save(sysUser); Map map = new HashMap<>(); if(saveCount) { map.put("code",200); map.put("message","添加用户成功"); }else { map.put("code",500); map.put("message","添加用户失败"); } return map; } }

注意:别忘记添加Mapper扫描

因为从Service到Mapper都已经有了默认实现,我们在单表操作时仅编写Controller即可,如果需要条件查询做判断,可以使用Wrapper是吧!

总结

不知不觉写了一万三千多字,本篇主要介绍了:

  • MyBatis-Plus代码生成器的配置和开发,并且实现单量和批量的代码生成
  • 讲解了生成代码的结构,和引入依赖的说明
  • 通过翻阅生成的代码,为您讲解MyBatis-Plus的常见接口以及它的实现原理
  • 通过一个添加案例实现MyBatis-Plus生成代码的具体应用。

如果觉得不错记得关注,点赞哦!!持续更新编程文章

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: