乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      《IntelliJ IDEA 插件開發(fā)》第 五 節(jié):IDEA工程右鍵菜單,自動生成ORM代碼

       小傅哥 2021-12-13

      作者:小傅哥
      博客:https://

      ?

      沉淀、分享、成長,讓自己和他人都能有所收獲!??

      ?

      目錄

      • 一、前言

      • 二、需求目的

      • 三、案例開發(fā)

        • 1. 工程結構

        • 2. 拖拽Swing面板

        • 3. 配置鼠標右鍵彈窗

        • 4. 給窗體添加功能

        • 5. 代碼生成領域服務

      • 四、測試驗證

      • 五、總結

      • 六、系列推薦

      一、前言

      都能用,都能湊活用!

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

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

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

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

      二、需求目的

      在上一章節(jié)中我們通過擴展創(chuàng)建工程向?qū)В砑游覀冃枰獎?chuàng)建DDD工程腳手架的步驟,最終提供一個DDD開發(fā)框架。那么在這個DDD工程開發(fā)框架中,還缺少一部分基于數(shù)據(jù)庫表信息自動生成對應PO、DAO、Mapper文件的功能。

      • 那么本章節(jié)我們就來在工程中擴展這部分內(nèi)容,實際操作的效果就是我們可以在工程上通過鼠標右鍵的方式,喚出添加ORM代碼塊的窗體,通過選擇庫表的方式,使用 freemarker 自動生成代碼。
      • 在生成的代碼塊中需要完成對所需要包的引入,同時會使用到 lombok 注解的方式替代PO對象中的get、set方法,以減少代碼量邏輯的創(chuàng)建。

      三、案例開發(fā)

      1. 工程結構

      guide-idea-plugin-orm
      ├── .gradle
      └── src
          ├── main
          │   └── java
          │    └── cn.bugstack.guide.idea.plugin 
          │        ├── action
          │        │  └── CodeGenerateAction.java      
          │        ├── domain
          │        │  ├── model.vo 
          │        │  │  ├── CodeGenContextVO.java       
          │        │  │  └── ORMConfigVO.java       
          │        │  └── service   
          │        │    ├── impl     
          │        │    │  └── ProjectGeneratorImpl.java  
          │        │    ├── AbstractProjectGenerator.java     
          │        │    ├── GeneratorConfig.java      
          │        │    └── IProjectGenerator.java      
          │        ├── infrastructure
          │        │  ├── data    
          │        │  │  ├── DataSetting.java       
          │        │  │  └── DataState.java      
          │        │  ├── po    
          │        │  │  ├── Base.java    
          │        │  │  ├── Column.java 
          │        │  │  ├── Dao.java 
          │        │  │  ├── Field.java 
          │        │  │  ├── Model.java     
          │        │  │  └── Table.java       
          │        │  └── utils 
          │        │   ├── DBHelper.java     
          │        │   └── JavaType.java      
          │        ├── module  
          │        │  └── FileChooserComponent.java         
          │        └── ui
          │           ├── ORMSettingsUI.java  
          │           └── ORMSettingsUI.form
          ├── resources
          │   ├── META-INF
          │   │   └── plugin.xml 
          │   └── template
          │       ├── dao.ftl
          │       ├── mapper.ftl
          │       └── model.ftl
          ├── build.gradle  
          └── gradle.properties

      源碼獲取:#公眾號:bugstack蟲洞棧 回復:idea 即可下載全部 IDEA 插件開發(fā)源碼

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

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

      2. 拖拽Swing面板

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

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

      3. 配置鼠標右鍵彈窗

      首先我們需要創(chuàng)建一個 Action 實現(xiàn)類,通過 New -> Plugin DevKit -> Action

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

      /**
       * @author: 小傅哥,微信:fustack
       * @github: https://github.com/fuzhengwei
       * @Copyright: 公眾號:bugstack蟲洞棧 | 博客:https:// - 沉淀、分享、成長,讓自己和他人都能有所收獲!
       */

      public class CodeGenerateAction extends AnAction {

          private IProjectGenerator projectGenerator = new ProjectGeneratorImpl();

          @Override
          public void actionPerformed(AnActionEvent e) {
              Project project = e.getRequiredData(CommonDataKeys.PROJECT);
              ShowSettingsUtil.getInstance().editConfigurable(project, new ORMSettingsUI(project, projectGenerator));
          }

      }
      • 這是一個右鍵菜單的入口,通過這個入口才能去打開我們自己的UI窗體,這個UI窗體就是我們上面拖拽出來的配置面板,ORMSettingsUI
      • 接下來我們還需要把這個 Action 配置到 plugin.xml 文件中,才能被右鍵菜單創(chuàng)建出來。開發(fā)代碼的時候也是這樣一個流程,你總要從一個點開始,有了抓手才好抓下去

      plugin.xml 配置

      <actions>
          <!-- Add your actions here -->
          <action id="CodeGenerateAction" class="cn.bugstack.guide.idea.plugin.action.CodeGenerateAction"
                  text="ORMCodeGenerate - 小傅哥" description="Code Generate ORM" icon="/icons/logo.png">

              <add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
          </action>
      </actions>
      ea-plugin>
      • 把我們的 Action 實現(xiàn)類配置到 xml 中,同時你還要配置它應該出現(xiàn)的位置,比如你需要把這個菜單添加到工程創(chuàng)建中 ProjectViewPopupMenu 以及位置信息 anchor="last"
      • 另外為了讓插件看上去更加高大上還美觀適合吹牛,那么還需要配置 icon,這個位置配置一個16*16的圖片,圖片可以從 iconfont 進行下載。

      4. 給窗體添加功能

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

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

      4.1 選擇框事件

      // 選擇PO生成目錄
      this.poButton.addActionListener(e -> {
          FileChooserComponent component = FileChooserComponent.getInstance(project);
          VirtualFile baseDir = project.getBaseDir();
          VirtualFile virtualFile = component.showFolderSelectionDialog("選擇PO生成目錄", baseDir, baseDir);
          if (null != virtualFile) {
              ORMSettingsUI.this.poPath.setText(virtualFile.getPath());
          }
      });
      • 還記得我們提到的拖拽Swing面板嗎,那么這個添加事件的步驟就是給你的 PO 目錄添加一個事件,允許我們可以自己選擇出要把對應PO的代碼生成到哪個目錄結構下。
      • 關于dao、xml都是類似操作,這里就不在演示了。

      4.2 數(shù)據(jù)表事件

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

      4.3 組裝生成代碼上下文

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

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

      5. 代碼生成領域服務

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

      ProjectGeneratorImpl 生成代碼

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

      四、測試驗證

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

      1. 鼠標右鍵,選擇菜單

      2. 配置頁面,配置信息

      3. 自動創(chuàng)建,生成代碼

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

      五、總結

      • 本章節(jié)小傅哥帶著你又在 IDEA DDD 插件生成工程的結構下,又完善了一步生成ORM代碼,當然你也可以在創(chuàng)建工程向?qū)е刑砑由蒓RM代碼的步驟。而在工程下創(chuàng)建ORM的方式可以當做是對腳手架工程的補充,滿足不同場景下的需求。
      • 此外在 IDEA 插件開發(fā)的系列內(nèi)容中我們是不斷的嘗試使用新的方式完善不同的功能點,如果你需要開發(fā)一個完整的插件那么可以結合這些功能一起來開發(fā)你的需求。
      • 插件開發(fā)中還是有很多的內(nèi)容需要了解和學習的,同時也要注意一些代碼實現(xiàn)細節(jié),例如我們本章節(jié)中的數(shù)據(jù)保存是在一個什么維度,是IDEA開發(fā)工具維度,還是在IDEA中的工程維度,這些是有區(qū)別。比如你的不同工程,是不需要保存同一份配置的

      六、系列推薦

        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多