大多数用Java编写的应用程序都需要某种形式的数据存储。 在小型应用程序中,这通常是通过使用普通SQL查询的原始JDBC连接来实现的。 另一方面,较大的系统通常使用对象关系映射(ORM)框架来处理数据库通信。 这两种方法都有优点和缺点,但两者都倾向于编写许多样板代码,而这些样板代码在每个代码库中看起来大致相同。 在本文中,我将展示另一种使用名为Speedment的开源项目轻松进行数据库通信的方法。
什么是速度?
Speedment是一个开发人员工具,可以从您的SQL元数据生成Java类。 生成的代码处理从建立连接到数据检索和持久性的所有事务。 该系统旨在与Java 8 Stream API完美集成,因此您可以使用lambda来查询数据库,而无需一行SQL。 创建的流在后台进行了优化,以减少网络负载。
设置项目
在本文中,我将编写一个小型应用程序,询问用户的姓名和年龄并将其保存在MySQL数据库中。 首先,我们将定义数据库架构。 打开您的MySQL控制台并输入以下内容:
CREATE DATABASE hellospeedment;
USE hellospeedment;CREATE TABLE IF NOT EXISTS `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(32) NOT NULL,`age` int(5) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
接下来,我们将创建我们的java项目。 启动您最喜欢的IDE,然后从Archetype创建一个新的Maven项目。 原型是可以用于快速定义新的Maven项目的模板项目。 不同的IDE之间的确切用法有所不同。 必须输入以下信息:
资料库 | https://repo1.maven.org/maven2 |
---|---|
群组编号 | 加速 |
ArtifactId | 速度原型MySQL |
版 | 2.3.0 |
类似的原型也可用于PostgreSQL和MariaDB 。
在NetBeans上,原型通常位于从Maven Central Repository索引的默认原型中。 创建项目时,您应该具有以下内容:
启动Speedment UI
现在,已经创建了项目,是时候启动Speedment用户界面了。 这是通过执行speedment:gui-maven目标来完成的。 在NetBeans和IntelliJ IDEA中,可以在IDE中找到可用的Maven目标的列表。 在Netbeans中,可以在“导航器”窗口中找到它(通常位于屏幕的左下角)。 必须选择项目根节点才能显示目标。 在IntelliJ中 ,可以在屏幕最右侧的“ Maven项目”选项卡下找到目标。 您可能需要最大化“项目名称”,“插件”和“ speedment-maven-plugin”节点才能找到它。 据我所知,在Eclipse中 ,您没有目标列表。 相反,您将必须手动定义目标。 Speedment GitHub Wiki上有一个执行此操作的教程。
首次启动用户界面时,它将询问您的电子邮件地址。 之后,您可以连接到数据库。
连接对话框将仅允许您在可以使用装入的JDBC驱动程序连接到的数据库之间进行选择。 例如,如果要使用PostgreSQL数据库,则应将PostgreSQL驱动程序添加到pom.xml文件中speedment-maven-plugin部分的<dependencies> -tag中,然后重新运行UI。
连接到数据库后,将打开主窗口。 在左侧,您可以看到数据库的树状视图。 中间是工作空间,可以在其中配置数据库连接,代码生成和实体命名等内容。 您可以通过选择树中的其他节点来选择要配置项目的哪一部分。
在这种情况下,我们只需按工具栏中的“生成”按钮即可使用默认设置生成项目。 现在,我们可以关闭UI并返回到我们的IDE。
编写申请
现在,当Speedment生成了与HelloSpeedment数据库进行通信所需的所有样板代码时,我们可以集中精力编写实际的应用程序。 让我们打开由Maven原型创建的Main.java文件,并修改main()方法。
public class Main {public static void main(String... params) {Speedment speedment = new HellospeedmentApplication().withPassword("secret").build();Manager<User> users = speedment.managerOf(User.class);}
}
在Speedment中,使用构建器模式定义了应用程序。 可以使用不同的withXXX()方法来完成运行时配置,并且在调用build()方法时平台将最终完成。 在这种情况下,我们使用它来设置MySQL密码。 Speedment永远不会在配置文件中存储诸如数据库密码之类的敏感信息,因此您将必须拥有不受保护的数据库或在运行时设置密码。
我们接下来要做的就是监听用户的输入。 当用户启动程序时,我们应该向他们打招呼,然后询问他们的姓名和年龄。 然后,我们应该将用户信息保留在数据库中。
final Scanner scn = new Scanner(System.in);System.out.print("What is your name? ");
final String name = scn.nextLine();System.out.print("What is your age? ");
final int age = scn.nextInt();try {users.newEmptyEntity().setName(name).setAge(age).persist();
} catch (SpeedmentException ex) {System.out.println("That name was already taken.");
}
如果持久性失败,则抛出SpeedmentException。 例如,如果由于架构中的名称列设置为UNIQUE,已经存在具有该名称的用户,则可能会发生这种情况。
读取持久数据
还记得我刚开始告诉您Speedment如何与Java 8中的Stream API很好地契合吗? 让我们尝试一下! 如果我们多次运行该应用程序,则可以用一些用户填充数据库。 然后,我们可以使用相同的用户管理器查询数据库。
System.out.println(users.stream().filter(User.ID.lessThan(100)).map(User::toJson).collect(joining(",\n ", "[\n ", "\n]"))
);
这将产生如下结果:
[{"id":1,"name":"Adam","age":24},{"id":2,"name":"Bert","age":20},{"id":3,"name":"Carl","age":35},{"id":4,"name":"Dave","age":41},{"id":5,"name":"Eric","age":18}
]
摘要
本文展示了使用Speedment编写数据库应用程序有多么容易。 我们已经使用maven原型创建了一个项目,启动了Speedment UI作为maven目标,建立了与本地数据库的连接并生成了应用程序代码。 这样,我们就可以在没有一行SQL的情况下完成数据持久性和查询!
这就是这个时间了。
PS: Speedment 2.3前几天汉密尔顿刚发布,其中包含大量非常酷的功能,可用于操纵代码生成器以满足您的各种需求。 一探究竟!
翻译自: https://www.javacodegeeks.com/2016/04/java-8-bye-manual-sql-hello-speedment.html