java代码自动生成的插件

大多数程序员讨厌的一件事就是编写样板代码。 无休止的时间花费在设置实体类和配置数据库连接上。 为了避免这种情况,您可以让Speedment Open Source之类的程序为您生成所有这些代码。 这样可以很容易地以最少的人工就可以启动和运行数据库项目,但是当将大部分代码移交给机器时,如何保持对编写代码的控制?

假设您有一个数据库,该数据库的表“ user”具有“ gender”列,并且您希望将其实现为java中的枚举。 如果运行Speedment并将其用于生成代码,则“性别”字段将表示为字符串。 这样做的原因是,没有任何内置映射器可在数据库ENUM和自定义Java类之间进行转换。 这是您可能会觉得发电机正在为您控制的情况之一。 好吧,不用担心,因为从2.3 Hamilton版本开始 ,您可以通过为Speedment创建自己的插件来获得相同的控件!

本文的目标

在此示例中,我们有一个数据库架构,其中包含一个名为“ Person”的表。 一个人有一个ID,一个名字和一个性别。 性别被声明为带有三个可能值的ENUM:“男性”,“女性”和“其他”。 如果我们使用Speedment中的默认设置来生成此类,Speedment将把ENUM视为字符串。 但是有一些问题。 例如,如果要将新人员保留在数据库中,则没有什么可以阻止您在插入时将性别拼写错误并获得异常。 取而代之的是,我们想使用指定的替代方法将java枚举定义为常量。 是什么使生成的代码更安全且更易于使用。

我们可以使用Speedment插件来实现这一目标!

创建插件项目

要对Speedment平台进行任何自定义修改,我们将需要定义一个插件。 插件是一款软件,可以从pom.xml文件插入Speedment运行时。 该插件位于其自己的Maven项目中,并且可以在项目之间共享。

首先创建一个新的Maven项目,然后将Speedment声明为依赖项。 在此项目中,您不需要speedment-maven-plugin。

<dependency><groupId>com.speedment</groupId><artifactId>speedment</artifactId><version>${speedment.version}</version>
</dependency>

插件系统围绕两个界面旋转。 Component和ComponentConstructor。 组件是可插入的软件,可以在Speedment生命周期中执行。 每个组件都具有允许执行的多个阶段。 这些是“初始化”,“加载”,“解析”和“开始”。

ComponentConstructor是一种轻型类型,具有默认构造函数和用于初始化自定义组件新实例的方法。 maven插件使用它来设置新代码。

这是我们的两种实现的外观:

CustomMappingComponent.java

public final class CustomMappingComponent
extends AbstractComponent {CustomMappingComponent(Speedment speedment) {super(speedment);}@Overridepublic void onResolve() {// Resolve logic here...}@Overridepublic Class<CustomMappingComponent> getComponentClass() {return CustomMappingComponent.class;}@Overridepublic Software asSoftware() {return AbstractSoftware.with("Custom Mapping Component", "1.0", APACHE_2);}@Overridepublic Component defaultCopy(Speedment speedment) {return new CustomMappingComponent(speedment);}
}

CustomMappingComponentInstaller.java

public final class CustomMappingComponentInstaller
implements ComponentConstructor<CustomMappingComponent> {@Overridepublic Component create(Speedment speedment) {return new CustomMappingComponent(speedment);}
}

现在,我们有了一个准插件,可以将其添加到Speedment项目中。 下一步是定义在字符串和性别之间映射的逻辑。 为此,首先我们需要性别枚举。

Gender.java

public enum Gender {MALE   ("Male"), FEMALE ("Female"),OTHER  ("Other");private final String databaseName;Gender(String databaseName) {this.databaseName = databaseName;}public String getDatabaseName() {return databaseName;}
}

如果将枚举值以大写形式存储在数据库中,则该类可能会短得多,因为您可以简单地使用Enum.name()方法来获取数据库名称,但是如果您希望灵活地命名,则此方法更好常数。

现在到最后一块。 我们需要在Speedment中声明一个实现TypeMapper接口的类型。 类型映射器确实很简单。 它包含两种用于映射到数据库类型或从数据库类型映射的方法,以及用于检索两种类型的Java类的方法。

StringToGenderMapper.java

public final class StringToGenderMapper implements TypeMapper<String, Gender> {@Overridepublic Class<Gender> getJavaType() {return Gender.class;}@Overridepublic Class<String> getDatabaseType() {return String.class;}@Overridepublic Gender toJavaType(String value) {if (value == null) {return null;} else {return Stream.of(Gender.values()).filter(g -> g.getDatabaseName().equals(value)).findAny().orElseThrow(() -> new UnsupportedOperationException("Unknown gender '" + value + "'."));}}@Overridepublic String toDatabaseType(Gender value) {if (value == null) return null;else return value.getDatabaseName();}@Overridepublic boolean isIdentityMapper() {return false;}
}

此新的映射器也需要安装在Speedment平台中。 我们可以通过修改onResolve()方法从前面创建的组件中执行此操作:

CustomMappingComponent.java

@Override
public void onResolve() {// Resolve logic here...getSpeedment().getTypeMapperComponent().install(StringToGenderMapper::new);
}

我们的新插件现已完成! 构建项目,您就可以开始了!

使用插件

要在项目中使用插件,只需修改该项目的pom.xml文件。 打开一个现有的Speedment项目并找到pom.xml文件。 在其中,您应该能够找到speedment-maven-plugin。 为了使您自己的插件可供Maven插件访问,您需要将其作为依赖项添加到<plugin> -tag内,并将ComponentInstaller添加到配置中。 这是它的外观示例:

pom.xml

<plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Our plugin project --><dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies><configuration><components><!-- Path to the component installer --><component implementation="
com.github.pyknic.salesinfo.plugin.CustomMappingComponentInstaller" /></components></configuration>
</plugin>

您还需要将项目添加为运行时依赖项,因为必须可以从生成的代码访问新的Gender枚举。

<dependencies>...<dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency>...
</dependencies>

尝试一下

而已! 插件已安装! 如果要将特定的列映射到性别而不是字符串,则可以进入用户界面,导航到“项目树”中的特定列,然后在下拉列表中选择新的类型映射器。

如果要查看加载到平台中的所有组件和/或类型映射器的列表,还可以在UI中转到“关于”→“组件...”。 在那里您应该看到新的组件。

摘要

在本文中,您学习了如何为Speedment创建自定义插件,该插件将新的Type Mapper从String集成到Gender枚举。 您还了解了如何查看将哪些组件加载到平台中以及如何选择要用于每一列的类型映射器。

PS:如果您为Speedment项目创建了一些很棒的新映射器,请考虑在我们的Gitter聊天中与社区共享它们!

翻译自: https://www.javacodegeeks.com/2016/04/generate-customized-java-8-code-plugins.html

java代码自动生成的插件

java代码自动生成的插件_如何使用插件生成自定义Java 8代码相关推荐

  1. java生成pdf图表_开发员指南:使用Java图表转换为PDF/JPG等图像

    Aspose.Cells for JavaExcel电子表格处理API,它允许Java开发人员在自己的Java应用程序中嵌入可读取.写入和操作Excel电子表格的能力,而无需依赖Microsoft E ...

  2. ai包装插件_找AI插件很费劲,一次给你66款AI插件合集!每一款都是设计师常用...

    作为设计师我们都知道,PS插件很常见也很多,但AI的却不好找,但其实Adobe Illustrator软件除了能够绘制高精度的矢量图之外,也可以为线稿提供较高的精度和控制,适合生产任何小型设计到大型的 ...

  3. java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  4. java内存 phd文件抓取_您可以从IBM PHD Java堆转储中提取字符串的值吗?

    我有一个来自IBM jvm的PHD格式堆转储,我希望检查一些字符串的值.使用Sun JVM的二进制hprof转储,这是可能的,但是我无法从IBM转储中恢复此信息. 我试过了: >具有IBM DT ...

  5. lede 插件_【PS插件】神器在手不怕图片模糊

    点击蓝字 关注我们 PS插件是什么??? 插件是一种遵循一定规范的应用程序接口编写出来的程序.很多软件都有插件,ps软件插件有无数种,它可以通过不同的方式改变象素数据,以达到对图象进行抽象.艺术化的特 ...

  6. 查看文章影响因子的插件_这个浏览器插件可以智能查询SCI论文被引情况

    在查询一篇SCI文章时,我们有时候需要知道他的被引情况,看看有哪些文章引用了它,有时也需要知道施引文献在其文章中是如何描述被引文献的. 查询SCI论文被引情况可以在Web of Science中实现, ...

  7. java中自动刷新的语句_页面自动刷新代码大全

    页面自动刷新代码大全,基本上所有要求自动刷新页面的代码都有,大家可以自由发挥做出完美的页面. 1) 10表示间隔10秒刷新一次 2) window.location.reload(true); 如果是 ...

  8. butterknife 插件_知道这个插件,能让你的项目里少写1000行代码

    在项目开发中,我们时常遇到需要创建实体类,一般的做法是: 先写成员变量, 再提供get().set()相对应的方法,然后看是否需要提供toString等方法.这样一来会发现每写一个实体类的话就会有很多 ...

  9. forge插件_使用Forge插件在现有Java EE项目上启用Arquillian

    forge插件 技术提示#34解释了如何创建可测试的Java EE 7应用程序. 如果要启动新的应用程序,这将很有用. 但是,如果您已经有一个应用程序并启用Arquillian怎么办? 这就是Forg ...

最新文章

  1. java DOS 命令行代码
  2. MySQL中INSERT IGNORE INTO和REPLACE INTO的使用
  3. Vue如何引入ElementUI进行使用
  4. 全球及中国太阳能光热发电市场重点项目规划及发展格局展望报告2021-2027年
  5. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程...
  6. 图文解说:Nginx+tomcat配置集群负载均衡
  7. 2021安徽省高考成绩怎么查询系统,2021年安徽省教育招生考试院成绩查询登录入口...
  8. 阅读《平庸的世界》后感觉 (两)
  9. c++ 游戏_C/C++编程笔记:C语言实现连连看游戏,项目源码分享
  10. .NET中的异步编程 - 动机和单元测试
  11. Nutanix 以现代化 IT 基础架构推动医共体建设
  12. 网络安全等级保护通用解决方案参考模板
  13. nicelabel java_EditPlus
  14. BP神经网络介绍及算法实现
  15. SublimeText-win10光标跟随问题
  16. MYSQL-JDBC数据库实战-宠物商店
  17. 关于Kali使用aireplay-ng时出现设备繁忙的解决(转自 zpblog.cn)
  18. kotlin 开发桌面应用_2020-21年Kotlin应用开发十大公司
  19. talentq测试题库rb_talentq测试题目拐
  20. 软件工程与计算:第3章需求分析 测试

热门文章

  1. YBTOJ:向量问题(线段树分治、凸包)
  2. YbtOJ-序列计数【组合数学,莫队】
  3. jzoj3084-超级变变变【数学】
  4. jzoj1161-机器人M号【欧拉函数,dp】
  5. 【树链剖分】洛谷树(P3401)
  6. GDKOI2021总结
  7. 【并查集】团伙(luogu 1892)
  8. 【高精】Oliver的成绩(jzoj 2008)
  9. 25、jdbc操作数据库(2)
  10. mybatis源码阅读(四):mapper(dao)实例化