mybatis plus已经将代码生成和原生功能分离到两个依赖。
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency>
你在不引入mybatis-plus-generator的情况下,创建Globel Config对象时:
使用的时核心包下的类,这个类不承载任何代码生成的任务了,所以你调用
setOutputDir(System.getProperty("user.dir") + "/src/main/java"); setAuthor("wuyifan"); setOpen(false);
将会显示找不到对应方法,因此你要引入mybatis-plus-generator,这样你可以看到:
现在我们可以使用代码生成功能了;
但是你会发现报错更多了,这是因为在3.5版本之后,GlobalConfig对象,乃至生成依赖下的一切配置对象都采用静态内部类的方式创建了,必须要使用builder去构建,这时候你就应该发现,mybatis plus的代码生成版本差异和改动依赖太大了,最好生成好代码之后就删掉对应依赖和生成器代码,因为在后期维护和版本升级后很容易产生版本的冲突和意料之外的报错。为了方便大家快速上手,我们首先要将mybatis plus generator回退到3.4的版本
这样我们的代码就不报错了,可以通过下面的代码帮助我们快速生成业务逻辑层和mapper以及model实体
package com.fox.foxsoccer.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
public class MybatisGenerator {
public static void main(String[] args) {
// 1. 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
gc.setAuthor("wang er xiao");
gc.setOpen(false);
/* gc.setServiceName("%sService"); */// 去掉Service接口的首字母I
// 2. 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/freshshopping?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
// 3. 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("foxsoccer");
pc.setParent("com.fox");
pc.setEntity("model");
// 4. 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true); // 自动lombok
strategy.setRestControllerStyle(true); // 生成 @RestController 控制器
strategy.setInclude("t_cart"); // 需要生成的表
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
// 5. 模板配置
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null); // 不生成xml文件
// 6. 代码生成器配置
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(gc);
mpg.setDataSource(dsc);
mpg.setPackageInfo(pc);
mpg.setStrategy(strategy);
mpg.setTemplate(templateConfig);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 7. 执行代码生成
mpg.execute();
}
}
但是这个版本想生成vo实体需要去自定义配置策略和书写flt模板文件。需要了解的朋友可以去学习这部分的知识。
如果你使用的是最新版本3.5.7,那么代码的写法会有很大不同:
package com.fox.foxsoccer.config;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.Service;
import com.baomidou.mybatisplus.generator.config.po.TableField;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.*;
public class MybatisGenerator {
public static void main(String[] args) {
// 1. 全局配置
GlobalConfig.Builder gc = new GlobalConfig.Builder();
gc.outputDir(System.getProperty("user.dir") + "/src/main/java");
gc.author("wuyifan");
gc.disableOpenDir();
/* gc.setServiceName("%sService"); */// 去掉Service接口的首字母I
// 2. 数据源配置
DataSourceConfig.Builder dsc = new DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/freshshopping?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8",
"root",
"123456"
);
// 3. 包配置
PackageConfig.Builder pc = new PackageConfig.Builder()
.moduleName("foxsoccer2")
.parent("com.fox")
.entity("model")
.service("service") // 如果需要生成服务接口
.controller("controller") // 如果需要生成控制器
.mapper("mapper") // 如果需要生成 Mapper 接口
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper"));
Service.Builder strategy = new StrategyConfig.Builder()
.addInclude("t_goods") // 需要生成的表名
.entityBuilder()
.enableLombok() // 开启 Lombok
.naming(NamingStrategy.underline_to_camel) // 数据库表名到实体类名的命名策略
.columnNaming(NamingStrategy.underline_to_camel) // 数据库列名到实体类属性名的命名策略
.controllerBuilder()
.enableRestStyle() // 开启 @RestController
.mapperBuilder()
.enableMapperAnnotation() // 开启 @Mapper 注解
.serviceBuilder()
.formatServiceFileName("I%sService");
// 6. 自定义 VO 文件输出配置
InjectionConfig.Builder injectionConfigBuilder = new InjectionConfig.Builder();
Map<String, String> customFileMap = new HashMap<>();
customFileMap.put("VO.java", "/templates/vo.java.ftl"); // 自定义VO模板路径
injectionConfigBuilder.customFile(customFileMap);
//String voOutputDir = System.getProperty("user.dir") + "/src/main/java/com/fox/foxsoccer2/model/vo/";
// 添加输出文件路径配置
injectionConfigBuilder.beforeOutputFile((tableInfo, objectMap) -> {
String voOutputDir = System.getProperty("user.dir") + "/src/main/java/com/fox/foxsoccer2/model/vo/";
// 传递自定义包信息
objectMap.put("parent", pc.build().getParent());
objectMap.put("moduleName", pc.build().getModuleName());
objectMap.put("model", pc.build().getEntity());
List<TableField> fields = tableInfo.getFields();
objectMap.put("fields", fields);
});
AutoGenerator mpg = new AutoGenerator(dsc.build());
mpg.global(gc.build());
mpg.packageInfo(pc.build());
mpg.strategy(strategy.build());
mpg.injection(injectionConfigBuilder.build());
mpg.execute(new FreemarkerTemplateEngine()); // 执行代码生成
}
}
为什么不建议使用Mybatis 代码生成器
代码生成器通常只能根据数据库表的结构和一些配置生成代码,对于业务逻辑的复杂性、代码的可维护性以及最佳实践等方面的考虑不足
自动生成的代码通常比较基础,无法很好地满足特定的业务需求或架构设计
虽然代码生成器可以节省初始开发时间,但在长期维护中可能带来问题:
一旦生成的代码被修改,重新生成可能会覆盖这些修改,因此维护和升级变得困难。
如果生成的代码不符合团队的实践,可能需要额外的工作来调整和维护这些代码。
自动生成的代码可能没有经过充分的审查,存在潜在的安全隐患或合规问题
依赖代码生成器可能会降低开发者对底层实现的理解
但是我认为最主要的就是他版本总该,你所熟悉的一套api可能两年之后再调用就开始弃用和报错了,并且这个东西本省就像二开一样缺少一个统一规范的生成模式