👨🎓作者: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】;