👨🎓作者:bug 菌
✏️博客:CSDN、掘金等
💌公众号:猿圈奇妙屋
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系 bug 菌处理。
一、前言🔥
接下来的这几期,bug 菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
若小伙伴们在批阅文章的过程中觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对 bug 菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,创作不停💕,加油☘️
二、正文🔥
接下来,我这里又用到一个超级方便好省的玩意,在对于新增表而言,手动创建那些 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 文件中就好啦。像我这样,如下:
至于具体如何使用及拓展,请看下一章节啦。
... ...
好啦,以上就是这期的所有内容啦,你们学废了么?如果对你有所帮助,还请不要忘记给 bug 菌[三连支持]哟。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『猿圈奇妙屋』,后台回复关键词领取学习资料、大厂面经、面试模板等海量资源,就等你来拿。
如上是整整二十期内容,每一期都是干货,对于一个模块的开发,如何一点一滴打造并测试部署上线,我再说一遍,这不是演习,是实战!是实战!是实战!
若你们觉得只是需要了解其中某个知识点或者业务的话,也不反对,你就选择其中的几期进行学习就好,反正都已经完结啦;我只希望你们能有所收获,有所成长,也就不枉我苦心每天下班后给大家总结更新。
三、往期热文推荐🔥
对于问题反馈模块实战开发,我完整的梳理了每一期的教学及链接地址,仅供参考:希望能对你们有所帮助。
如上是整整二十期内容,每一期都是干货,对于一个模块的开发,如何一点一滴打造并测试部署上线,我再说一遍,这不是演习,是实战!是实战!是实战!
若你们觉得只是需要了解其中某个知识点或者业务的话,也不反对,你就选择其中的几期进行学习就好,反正都已经完结啦;我只希望你们能有所收获,有所成长,也就不枉我苦心每天下班后给大家总结更新。
四、文末🔥
《springboot 零基础入门教学》,都是我一手打下的江山,持续更新中,希望能帮助到更多小伙伴们。
我是 bug 菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
最后送大家两句我很喜欢的话,与诸君共勉!
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以 start。
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。
💌如果文章对您有所帮助,就请留下您的赞吧!(#^.^#);
💝如果喜欢 bug 菌分享的文章,就请给 bug 菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ 交流群:708072830】;
💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);
💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。
评论