当前位置: 首页 > 科技观察

IDEA项目右键菜单自动生成ORM代码

时间:2023-03-17 13:42:45 科技观察

转载本文请联系bugstack公众号。1.前言可以用,灵活运用!一件东西有好几套,用来做宣传的。拿到成绩就得跑,兄弟们以后再建!几年前,大家还不是这样。那时候还有很多可以创新的东西。乱世英雄,总能修炼一个方向,做出好产品。功能、框架服务、技术组件等等。不过后来这样的案例好像开始减少了,取而代之的是重复、刻版、抄袭,换了新皮、新风格、新名字。有时候一个公司或者一个组织就像一个家,只是家里的东西一般都是坏了要修,坏了还可以换。但是没有人有卫生间有马桶,厨房有马桶,客厅有马桶,卧室有马桶。是的,虽然你的新马桶可以自动喷水。因此,在构建好的产品功能时,尽量借鉴那些已经很优秀的产品,比如IDEA、GitHub、Mysql等。IDEA提供了满足用户扩展功能的插件开发,而不是你说我不会的东西。没有,你自己做。共建会让这件事变得更好!2.需求目的在上一章中,我们扩展了创建项目向导,增加了我们创建DDD项目脚手架所需要的步骤,最终提供了一个DDD开发框架。那么,在这个DDD项目开发框架中,还缺少根据数据库表信息自动生成相应的PO、DAO、Mapper文件的功能。那么在本章中,我们将在项目中展开这部分内容。实际运行效果是我们可以在项目上用鼠标右键调出添加ORM代码块的窗体。通过选择库表,使用freemarker自动生成代码。在生成的代码块中,需要导入所需的包,并使用lombok注解替代PO对象中的get和set方法,减少代码逻辑的创建。三、案例开发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│├──基础设施││├──数据││├──DataSetting。java│││└──DataState.java││├──po││├──Base.java││├──Column.java│││├──Dao.java│││├──字段。java│││├──Model.java││└──Table.java│└──utils││├──DBHelper.java│└──JavaType.java│├──模块│└└──FileChooserComponent。java│└──ui│├──ORMSettingsUI.java│└──ORMSettingsUI.form├──resources│├──META-INF││└──plugin.xml│└────template│├──dao.ftl│├──mapper.ftl│└──model.ftl├──build.gradle└──gradle.properties在这个IDEA插件项目中,主要分为5个区域:action:用来提供一个菜单栏。这个菜单的位置是在plugin.xml中配置的,我们配置为项目鼠标右键出现的列表。这样就更方便我们选择一个项目,把生成的代码片段domain:域服务层添加到这个项目下。其实直接写一个Service包就可以了,不过最近作者小付比较喜欢用DDD和结构的思想来创建代码来实现功能逻辑。infrastructure:基础层,提供项目下的数据存储。每个项目右键都有自己的配置存储默认信息,方便下次打开时阅读这部分内容。同时,这一层还提供了处理数据库操作的类,因为我们需要从数据库中读取表信息、字段、注释,来创建PO、DAO、Mappers。module:模块层,这里提供了一个选择文件路径的组件,可以让我们在项目上鼠标右键后出现的窗口中点击模块选择相应的位置路径生成代码。ui:提供配置面板,也就是我们在代码项目上右击弹出的面板。该面板用于配置后生成ORM代码。2.拖拽Swing面板ORMSettingsUI:我们先来创建创建代码配置的面板,有了屏幕,就很容易进入了。面板包括生成PO、DAO、XML的代码路径,以及配置数据库和选择表的内容。操作过程就是当你配置好这些基本信息后,你可以选择查询表的名称,选择你要为哪些表生成相应的ORM代码。3、配置鼠标右键弹窗首先我们需要创建一个Action实现类,通过New->PluginDevKit->Actioncn.bugstack.guide.idea.plugin.action.CodeGenerateAction/***@author:付哥微信:fustack*@github:https://github.com/fuzhengwei*@Copyright:公众号:bugstack虫洞栈|博客:https://bugstack.cn-沉淀,分享,成长,让自己和其他人有收获!*/publicclassCodeGenerateActionextendsAnAction{privateIProjectGeneratorprojectGenerator=newProjectGeneratorImpl();@OverridepublicvoidactionPerformed(AnActionEvente){Projectproject=e.getRequiredData(CommonDataKeys.PROJECT);ShowSettingsUtil.getInstance().editConfigurable(project,newORMSettingsUI(project,projectGenerator));}}这是一个右键菜单的入口,通过它我们可以打开自己的UI窗体。这个UI窗体就是我们上面拖出来的配置面板。ORMSettingsUI接下来我们需要将plugin.xml文件中的这个Action配置为右键菜单Created。这与开发代码时的过程相同。总是要从一点做起,把握了才能把握。plugin.xml配置ea-plugin>在xml中配置我们的Action实现类,并且还需要配置它应该出现的位置,比如你需要把这个菜单添加到项目ProjectViewPopupMenu中,位置信息anchor="last"正在创建。另外,为了让插件看起来更高大上、更漂亮,还需要配置一个图标。这个位置配置了一张16*16的图片,可以从iconfont下载。4、给表格添加功能这一步,其实就是给表格注入灵魂,让表格活起来。输入框添加内容,按钮添加事件,确认按钮添加生成创建ORM代码块的上下文。文章的描述尽量偏向于核心代码的解释。详情请参考源码。接下来的部分内容会在ORMSettingsUI类中反复搓揉,直到所有功能完成。4.1选择框事件//选择PO生成目录this.poButton.addActionListener(e->{FileChooserComponentcomponent=FileChooserComponent.getInstance(project);VirtualFilebaseDir=project.getBaseDir();VirtualFilevirtualFile=component.showFolderSelectionDialog("选择PO生成目录",baseDir,baseDir);if(null!=virtualFile){ORMSettingsUI.this.poPath.setText(virtualFile.getPath());}});还记得我们提到的拖拽式Swing面板吗,那么这一步添加事件就是在你的PO目录下添加一个事件,让我们选择用哪种目录结构来生成PO对应的代码。关于dao和xml,都是类似的操作,这里就不演示了。4.2数据表事件this.selectButton.addActionListener(e->{try{DBHelperdbHelper=newDBHelper(this.host.getText(),Integer.parseInt(this.port.getText()),this.user.getText(),this.password.getText(),this.database.getText());ListtableList=dbHelper.getAllTableName(this.database.getText());String[]title={"","表名"};Object[][]data=newObject[tableList.size()][2];for(inti=0;itables=newArrayList<>();SettableNames=config.getTableNames();for(StringtableName:tableNames){tables.add(dbHelper.getTable(tableName));}codeGenContext.setTables(tables);//生成代码projectGenerator.generation(project,codeGenContext);}apply中的核心代码主要是利用DBHelper数据操作工具获取对应库下的链接信息,并同时选择编号表创建生成代码类的参数,如;类名、字段名、注解名等。最后是调用生成代码的服务,projectGenerator.generation(project,codeGenContext);这部分是在我们的域服务域中实现的。5.代码生成域服务用于创建PO、DAO、Mapper代码块的代码主要在这里实现。核心是提供一个抽象类和对应的实现类。因为需要freemarker来处理代码生成,所以在抽象类中进行了封装,省去了实现类中需要关心的这部分逻辑。ProjectGeneratorImpl生成代码@OverrideprotectedvoidgenerateORM(Projectproject,CodeGenContextVOcodeGenContext){List

tables=codeGenContext.getTables();for(Tabletable:tables){Listcolumns=table.getColumns();Listfields=newArrayList<>();for(Columncolumn:columns){Fieldfield=newField(column.getComment(),JavaType.convertType(column.getType()),column.getName());field.setId(column.isId());fields.add(field);}//生成POModelmodel=newModel(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);//生成DAODaodao=newDao(table.getComment(),codeGenContext.getDaoPackage()+"I"+CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,table.getName())+"Dao",model);writeFile(项目,codeGenContext.getDaoPackage(),dao.getSimpleName()+".java","domain/orm/dao.ftl",dao);//生成MapperwriteFile(project,codeGenContext.getMapperDir(),dao.getModel().getSimpleName()+"Mapper.xml","domain/orm/mapper.ftl",dao);}}创建代码的过程比较简单。通过循环提取的表信息映射到对应的类、属性和注释,然后使用resources下的ftl文件创建对应的类和xml配置文件。如果你还需要生成代码片段或者创建调用一些常用的组件,也可以通过这种方式实现。4.测试验证点击Plugin启动IDEA插件,然后右键点击项目如下:1.鼠标右键,选择菜单2.配置页面,配置信息3.自动创建,生成代码,选择代码block就会这样创建,是不是很方便,而且可以满足你随时添加新的库表代码,减少手动CRUD操作。5.小结本章付哥带大家在IDEADDD插件生成工程的结构下又一步生成了ORM代码。当然你也可以在项目创建向导中加入生成ORM代码的步骤。项目下创建ORM的方法可以看作是对脚手架项目的补充,以满足不同场景的需求。另外,在IDEA插件开发系列中,我们也在不断尝试用新的方法来完善不同的功能点。如果您需要开发一个完整的插件,您可以结合这些功能来开发您的需求。插件开发中需要了解和学习的内容还是很多的。同时,需要注意一些代码实现细节。比如本章的数据保存在什么维度?是IDEA开发工具维度还是IDEA中的项目维度?,这些是有区别的。比如不同的项目不需要保存相同的配置