代码生成器
添加依赖
- 添加代码生成器依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
-
添加模板引擎依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。
Velocity(默认)
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
Freemarker
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
Beetl
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.0.13.RELEASE</version>
</dependency>
注意!如果您选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎。
AutoGenerator generator = new AutoGenerator();
// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());
// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());
// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());
// other config
...
程序编写
public enum CodeGenerator {
INSTANCE;
/**
* 代码生成器入口方法
*/
public static void main(String[] args) {
System.out.print("请输入需要生成实体对象的表名:");
Scanner scanner = new Scanner(System.in);
String tableName = scanner.nextLine();
AutoGenerator mpg = INSTANCE.getAutoGenerator(tableName);//配置代码生成器
mpg.execute();//生成代码
System.err.println(" TableName【 " + tableName + " 】Generate Success !");
}
/**
* 获取AutoGenerator
*/
private AutoGenerator getAutoGenerator(String tableName) {
return new AutoGenerator()
// 全局配置
.setGlobalConfig(getGlobalConfig())
// 数据源配置
.setDataSource(getDataSourceConfig())
// 策略配置
.setStrategy(getStrategyConfig(tableName))
// 包配置
.setPackageInfo(getPackageConfig())
// 注入自定义配置,可以在 VM 中使用 ${cfg.abc} 获取属性
.setCfg(getInjectionConfig())
//自定义模板
.setTemplate(getTemplateConfig());
}
/**
* 获取GlobalConfig,配置全局变量
*/
private GlobalConfig getGlobalConfig() {
return new GlobalConfig()
.setOutputDir(System.getProperty("user.dir") + "/src/main/java")// 输出目录
.setFileOverride(true)// 是否覆盖文件
.setActiveRecord(false)// 开启 activeRecord 模式(java不支持这种模式)
.setEnableCache(false)// XML 二级缓存
.setBaseResultMap(false)// XML ResultMap
.setBaseColumnList(false)// XML ColumnList
.setKotlin(false)// 是否生成 kotlin 代码
.setOpen(false)
.setAuthor("")// 作者
// 自定义文件命名, 注意 %s 会自动填充表实体属性
.setEntityName("%s")
.setMapperName("%sMapper")
.setXmlName("%sMapper")
.setServiceName("I%sService")
.setServiceImplName("%sServiceImpl")
.setControllerName("%sController")
.setSwagger2(true);//实体属性 Swagger2 注解
}
/**
* 获取TableFill策略
*/
private List<TableFill> getTableFills() {
// 自定义需要填充的字段
List<TableFill> tableFillList = new ArrayList<>();
tableFillList.add(new TableFill("create_time", FieldFill.INSERT));
tableFillList.add(new TableFill("update_time", FieldFill.INSERT_UPDATE));
tableFillList.add(new TableFill("create_uid", FieldFill.INSERT));
tableFillList.add(new TableFill("update_uid", FieldFill.INSERT_UPDATE));
return tableFillList;
}
/**
* 获取DataSourceConfig,数据源配置
*/
private DataSourceConfig getDataSourceConfig() {
return new DataSourceConfig()
.setDbType(DbType.DB2)// 数据库类型
.setTypeConvert(new DB2TypeConvert() {
//自定义转换器,可以转换一些特殊类型,这应该是db2特有的
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
if (fieldType.toLowerCase().equals("bit")) {
return DbColumnType.BOOLEAN;
}
if (fieldType.toLowerCase().equals("tinyint")) {
return DbColumnType.INTEGER;
}
if (fieldType.toLowerCase().equals("date")) {
return DbColumnType.DATE;
}
if (fieldType.toLowerCase().equals("time")) {
return DbColumnType.DATE;
}
if (fieldType.toLowerCase().equals("datetime")) {
return DbColumnType.DATE;
}
return super.processTypeConvert(globalConfig, fieldType);
}
})
.setDriverName("com.ibm.db2.jcc.DB2Driver")
.setUsername("db2inst1")
.setPassword("XFjubao")
.setUrl("jdbc:db2://192.168.1.203:50000/PZDB");
}
/**
* 获取StrategyConfig,策略配置
*/
private StrategyConfig getStrategyConfig(String tableName) {
List<TableFill> tableFillList = getTableFills();
return new StrategyConfig()
.setCapitalMode(false)// 全局大写命名
.setTablePrefix("pz_")// 去除前缀
.setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
// .setInclude(new String[] { "user" }) // 需要生成的表
// 自定义实体父类
.setSuperEntityClass("com.sinosoft.pz.framework.model.entity.BaseEntity")
// 自定义实体, 公共字段
.setSuperEntityColumns("id")
.setTableFillList(tableFillList)
// 自定义 mapper 父类
.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper")
// 自定义 controller 父类
// .setSuperControllerClass("xx.xx.SuperController")
// 自定义 service 实现类父类
.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl")
// 自定义 service 接口父类
.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService")
// 【实体】是否生成字段常量(默认 false)
.setEntityColumnConstant(true)
// 【实体】是否为构建者模型(默认 false)
.setEntityBuilderModel(false)
// 【实体】是否为lombok模型(默认 false)
.setEntityLombokModel(true)
// Boolean类型字段是否移除is前缀处理
.setEntityBooleanColumnRemoveIsPrefix(true)
//是否添加@restController注释(controller)
.setRestControllerStyle(true)
//添加表名表名
.setInclude(tableName);
}
/**
* 获取PackageConfig, 包配置
*/
private PackageConfig getPackageConfig() {
return new PackageConfig()
.setParent("com.sinosoft.pz.system")
.setController("web.controller")
.setEntity("model.entity")
.setMapper("mapper")
.setService("service")
.setServiceImpl("service.impl");
}
/**
* 获取InjectionConfig,自定义配置
*/
private InjectionConfig getInjectionConfig() {
return new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
//map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");自定义作者名称,在模板中用${abc}获取
this.setMap(map);
}
}.setFileOutConfigList(Collections.singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
// 自定义输出文件目录,因为mapper.xml和其他的文件不放到同一个目录下,所以需要自定义配置
@Override
public String outputFile(TableInfo tableInfo) {
String resourcePath = getRootPath() + "/src/main/resources";
System.err.println(" Generator Resource Path:【 " + resourcePath + " 】");
return resourcePath + "/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
}
}));
}
/**
* 获取TemplateConfig,自定义模板
*/
private TemplateConfig getTemplateConfig() {
//没有自定义的模板
return new TemplateConfig().setXml(null);
}
/**
* 获取项目根目录
*/
private String getRootPath() {
return System.getProperty("user.dir");//获取当前项目
}
}
Velocity模板
待续