面试中遇到的一道机操题,so simple。
这是里SpringBoot项目,注意你的数据表中只有一个id字段是会生成失败的!
添加maven依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version>
</dependency>
<!--添加 代码生成器 依赖-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.1.1</version>
</dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.1</version>
</dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version>
</dependency>
逆向生成数据库表对应的实体类等代码,注意,默认生成的实体类等,要手动添加到Spring中。
package com.example.demo.demos.web;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
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 CodeGenerator {/*** 读取控制台内容*/public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("请输入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotEmpty(ipt)) {return ipt;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}public static void main(String[] args) {/*** 代码生成器*/AutoGenerator mpg = new AutoGenerator();/*** 全局配置*/GlobalConfig globalConfig = new GlobalConfig();//生成文件的输出目录String projectPath = System.getProperty("user.dir");globalConfig.setOutputDir(projectPath + "/src/main/java");//Author设置作者globalConfig.setAuthor("李义新");//是否覆盖文件globalConfig.setFileOverride(true);//生成后打开文件globalConfig.setOpen(false);mpg.setGlobalConfig(globalConfig);/*** 数据源配置*/DataSourceConfig dataSourceConfig = new DataSourceConfig();// 数据库类型,默认MYSQLdataSourceConfig.setDbType(DbType.MYSQL);//自定义数据类型转换dataSourceConfig.setTypeConvert(new MySqlTypeConvert());dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=UTC");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("Li123456.");mpg.setDataSource(dataSourceConfig);/*** 包配置*/PackageConfig pc = new PackageConfig();pc.setModuleName(scanner("模块名"));//父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名pc.setParent("com.example.demo");mpg.setPackageInfo(pc);/*** 自定义配置*/InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};/*** 模板*///如果模板引擎是 freemarkerString templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocity// String templatePath = "/templates/mapper.xml.vm";/*** 自定义输出配置*/List<FileOutConfig> focList = new ArrayList<>();// 自定义配置会被优先输出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!return projectPath + "/src/main/resources/mapper/"+ pc.getModuleName()+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});cfg.setFileOutConfigList(focList);mpg.setCfg(cfg);/*** 配置模板*/TemplateConfig templateConfig = new TemplateConfig();// 配置自定义输出模板//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别// templateConfig.setEntity("templates/entity2.java");// templateConfig.setService();// templateConfig.setController();templateConfig.setXml(null);mpg.setTemplate(templateConfig);/*** 策略配置*/StrategyConfig strategy = new StrategyConfig();//设置命名格式strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);strategy.setInclude(scanner("AA,BB,CC,DD").split(","));//实体是否为lombok模型(默认 false)strategy.setEntityLombokModel(true);//生成 @RestController 控制器strategy.setRestControllerStyle(true);//设置自定义继承的Entity类全称,带包名//strategy.setSuperEntityClass("com.jiangfeixiang.mpdemo.BaseEntity");//设置自定义继承的Controller类全称,带包名//strategy.setSuperControllerClass("com.jiangfeixiang.mpdemo.BaseController");//设置自定义基础的Entity类,公共字段strategy.setSuperEntityColumns("id");//驼峰转连字符strategy.setControllerMappingHyphenStyle(true);//表名前缀strategy.setTablePrefix(pc.getModuleName() + "_");mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();}
}