一、powerdesigner设计数据库
在实际开发中,我们不可能在workbench或Navicat中手动创建数据库,再手动编写数据库对应的PO。通常情况下我们会借助第三方软件,设计系统中所用到的数据库实体。而后使用代码生成器,生成初步的代码。本章就介绍一个常用的数据库设计软件,powerdesigner。
1.1 展示内容设置
在空白处单击右键,选择display preference>>table>>advanced
记得把这个页面的Indexes 和 Comment勾上
而后点击colomn,设置为如图
1.2 domain设置
domain我通常不做复杂的设计,以好用方便为主
1.3 数据库表设计
这里以公主连结会战报刀工具为例,展示下表的设计
数据库设计如图所示:
而后,点击菜单的database,选择generate database,生成数据库文件。
再然后把数据库文件在数据库中执行,就得到我们业务所需的表。
1.4 数据导出
点击Database->generate Database,即可生成对应的sql
对于每一张表,也要记得勾选generate,才会有生成
二、mybatis-plus 原生的代码生成器
mybatis-plus提供了原生的代码生成器,本节直接展示代码,详细配置可见官网
static void officialGen(){
String outputPath = "E:\\DOCUMENT\\generator\\bailan2";
FastAutoGenerator.create("jdbc:mysql://localhost:3307/bailan?useSSL=false&useUnicode=true&characterEncoding=utf-8",
"root", "qqhilvMgAl@7")
.globalConfig(builder -> {
// 设置作者
builder.author("织法")
// 开启 swagger 模式
.enableSwagger()
// 覆盖已生成文件
.fileOverride()
// 指定输出目录
.outputDir(outputPath);
})
.packageConfig(builder -> {
// 设置父包名
builder.parent("indi.zhifa.recipe.bailan.busy")
// 指定模块名称
.moduleName("dbgen")
.entity("entity.po")
.service("dao.service")
.serviceImpl("dao.service.impl")
.mapper("dao.mapper");
})
.strategyConfig(builder -> {
// 设置过滤表前缀
builder.addTablePrefix("bl_","sys_")
.addExclude("gc_user")
.entityBuilder()
.enableLombok()
.enableRemoveIsPrefix()
.logicDeleteColumnName("del")
.logicDeletePropertyName("del")
.addTableFills(new Column("create_time", FieldFill.INSERT))
.addTableFills(new Property("createTime", FieldFill.INSERT))
.addTableFills(new Column("create_by",FieldFill.INSERT))
.addTableFills(new Property("createBy",FieldFill.INSERT))
.addTableFills(new Column("create_name",FieldFill.INSERT))
.addTableFills(new Property("createName",FieldFill.INSERT))
.addTableFills(new Column("create_ip",FieldFill.INSERT))
.addTableFills(new Property("createIp",FieldFill.INSERT))
.addTableFills(new Column("modify_time", FieldFill.UPDATE))
.addTableFills(new Property("modifyTime", FieldFill.UPDATE))
.addTableFills(new Column("modify_by",FieldFill.UPDATE))
.addTableFills(new Property("modifyBy",FieldFill.UPDATE))
.addTableFills(new Column("modify_name",FieldFill.UPDATE))
.addTableFills(new Property("modifyName",FieldFill.UPDATE))
.addTableFills(new Column("modify_ip",FieldFill.UPDATE))
.addTableFills(new Property("modifyIp",FieldFill.UPDATE))
.idType(IdType.ASSIGN_ID)
.formatFileName("%sEntity")
.entityBuilder()
.superClass(BaseEntity.class)
.disableSerialVersionUID()
.enableLombok()
.versionColumnName("version")
.versionPropertyName("version")
.addSuperEntityColumns("id","create_time","create_by","create_name","create_ip","modify_by","modify_time","modify_name","modify_ip","version","del")
.serviceBuilder()
.formatServiceFileName("I%sDbService")
.formatServiceImplFileName("%sDbServiceImpl")
.serviceBuilder()
.superServiceClass(IZfDbService.class)
.superServiceImplClass(ZfDbServiceImpl.class);
})
// 使用Freemarker引擎模板,默认的是Velocity引擎模板
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
三、使用freemark,自己制作一个代码生成器
然而,官方的生成工具有很多问题。
第一,生成的代码和我们的要求不完全相同。比如,我们用的swagger3,而官方的生成的是2。
第二,官方的生产,对vo,dto的支持不是很好
第三,实际开发中,一个微服务可能涉及好几十张表,但其实可以再分模块,我们希望同一模块的实体、mapper、service放到同一包下
第四,对分页的支持不强。实际开发的分页查询,都是机械重复的代码,我们每次手动编写,一个实体可能20分钟就浪费掉了。
这部分不太好做,先鸽着吧,有空回过头来搞这块
3.1 使用自己的framemark模板
mybatisplus的模板在这里,我们可以粘到自己的工程中稍作魔改
在配置时,添加下列代码
.templateConfig(templet->{
templet.entity("templates/MyEntity.java");
templet.mapper("templates/MyMapper.java");
//templet.mapperXml("templates/MyMapper.xml");
templet.service("templates/MyService.java");
templet.serviceImpl("templates/MyServiceImpl.java");
templet.controller("templates/MyController.java");
})
.execute();
把模板资源放到自己工程resource下即可。
3.2 更深度的定制
读取一个xml,然后自己做些解析。这个以后再写……