如何使用插件生成自定义Java 8代码

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

尝试一下

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

Select_TypeMapper

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

组件插件

摘要

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下拉被下面列表遮住

下拉被下面列表遮住在上面布局添加 style"overflow: visible;z-index: 100"

jmeter之-用Firefox录制https协议证书问题

录制脚本的时候&#xff0c;比如录制https协议的百度网站 https://www.baidu.com &#xff0c;所有录制设置均正常&#xff0c;但是在jmeter录制控制器里面就是没有任何录制的请求。 这个时候提示说证书不对 1、打开火狐选项——高级——证书 也可以在浏览器输入about:preferen…

七点人脸姿态估计_Github开源库简单配置即可上线的3D人脸检测工具箱

【导读】人脸识别/检测是计算机视觉方向的一个基础的任务。小编在Github中找到了一个轻松配置即可上线使用的3D人脸检测工具箱&#xff0c;该工具箱包括多种特性&#xff1a;2D稀疏点、稠密点、3D、深度图、PNCC、UV纹理展开、姿态估计、序列化等等。对人脸识别/检测相关工作感…

SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

二、完整的锁兼容性矩阵(见下图) 对上图的是代码说明&#xff1a;见下图。 三、下表列出了数据库引擎可以锁定的资源。 名称 资源 缩写 编码 呈现锁定时&#xff0c;描述该资源的方式 说明 数据行 RID RID 9 文件编号&#xff1a;分页编号&#xff1a;Slot编号 用于…

angularjs1访问子组件_Vue学习笔记之组件的应用

Vue组件的应用&#xff1a;1、基础使用&#xff1a;第一步创建组件&#xff0c;第二步注册组件&#xff0c;第三步使用组件。在注册组件是需要用到template的属性。全局组件和局部组件组件的嵌套(父子组件)&#xff1a;注意先后顺序&#xff0c;先声明&#xff0c;后面才能用2、…

Qt 程序打包发布总结

1. 概述 当我们用QT写好了一个软件&#xff0c;要把你的程序分享出去的时候&#xff0c;不可能把编译的目录拷贝给别人去运行。编译好的程序应该是一个主程序&#xff0c;加一些资源文件&#xff0c;再加一些动态链接库&#xff0c;高大上一些的还可以做一个安装文件。 QT开发…

FTP服务器原理

21.1 FTP服务器原理使用明码传输方式&#xff0c;且有相当多的安全危机历史。因此一般使用功能较少的vsftpd这个软件。21.1.1 FTP功能简介有以下功能文档传输与管理不同等级的用户身份&#xff1a;user&#xff0c;guest&#xff0c;anonymous命令记录与登录文件记录限制用户活…

java对两个表进行排序_Excel工作簿中多个worksheet工作表,如何对工作表进行排序?...

案例&#xff1a;如下图所示&#xff0c;一个Excel文件中&#xff0c;包含了多个工作表&#xff0c;有1-雷哥office&#xff0c;2-雷哥office......但是&#xff0c;我们发现工作表的顺序是比较混乱的&#xff0c;为了方便管理&#xff0c;如何对工作表进行排序呢&#xff1f;方…

华为手机打字声音怎么开启_华为手机这5个超实用小功能,记得要开启,谁用都说好...

华为手机这5个超实用小功能&#xff0c;记得要开启&#xff0c;谁用都说好用过华为手机的用户应该都知道&#xff0c;emui优化的很到位&#xff0c;同时也给用户非常好的体验感&#xff0c;随着系统的优化&#xff0c;功能也是越来越完善&#xff0c;不仅越来越好用&#xff0c…

qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题

项目是基于Qt的图形视图框架编写的&#xff0c;现有个需求是要在图形中加入自定义的背景图片。心想不就是个背景图片吗&#xff1f;只要重写drawBackground函数我想怎么画就怎么画啊。于是立马从QGraphicsScene类中派生了一个CScene类&#xff0c;并重写了虚函数drawBackground…

JavaScript | JSON基本格式

————————————————————————————————————————————————————————— JSON 语法 "use strict"; // 简单值 "hello,world" // 必须使用双引号// 对象 {"name": "hugh","age&…

jmeter 生成计数器_使用密码摘要生成器扩展JMeter

jmeter 生成计数器最近&#xff0c;我不得不处理一个具有50,000条用户记录的OpenLDAP实例&#xff0c;并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是&#xff0c;在我的情况下&#xff0c;OpenLDAP配置为不接受任何明文密码。 因此&#xff0c;我无法使用通过JMet…

c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

查找不重复字符的最长子字符串&#xff08;编程面试中常见题-用8种编程语言来回答&#xff09;给定一个字符串str&#xff0c;找到不重复字符的最长子字符串。比如我们有 “ABDEFGABEF”, 最长的字符串是 “BDEFGA” 和 “DEFGAB”, 长度为6.再如 “BBBB” 最长字符串是 “B”,…

mysql 触发器 本表_MySQL触发器处理本表数据

关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数据。在MySQL中写触发器操作关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数…

官方野生蝇群流口水分数

官方是什么&#xff1f; 标题太小&#xff0c;但有用的贡献。 Wildfly Swarm允许我们创建相当小的自包含应用程序&#xff0c;包括我们从Wildfly Application Server中需要的应用程序。 在这篇文章中&#xff0c;我们将研究与Wildfly Swarm合作使用的Drools分数 。 该部分背后的…

MySQL 高水位update_Oracle delete 高水位线处理问题

最近遇到oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete oracle 高水位没有下降的最近遇到Oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete…

jasperreports_JasperReports JSF插件用例–简单列表报告

jasperreports这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xf…

2个菜鸟Java常量和枚举陷阱

在对Java和Groovy代码进行的各种代码审查中&#xff0c;我经常看到魔术数字和其他随机字符串在整个代码库中乱七八糟。 例如&#xff0c;魔术数字是下面的代码&#xff08;Groovy&#xff09;中的4.2&#xff1a; if (swashbuckle > 4.2) {... }4.2是什么意思&#xff1f;…

mysql cluster 外键_Mysql外键约束

Mysql集群创建外键&#xff0c;分为四种约束&#xff1a;no action&#xff0c;restrict&#xff0c;cascade&#xff0c;set null。如果表A的主关键字是表B中的字段&#xff0c;则该字段称为B的外键&#xff0c;表A称为主表&#xff0c;表B称为从表。外键是用来实现参照完整性…

Map类集合遍历

转载于:https://www.cnblogs.com/Neil223/p/7275035.html