背景
還是爲了開發腳手架,打算新增一個根據表字段生成程式碼的demo,後續再去結合我們專案用的資料庫生成框架,可以更高效的開發,就考慮使用idea的databasetool外掛,來獲取表資訊
實踐
要呼叫databasetool外掛,首先需要將對應的idea型別改為IU IU是無限制版,IC是社羣版,社羣版是不支援databasetool外掛的
intellij { version.set("2022.1.4") type.set("IU") plugins.set(listOf("com.intellij.java","DatabaseTools","org.jetbrains.idea.maven")) }
完成之後,在plugin.xml檔案中引入依賴,這樣子就能使用databasetool了
<id>com.example.SaaSProjectScaffolding</id> <depends>com.intellij.modules.platform</depends> <depends>com.intellij.modules.lang</depends> <depends>com.intellij.modules.java</depends> <depends>com.intellij.database</depends>
接下來就是最普通的窗體構建流程了,我們是考慮做在右鍵窗體上
所以需要定義action,在右鍵窗體的第一個新增一個新的選項
<action id="generate-action" class="com.example.saasprojectscaffolding.action.MybatisGeneratorMainAction" text="Code-Generator" description="generator idea plugin"> <add-to-group group-id="DatabaseViewPopupMenu" anchor="first"/> </action>
繼承AnAction
public class MybatisGeneratorMainAction extends AnAction { /** * 點選後開啟外掛主頁面 * * @param e */ @Override public void actionPerformed(@NotNull AnActionEvent e) { Project project = e.getProject(); PsiElement[] tableElements = e.getData(LangDataKeys.PSI_ELEMENT_ARRAY); if (tableElements == null) { return; } List<ColGenerateDTO> colGenerateDTOList = new ArrayList<>(); List<DbTable> dbTables = Stream.of(tableElements).filter(t -> t instanceof DbTable).map(t -> (DbTable) t).collect(Collectors.toList()); for (DbTable dbTable : dbTables) { DasTable dasObject = dbTable.getDasObject(); JBIterable<? extends DasColumn> columns = DasUtil.getColumns(dasObject); JBIterable<? extends DasIndex> indices = DasUtil.getIndices(dasObject); int i = 1; for (DasColumn column : columns) { // 獲取到表的每行結構的資訊 } } ClassGenerateDialogWrapper classGenerateDialogWrapper = new ClassGenerateDialogWrapper(project,colGenerateDTOList); classGenerateDialogWrapper.show(); }
最後的效果就是這樣,獲取到對應的欄位名,欄位描述,欄位型別等
總結
要引入databaseTool外掛,主要的就是要將對應的idea型別改為IU無限制版,然後在引入對應的依賴,在獲取psi元素的時候,收集所有DbTable物件,最後獲取對應的需要的欄位資料即可