开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
我们在刚开始web工程,或者说做与数据库相关的工程时,都会自己去手动编写dao,entity,service,controller等。而这部分代码都是按某种规范去编写的,有需求,就有对应的产品应运而生,AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,能够很大程度上提升开发效率。
本节主要围绕mybatis-plus的代码生成器进行实战讲解,讲解的是3.5之前的版本,3.5之后的版本,代码生成器规范又是另外一种,思想差不多。下面开始正式讲解。
首先我们搭建项目工程并取名code_generator,然后导入相应的pom依赖。
相关依赖有:mybatis-plus、mybatis-plus-generator、druid -spring-boot-starter 、mysql-connector-java、lombok、swagger-annotation、spring-web
新建一个带main方法的类如下(不需要太复杂):
public class xx_generator {
public static void main(String[] args) {
}
}
添加下面两行代码,这就是一个最简单的代码生成器。AutoGenerator就是mp里面的代码生成类,我们执行,当然不会生成任何代码,因为我们还没有去配置数据库什么的。
AutoGenerator mpg = new AutoGenerator();
mpg.execute();
我们使用DataSourceConfig来做数据库相关的设置,看下面这张图,是不是有点熟悉了?这些就是我们在做数据库连接时用到的那些参数。
我们设置一下这些参数,并将datasourceConfig放到代码生成器中,代码如下:
- 我们将一些连接信息放到了最前面,以方便修改。
public class xx_generator {
private static final String SERVICE_NAME = "content";
//数据库账号
private static final String DATA_SOURCE_USER_NAME = "root";
//数据库密码
private static final String DATA_SOURCE_PASSWORD = "admin";
public static void main(String[] args) {
//建一个代码生成器
AutoGenerator mpg = new AutoGenerator();
//数据库相关配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/xc148_" + SERVICE_NAME
+ "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUsername(DATA_SOURCE_USER_NAME);
dataSourceConfig.setPassword(DATA_SOURCE_PASSWORD);
mpg.setDataSource(dataSourceConfig);
mpg.execute();
}
}
当然,现在还不能来生成代码,因为生成的路径还没去配置。
默认使用的Velocity作为模版引擎
那接下来我们做一下全局配置来配置一下输出路径、作者名等信息。加上下面代码:
GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(true);
//生成路径
gc.setOutputDir(System.getProperty("user.dir") + "/code_generator/src/main/java");
mpg.setGlobalConfig(gc);
最后生成的文件如下:
到目前为止,会在项目跟路径下创建一个
code_generator/src/main/java这样的路径来生成代码,我们还需要调整。我们需要生成到特定的包下面,这样做更适配我们的项目。包配置见下面代码:
PackageConfig pc = new PackageConfig();
pc.setModuleName(SERVICE_NAME);
pc.setParent("com.itcast");
pc.setServiceImpl("service.impl");
pc.setXml("mapper");
pc.setEntity("model.po");
mpg.setPackageInfo(pc);
代码生成到了com.itcast.content这个包路径下,如图:
当然,到这里还不够完整,因为考虑到需要生成数据库中的那些表、数据表名是否有前缀,字段是否要驼峰命名等问题,我们还需要做一下策略配置。这部分代码如下,容易理解不做介绍。
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude("course_base"); //这里是控制映射哪些表
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
// Boolean类型字段是否移除is前缀处理
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
strategy.setRestControllerStyle(true);
// 自动填充字段配置
strategy.setTableFillList(Arrays.asList(
new TableFill("create_date", FieldFill.INSERT),
new TableFill("change_date", FieldFill.INSERT_UPDATE),
new TableFill("modify_date", FieldFill.UPDATE)
));
mpg.setStrategy(strategy);
结果如图:
我们只生成了数据库中course_base表的相关mapper、service等代码。最后附上完整代码:
public class xx_generator {
// TODO 修改服务名以及数据表名
private static final String SERVICE_NAME = "content";
//数据库账号
private static final String DATA_SOURCE_USER_NAME = "root";
//数据库密码
private static final String DATA_SOURCE_PASSWORD = "admin1234";
//生成的表
private static final String[] TABLE_NAMES = new String[]{
// "mq_message",
// "mq_message_history"
"course_base",
"course_market",
"teachplan",
"teachplan_media",
"course_teacher",
"course_category"
// "course_publish",
// "course_publish_pre"
// "course_category"
};
// TODO 默认生成entity,需要生成DTO修改此变量
// 一般情况下要先生成 DTO类 然后修改此参数再生成 PO 类。
private static final Boolean IS_DTO = false;
public static void main(String[] args) {
//建一个代码生成器
AutoGenerator mpg = new AutoGenerator();
//数据库相关配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/xc148_" + SERVICE_NAME
+ "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true");
// dsc.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUsername(DATA_SOURCE_USER_NAME);
dataSourceConfig.setPassword(DATA_SOURCE_PASSWORD);
mpg.setDataSource(dataSourceConfig);
//设置默认的模版引擎
mpg.setTemplateEngine(new VelocityTemplateEngine());
//全局配置
GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(true);
//生成路径
gc.setOutputDir(System.getProperty("user.dir") + "/code_generator/src/main/java");
gc.setAuthor("itcast"); //作者信息
gc.setOpen(false); //是否覆盖
gc.setSwagger2(false);
gc.setServiceName("%sService");
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
if (IS_DTO) {
gc.setSwagger2(true);
gc.setEntityName("%sDTO");
}
mpg.setGlobalConfig(gc);
//包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(SERVICE_NAME);
pc.setParent("com.itcast");
pc.setServiceImpl("service.impl");
pc.setXml("mapper");
pc.setEntity("model.po");
mpg.setPackageInfo(pc);
// 设置模板
// TemplateConfig tc = new TemplateConfig();
// mpg.setTemplate(tc);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(TABLE_NAMES); //这里是控制映射哪些表
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
// Boolean类型字段是否移除is前缀处理
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
strategy.setRestControllerStyle(true);
// 自动填充字段配置
strategy.setTableFillList(Arrays.asList(
new TableFill("create_date", FieldFill.INSERT),
new TableFill("change_date", FieldFill.INSERT_UPDATE),
new TableFill("modify_date", FieldFill.UPDATE)
));
mpg.setStrategy(strategy);
mpg.execute();
}
}