在项目当中,如 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,重复去创建很繁琐,我们可以通过程序自动生成的,提升我们开发的效率。这篇文章记录如何使用 MyBatis-Plus 的代码生成器,生成代码,减少我饿们重复性劳动。下面给出一个可行的参考代码,具体的步骤可以参考官网文档
@SpringBootTest(classes = DistributedLockApp.class)
@RunWith(SpringRunner.class)
@Slf4j
public class CodeGenerate {
@Autowired
private DataSourceProperties dataSource;
/**
* 项目路径
*/
private static final String projectPath = System.getProperty("user.dir");
/**
* 要生成的表名称
*/
private static final String tableNames = "actor,address,category,city,country," +
"customer,film,film_actor,film_category,film_text,inventory,language,payment,rental,staff,store";
@Test
public void generate() {
//最终的代码生成
config().execute();
}
private AutoGenerator config() {
AutoGenerator generator = new AutoGenerator()
.setDataSource(getDataSourceConfig())
.setGlobalConfig(getGlobalConfig())
.setStrategy(getStrategyConfig())
.setPackageInfo(getPackageConfig())
.setTemplate(getTemplateConfig())
//设置模板引擎
.setTemplateEngine(new FreemarkerTemplateEngine())
.setCfg(getInjectionConfig());
return generator;
}
/**
* 数据源配置:连接数据库
*/
private DataSourceConfig getDataSourceConfig() {
return new DataSourceConfig().
setUrl(dataSource.getUrl())
.setDriverName(dataSource.getDriverClassName())
.setUsername(dataSource.getUsername())
.setPassword(dataSource.getPassword());
}
/**
* 全局信息设置:设置文件输出路径、作者信息、是否覆盖文件等
*/
private GlobalConfig getGlobalConfig() {
final String outPutDir = projectPath + "/src/main/java";
final String author = "kpq";
GlobalConfig globalConfig = new GlobalConfig()
.setOutputDir(outPutDir).setAuthor(author)
//是否打开输出目录
.setOpen(false).setSwagger2(false).setBaseResultMap(false)
//是否覆盖已有的文件,设置service实现类的名称
.setFileOverride(false).setServiceImplName("%sService");
return globalConfig;
}
/**
* 生成包名设置
*/
private PackageConfig getPackageConfig() {
//父级目录
final String parentPath = "com.example.distributedLock";
//设置service实现类所在的包名
final String servicePackage = "service";
PackageConfig packageConfig = new PackageConfig()
.setParent(parentPath).setModuleName("").setService("")
.setServiceImpl(servicePackage);
return packageConfig;
}
/**
* 策略配置
*/
private StrategyConfig getStrategyConfig() {
//实体类要继承的超类
final String superEntityClass = "com.example.distributedLock.entity.base.BaseEntity";
//超类当中的字段
final String superEntityColumns = "last_update";
StrategyConfig strategy = new StrategyConfig()
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setSuperEntityClass(superEntityClass)
.setSuperEntityColumns(superEntityColumns)
.setEntityLombokModel(true)
.setInclude(tableNames.split(","));
return strategy;
}
/**
* 模板配置:配置自定义模板
*/
private TemplateConfig getTemplateConfig() {
TemplateConfig templateConfig = new TemplateConfig()
.setXml(null).setService("").setController("")
.setServiceImpl("templates/customizeServiceImpl.java");
return templateConfig;
}
private InjectionConfig getInjectionConfig() {
final String templatePath = "/templates/mapper.xml.ftl";
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名
return projectPath + "/src/main/resources/mapper/" + getPackageConfig().getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}
}
最终结果:
主要原理
MyBatis-Plus 为我们提供了一系列模板,通过填充模板生成我们想要的代码,如下图所示。如果模板不符合需求,我们也可以自定义自己的模板来生成所需的代码。
个人博客:https://www.kangpeiqin.cn/#/index
欢迎与我交流,关注公众号(sunny的技术小屋),获取更多技术相关知识