成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

IDEA工程右鍵菜單,自動生成 ORM碼

開發 前端
在建設一個好的產品功能時,盡可能要學學那些已經非常的優秀的產品,IDEA、GitHub、Mysql等等,在IDEA提供了滿足用戶擴展功能的插件開發,而不是你說一個東西我沒有,你就自己造。共建會讓這個東西變得更加優秀!

[[439202]]

本文轉載自微信公眾號「bugstack蟲洞?!?,作者小傅哥。轉載本文請聯系bugstack蟲洞棧公眾號。

一、前言

都能用,都能湊活用!

一個東西好幾套,為了晉升都來搞。拿了成績就要跑,后面兄弟再重造!

幾年前,大家并不是這樣,那時候還有很多東西可以創新,亂世出英雄總能在一個方向深耕并做出一款款好用的產品功能、框架服務、技術組件等。但后來好像這樣的情況開始減少了,取而代之的是重復、復刻、照搬,換個新的皮膚、換個新的樣式、換個新的名字,就是取巧的新東西了。

有時候公司或者組織也像家,但家里的東西一般是破了補補、壞了修修,實在不行就換個,但沒有誰的家里衛生間一個馬桶、廚房一個馬桶、客廳一個馬桶、臥室一個馬桶的,雖然你的新馬桶可以自動噴水。

所以,在建設一個好的產品功能時,盡可能要學學那些已經非常的優秀的產品,IDEA、GitHub、Mysql等等,在IDEA提供了滿足用戶擴展功能的插件開發,而不是你說一個東西我沒有,你就自己造。共建會讓這個東西變得更加優秀!

二、需求目的

在上一章節中我們通過擴展創建工程向導,添加我們需要創建DDD工程腳手架的步驟,最終提供一個DDD開發框架。那么在這個DDD工程開發框架中,還缺少一部分基于數據庫表信息自動生成對應PO、DAO、Mapper文件的功能。

那么本章節我們就來在工程中擴展這部分內容,實際操作的效果就是我們可以在工程上通過鼠標右鍵的方式,喚出添加ORM代碼塊的窗體,通過選擇庫表的方式,使用 freemarker 自動生成代碼。

在生成的代碼塊中需要完成對所需要包的引入,同時會使用到 lombok 注解的方式替代PO對象中的get、set方法,以減少代碼量邏輯的創建。

三、案例開發

1. 工程結構

  1. guide-idea-plugin-orm 
  2. ├── .gradle 
  3. └── src 
  4.     ├── main 
  5.     │   └── java 
  6.     │    └── cn.bugstack.guide.idea.plugin  
  7.     │        ├── action 
  8.     │        │   └── CodeGenerateAction.java       
  9.     │        ├── domain 
  10.     │        │   ├── model.vo  
  11.     │        │   │   ├── CodeGenContextVO.java        
  12.     │        │   │   └── ORMConfigVO.java        
  13.     │        │   └── service    
  14.     │        │     ├── impl      
  15.     │        │     │   └── ProjectGeneratorImpl.java   
  16.     │        │     ├── AbstractProjectGenerator.java      
  17.     │        │     ├── GeneratorConfig.java       
  18.     │        │     └── IProjectGenerator.java       
  19.     │        ├── infrastructure 
  20.     │        │   ├── data     
  21.     │        │   │   ├── DataSetting.java        
  22.     │        │   │   └── DataState.java       
  23.     │        │   ├── po     
  24.     │        │   │   ├── Base.java     
  25.     │        │   │   ├── Column.java  
  26.     │        │   │   ├── Dao.java  
  27.     │        │   │   ├── Field.java  
  28.     │        │   │   ├── Model.java      
  29.     │        │   │   └── Table.java        
  30.     │        │   └── utils  
  31.     │        │       ├── DBHelper.java      
  32.     │        │       └── JavaType.java       
  33.     │        ├── module   
  34.     │        │   └── FileChooserComponent.java          
  35.     │        └── ui 
  36.     │            ├── ORMSettingsUI.java   
  37.     │            └── ORMSettingsUI.form 
  38.     ├── resources 
  39.     │   ├── META-INF 
  40.     │   │   └── plugin.xml  
  41.     │   └── template 
  42.     │       ├── dao.ftl 
  43.     │       ├── mapper.ftl 
  44.     │       └── model.ftl 
  45.     ├── build.gradle   
  46.     └── gradle.properties 

在此 IDEA 插件工程中,主要分為5塊區域:

  • action:用于提供菜單欄,這個菜單的位置在 plugin.xml 中配置,我們把它配置到工程鼠標右鍵出現的列表上。這樣可以更加方便的讓我們選取工程,以及在這個工程下添加生成的代碼片段
  • domain:領域服務層,其實你直接寫一個Service包也是可以的,只不過最近作者小傅哥更喜歡使用DDD的思想和結構來創建代碼實現功能邏輯。
  • infrastructure:基礎層,提供數據在工程下的存放,每一個工程右鍵都有自己的配置存儲默認信息,方便下次打開的時候可以讀取到這部分內容。同時這一層還提供了用于處理數據庫操作的類,因為我們需要從數據庫中讀取出表的信息、字段、注釋,用于創建PO、DAO、Mapper使用。
  • module:模塊層,這里提供了一個用于選擇文件路徑的組件,可以讓我們在工程上鼠標右鍵后出來的窗體中,點擊模塊選擇對應的要生成代碼的位置路徑。
  • ui:提供配置面板,也就是我們在代碼工程上鼠標右鍵彈出來的面板,這個面板配置后用于生成ORM代碼。

2. 拖拽Swing面板

ORMSettingsUI:咱們先把用于創建代碼配置的面板創建出來,有了畫面,就好進入了。

  • 面板包括生成 PO、DAO、XML 的代碼路徑,以及配置數據庫和選擇表的內容。
  • 操作過程就是在你配置好了這些基本信息后,就可以選擇查詢表名,并選擇好你要給哪幾個表生成對應的ORM代碼了。

3. 配置鼠標右鍵彈窗

首先我們需要創建一個 Action 實現類,通過 New -> Plugin DevKit -> Action

cn.bugstack.guide.idea.plugin.action.CodeGenerateAction

  1. /** 
  2.  * @author: 小傅哥,微信:fustack 
  3.  * @github: https://github.com/fuzhengwei 
  4.  * @Copyright: 公眾號:bugstack蟲洞棧 | 博客:https://bugstack.cn - 沉淀、分享、成長,讓自己和他人都能有所收獲! 
  5.  */ 
  6. public class CodeGenerateAction extends AnAction { 
  7.  
  8.     private IProjectGenerator projectGenerator = new ProjectGeneratorImpl(); 
  9.  
  10.     @Override 
  11.     public void actionPerformed(AnActionEvent e) { 
  12.         Project project = e.getRequiredData(CommonDataKeys.PROJECT); 
  13.         ShowSettingsUtil.getInstance().editConfigurable(project, new ORMSettingsUI(project, projectGenerator)); 
  14.     } 
  15.  
  • 這是一個右鍵菜單的入口,通過這個入口才能去打開我們自己的UI窗體,這個UI窗體就是我們上面拖拽出來的配置面板,ORMSettingsUI
  • 接下來我們還需要把這個 Action 配置到 plugin.xml 文件中,才能被右鍵菜單創建出來。開發代碼的時候也是這樣一個流程,你總要從一個點開始,有了抓手才好抓下去

plugin.xml 配置

  1. <actions> 
  2.     <!-- Add your actions here --> 
  3.     <action id="CodeGenerateAction" class="cn.bugstack.guide.idea.plugin.action.CodeGenerateAction" 
  4.             text="ORMCodeGenerate - 小傅哥" description="Code Generate ORM" icon="/icons/logo.png"
  5.         <add-to-group group-id="ProjectViewPopupMenu" anchor="last"/> 
  6.     </action
  7. </actions> 
  8. ea-plugin> 
  • 把我們的 Action 實現類配置到 xml 中,同時你還要配置它應該出現的位置,比如你需要把這個菜單添加到工程創建中 ProjectViewPopupMenu 以及位置信息 anchor="last"
  • 另外為了讓插件看上去更加高大上還美觀適合吹牛,那么還需要配置 icon,這個位置配置一個16*16的圖片,圖片可以從 iconfont 進行下載。

4. 給窗體添加功能

這一步其實干的就是注入靈魂的事情,讓窗體活起來。給輸入框添加內容、給按鈕添加事件、給確認按鈕增加上生成創建ORM代碼塊的上下文。文章的描述盡可能會偏向于核心代碼的講解,詳情可以參考源碼

接下來這部分內容會在 ORMSettingsUI 類中反復摩擦,直到補全所有功能。

4.1 選擇框事件

  1. // 選擇PO生成目錄 
  2. this.poButton.addActionListener(e -> { 
  3.     FileChooserComponent component = FileChooserComponent.getInstance(project); 
  4.     VirtualFile baseDir = project.getBaseDir(); 
  5.     VirtualFile virtualFile = component.showFolderSelectionDialog("選擇PO生成目錄", baseDir, baseDir); 
  6.     if (null != virtualFile) { 
  7.         ORMSettingsUI.this.poPath.setText(virtualFile.getPath()); 
  8.     } 
  9. }); 

還記得我們提到的拖拽Swing面板嗎,那么這個添加事件的步驟就是給你的 PO 目錄添加一個事件,允許我們可以自己選擇出要把對應PO的代碼生成到哪個目錄結構下。

關于dao、xml都是類似操作,這里就不在演示了。

4.2 數據表事件

  1. this.selectButton.addActionListener(e -> { 
  2.     try { 
  3.         DBHelper dbHelper = new DBHelper(this.host.getText(), Integer.parseInt(this.port.getText()), this.user.getText(), this.password.getText(), this.database.getText()); 
  4.         List<String> tableList = dbHelper.getAllTableName(this.database.getText()); 
  5.         String[] title = {"""表名"}; 
  6.         Object[][] data = new Object[tableList.size()][2]; 
  7.         for (int i = 0; i < tableList.size(); i++) { 
  8.             data[i][1] = tableList.get(i); 
  9.         } 
  10.         table1.setModel(new DefaultTableModel(data, title)); 
  11.         TableColumn tc = table1.getColumnModel().getColumn(0); 
  12.         tc.setCellEditor(new DefaultCellEditor(new JCheckBox())); 
  13.         tc.setCellEditor(table1.getDefaultEditor(Boolean.class)); 
  14.         tc.setCellRenderer(table1.getDefaultRenderer(Boolean.class)); 
  15.         tc.setMaxWidth(100); 
  16.     } catch (Exception exception) { 
  17.         Messages.showWarningDialog(project, "數據庫連接錯誤,請檢查配置.""Warning"); 
  18.     } 
  19. }); 
  • 這一步操作核心流程就在于把你需要生成ORM的代碼的表給拉出來,只要把表選擇上,才能根據表生成PO、DAO、Mapper,其實你用的其他一些自動生成代碼框架也是這么干的。
  • 另外你的建表最好規范,比如有表注釋、有字段注釋、字段的設計遵守下劃線和小寫字母,這樣會更加容易創建出好看的代碼。

4.3 組裝生成代碼上下文

當我們點擊配置窗體的 OK 按鈕時候,要干啥,對嘍,我們要創建出代碼片段了,那么這個時候需要在重寫的 apply 中完成此項操作。

  1. public void apply() { 
  2.     // 鏈接DB 
  3.     DBHelper dbHelper = new DBHelper(config.getHost(), Integer.parseInt(config.getPort()), config.getUser(), config.getPassword(), config.getDatabase()); 
  4.      
  5.     // 組裝代碼生產上下文 
  6.     CodeGenContextVO codeGenContext = new CodeGenContextVO(); 
  7.     codeGenContext.setModelPackage(config.getPoPath() + "/po/"); 
  8.     codeGenContext.setDaoPackage(config.getDaoPath() + "/dao/"); 
  9.     codeGenContext.setMapperDir(config.getXmlPath() + "/mapper/"); 
  10.     List<Table> tables = new ArrayList<>(); 
  11.     Set<String> tableNames = config.getTableNames(); 
  12.     for (String tableName : tableNames) { 
  13.         tables.add(dbHelper.getTable(tableName)); 
  14.     } 
  15.     codeGenContext.setTables(tables); 
  16.      
  17.     // 生成代碼 
  18.     projectGenerator.generation(project, codeGenContext); 
  • 在 apply 中的核心代碼主要就是使用 DBHelper 數據操作工具獲取到對應的庫下鏈接信息,同時把選擇的號的表創建出用于生成代碼類的參數,比如;類的名稱、字段名稱、注釋名稱等。
  • 最后就是調用生成代碼的服務了,projectGenerator.generation(project, codeGenContext); 這一部分就是在我們領域服務 domain 中實現的。

5. 代碼生成領域服務

用于創建PO、DAO、Mapper的代碼塊的代碼主要是這里實現的,核心在于提供了一個抽象類以及對應的實現類,因為處理代碼生成需要使用到 freemarker 所以就在抽象類里包裝了下,這樣可以免去實現類中還需要關心這部分邏輯。

ProjectGeneratorImpl 生成代碼

  1. @Override 
  2. protected void generateORM(Project project, CodeGenContextVO codeGenContext) { 
  3.     List<Table> tables = codeGenContext.getTables(); 
  4.     for (Table table : tables) { 
  5.         List<Column> columns = table.getColumns(); 
  6.         List<Field> fields = new ArrayList<>(); 
  7.         for (Column column : columns) { 
  8.             Field field = new Field(column.getComment(), JavaType.convertType(column.getType()), column.getName()); 
  9.             field.setId(column.isId()); 
  10.             fields.add(field); 
  11.         } 
  12.         // 生成PO 
  13.         Model model = new Model(table.getComment(), codeGenContext.getModelPackage() + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table.getName()), table.getName(), fields); 
  14.         writeFile(project, codeGenContext.getModelPackage(), model.getSimpleName() + ".java""domain/orm/model.ftl", model); 
  15.          
  16.         // 生成DAO 
  17.         Dao dao = new Dao(table.getComment(), codeGenContext.getDaoPackage() + "I" + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table.getName()) + "Dao", model); 
  18.         writeFile(project, codeGenContext.getDaoPackage(), dao.getSimpleName() + ".java""domain/orm/dao.ftl", dao); 
  19.          
  20.         // 生成Mapper 
  21.         writeFile(project, codeGenContext.getMapperDir(), dao.getModel().getSimpleName() + "Mapper.xml""domain/orm/mapper.ftl", dao); 
  22.     } 
  • 創建代碼的過程就比較簡單了,通過循環提取出來的表信息,映射成對應的類和屬性以及注釋,再使用 resources 下的 ftl 文件創建出對應的類和xml配置文件就可以了。
  • 如果你還需要生成起來代碼片段或者創建調用一些常用的組件,也是可以通過這樣的方式進行實現的。

四、測試驗證

點擊 Plugin 啟動 IDEA 插件,之后在工程右鍵如下:

1. 鼠標右鍵,選擇菜單

2. 配置頁面,配置信息

3. 自動創建,生成代碼

好了,選擇代碼塊就這么嗖的創建了出來,是不是非常方便,而且可以滿足你在任何時候的把新的庫表代碼補充進來,減少了手敲CRUD操作。

五、總結

本章節小傅哥帶著你又在 IDEA DDD 插件生成工程的結構下,又完善了一步生成ORM代碼,當然你也可以在創建工程向導中添加生成ORM代碼的步驟。而在工程下創建ORM的方式可以當做是對腳手架工程的補充,滿足不同場景下的需求。

此外在 IDEA 插件開發的系列內容中我們是不斷的嘗試使用新的方式完善不同的功能點,如果你需要開發一個完整的插件那么可以結合這些功能一起來開發你的需求。

插件開發中還是有很多的內容需要了解和學習的,同時也要注意一些代碼實現細節,例如我們本章節中的數據保存是在一個什么維度,是IDEA開發工具維度,還是在IDEA中的工程維度,這些是有區別。比如你的不同工程,是不需要保存同一份配置的

 

 

責任編輯:武曉燕 來源: bugstack蟲洞棧
相關推薦

2011-02-23 09:29:29

Konqueror

2010-07-29 13:18:45

Flex右鍵菜單

2021-11-01 05:39:18

Windows 11操作系統微軟

2009-07-23 13:35:33

Ruby on Rai

2009-12-24 10:04:31

WPF右鍵菜單

2022-05-18 07:44:13

自定義菜單前端

2021-07-21 05:31:39

Windows 11操作系統微軟

2009-08-18 11:17:37

C#添加鼠標右鍵

2010-07-29 13:27:13

Flex右鍵菜單

2011-04-21 15:22:27

ArcGIS Engi

2021-01-21 12:04:05

Windows 10UI界面微軟

2009-08-18 09:03:19

Windows 7磁盤碎片整理

2021-07-20 15:13:39

Windows 11操作系統微軟

2021-11-04 05:37:09

Windows 11操作系統微軟

2021-11-15 22:43:40

Windows 11操作系統微軟

2011-09-06 10:00:19

Vista右鍵菜單

2011-07-25 14:49:36

jQuery

2015-10-14 11:11:06

右鍵菜單build 10565Windows 10

2021-12-14 09:20:30

微軟Windows 11右鍵菜單

2022-01-25 16:07:11

WindowsWinRAR微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品免费视频 | 中文字幕高清av | 激情麻豆视频 | 在线亚洲免费 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 国色天香综合网 | 天堂资源 | 久久精品视频播放 | 亚洲高清免费观看 | 能看的av| 美女福利视频 | 中国一级特黄真人毛片免费观看 | 91精品国产91久久久久久吃药 | 91视频在线 | 午夜激情视频在线 | 一级特黄a大片 | 一区二区三区视频在线观看 | 国产精品日日摸夜夜添夜夜av | 日本高清视频在线播放 | 久久宗合色 | 91欧美精品| 欧美一区二区三区四区视频 | 日韩久久久久久 | 久久久久久国产精品 | 欧美日韩国产免费 | 国产精品久久久久一区二区三区 | 久久久久国产精品午夜一区 | 日本免费黄色一级片 | av在线成人 | 精品国产18久久久久久二百 | 一区二区三区免费观看 | 精品国产99 | 日韩中文在线 | 国产精品一区二区av | 久久久精品一区 | 午夜精品视频 | 国产精品不卡一区 | 欧美a在线 | 羞羞视频免费在线观看 | 成人免费观看男女羞羞视频 | 久久久久久久久久久丰满 |