👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
接下来,我这里又用到一个超级方便好省的玩意,在对于新增表而言,手动创建那些Entity、Dao、Mapper.xml、Service、Controller等文件是一件非常头疼的体力活,妥妥工具人啊,而且一个完整的业务系统,有着源源不断的需求迭代,这对于一个后端开发者而言,手动创建这些类实体文件就显得特别无力又无奈。
所以对于那些还在手动创建这些类实体的小伙伴们,从此刻开始你们就要摆脱徒手创建的噩梦,教大家如何代码自动替我们做这件事,从此不再苦恼对于新加表而言而又面临徒手加类实体的烦恼。如果有的小伙伴用到了, 那请忽略此步骤,接着看下一章节的内容哈。
对于代码生成器,我这里推荐的是mybatis-plus所提供的AutoGenerator代码生成器,通过 AutoGenerator你可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升你的开发效率。
所以接下来,你只需要在你的pom依赖配置中引入如下依赖包即可。
<!-- 代码自动生成器配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
由于MyBatis-Plus 从 3.0.3
版本之后就移除了代码生成器与模板引擎的默认依赖,需要你手动添加模板引擎的依赖。
而且对于mp添加模板引擎依赖,MyBatis-Plus可支持Velocity(默认)、Freemarker、Beetl等,你完全可以选择自己熟悉的模板引擎,如果都不满足您的要求,你也可以采用自定义模板引擎。
比如我本地项目开发用的就是Freemarker这套模板引擎,所以只需要在我的配置文件中引入Freemarker模板引擎的依赖即可。
<!--freemarker模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
如果你有自己的想法,那么你也可以使用你自己熟悉的模板引擎哈。这里我就不一一演示了,如果你嫌麻烦,你可以暂时先按照我的这套教程走,先使用熟悉起来后,再换模板引擎也是可以的呀。
接下来就是核心内容了。毕竟涉及通过代码如何实现自动代码生成呢?这你接着往下看。我会写的非常详细。一定会把你教会的。
如下是执行 main 方法控制台输入模块表名后回车即可自动生成对应文件且存放到项目目录中。
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("luoyong");
gc.setOpen(false);
gc.setFileOverride(true);// 是否覆盖同名文件,默认是false
gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap 生成基本的resultmap
gc.setBaseColumnList(true);// XML columList 生成基本的sql片段
//实体属性 Swagger2 注解
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://ip:3306/review_db?serverTimeznotallow=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//pc.setModuleName(scanner("模块名"));
pc.setParent("com.example.review");
pc.setEntity("entity");
pc.setMapper("dao");
pc.setService("service");
pc.setServiceImpl("service.impl");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + ".xml";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.example.review.base.BaseEntity");
strategy.setEntityLombokModel(false);
strategy.setRestControllerStyle(true);
// 公共父类
strategy.setSuperControllerClass("com.example.review.base.BaseController");
// 写于父类中的公共字段
// strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
其中有几块你们是需要手动修改的。比如你们的包路径位置,我的项目根目录为com.example.review.你们的是啥就具体改成啥就行。还有就是数据库连接地址,我这里是直接使用的ip作为演示,这里你们也是要将ip改成你们数据库服务具体ip地址的哈,然后别的啥你们都可以直接套用我上边写的这套代码。
最后就是main主函数调用了。这具体实现代码我也帮大家写好了。目的就是为了像现在我这个需求,可根据新增的表来指定自动生成对应实体类等文件。
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 + "!");
}
所以小伙伴们以上两段代码写到同一个MyGenerator文件中就好啦。像我这样,如下:
至于具体如何使用及拓展,请看下一章节啦。