收藏等于学会,赶紧关注吧!前言 代码自动生成是根据我们的数据表,逆向生成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 相关依赖如下:<?xml version="1.0" encoding="UTF-8"?>父工程中主要定义依赖了版本,下边贴出父工程的依赖: <?xml version="1.0" encoding="UTF-8"?> buye com.buye 1.0.0 4.0.0 buye-testorg.springframework.boot spring-boot-starter-webcom.baomidou mybatis-plus-boot-startercom.baomidou mybatis-plus-generatororg.apache.velocity velocity-engine-coremysql mysql-connector-javaorg.projectlombok lombokio.springfox springfox-boot-starter这里您可以根据自己的需求来创建项目,只需要将这些依赖引入即可,具体依赖见 buye-test 工程,没有引入任何多余依赖2.2.1、模板引擎依赖 这里我引入的模板引擎是 Velocity(默认也就是无需做配置),MyBatis-Plus还支持Freemarker、Beetl,您可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎,如果您也是用 Velocity 引擎则无需引入以下依赖,如果您使用其他模板引擎,请将上文的maven依赖中的 Velocity 依赖替换掉。 Freemarker 依赖: 4.0.0 com.buye buyepom 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-dependencies2.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-modelsBeetl依赖: org.freemarker freemarker版本可以通过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:codebuyebuye-testsrcmainjava 这样的一个完整绝对路径 gc.setOutputDir("D:codebuyebuye-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; /** * com.ibeetl beetl版本可以通过mavne中央仓库查询,选择您想用的版本 * 用户信息表 前端控制器 * * * @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生成代码的具体应用。 如果觉得不错记得关注,点赞哦!!持续更新编程文章