大多数程序员讨厌的一件事就是编写样板代码。 无休止的时间花费在设置实体类和配置数据库连接上。 为了避免这种情况,您可以让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 8代码相关推荐

  1. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

  2. cmd 根据xsd文件生成webservice java客户端代码

    根据xsd 转换成java 对象, jdk1.7 自带 xjc 命令,可以根据xjc 命令直接转换成 java 对象 命令格式:xjc -d dir -p packgeName -verbose xx ...

  3. apachejmeter_java源码_自定义编写jmeter的Java测试代码

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...

  4. jmeter之java代码性能测试_松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用...

    原标题:松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用 我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定 ...

  5. 使用Eclipse UML 插件 Papyrus由Java代码反向生成类图

    使用Eclipse UML 插件 Papyrus由Java代码反向生成类图 为了补充上一篇博文(Java基础(复习三) -- 类图例子)类图的例子寻找一个可以生成类图的工具,搜索了若干文章后决定使用P ...

  6. kettle中java组件_kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  7. mybaties插件生成代码

    指定插件运行什么xml,关于如何用idea创建一个maven项目,可以看我以前写的博客 <?xml version="1.0" encoding="UTF-8&qu ...

  8. html生成自定义表格,自定义js的表格插件

    场景:指定元素,生成自定义表格. 目的:了解js的插件开发. html代码: 自定义表格插件 var test = new MyTable({ elid:"mytable",//定 ...

  9. java 生成token代码_java token生成和校验的实例代码

    现在越来越多的登录方式都用到了token作为用户登录令牌,所以实现了一个token生成和校验案例. 缺点:该实现方式token是存储在内存中,不适合分布式项目,如需改为分布式项目部署,可把token存 ...

最新文章

  1. C++中的友元函数friend
  2. 追查连接mysql的客户端
  3. Java Comparator排序
  4. phpstorm调试php配置,PhpStorm配置Xdebug调试WordPress
  5. 杭州 |《PMCAFF产品经理第一课》阿里国际CRM、LinkedIn、丁香园、网易邮箱等一线大咖私房干货免费奉送!...
  6. python入门之函数调用第一关_零基础学习 Python 之与函数的初次相见
  7. 图像的全局特征--LBP特征
  8. LoadRunner监控SQLServer
  9. 无线传感器网络中竞争性MAC协议
  10. 微信小程序原生自定义弹窗
  11. LeetCode 246. 中心对称数
  12. 新版标准日本语中级_第二十六课
  13. 魔兽世界 - 宏命令
  14. windows10安装更新很慢ndows,Windows 10升级太慢了?这里有俩窍门
  15. Midjourney用户手册中文版详解模型、命令、参数与高级用法
  16. 网络工程师发展及待遇--学习
  17. 在一个app中启动另外一个app的service
  18. Typescript 2+迷你书 :从入门到不放弃
  19. 论文笔记Long_Term_Feature_Bank
  20. background-color覆盖范围

热门文章

  1. ps中对齐,历史记录,图层
  2. python变量的创建过程(内存地址变化)
  3. java速学_5分钟快速入门Java,不看真的可惜了
  4. python中math库_Python的math库、random库实际应用
  5. rabbitmq生产者基于事务实现发送确认
  6. openjdk-7支持版本_长期支持对OpenJDK意味着什么?
  7. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok
  8. hashmap java_Java – HashMap详细说明
  9. Spring Batch –用JavaConfig替换XML作业配置
  10. java8 函数式编程_使用Javaslang进行Java 8中的函数式编程