背景
还是为了开发脚手架,打算新增一个根据表字段生成代码的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对象,最后获取对应的需要的字段数据即可