当你接触到一个新的工具时,一开始要克服的最大障碍就是如何让自己先尝试做一个小东西。现在您可能更有信心了解Java8中新的StreamAPI的工作原理,但您可能还没有使用它进行数据库查询操作。为了帮助您开始使用StreamAPI来创建、修改和读取SQL数据库,我将它们放在了这个快速入门教程中。希望它能帮助您改进流式API的使用!后台Speedment是一个开源工具集,可用于生成Java实体并管理我们与数据库的通信。您可以使用图形化工具连接数据库并生成一套完整的ORM框架代码来表示领域模型。但Speedment不仅仅是一个代码生成器,它是一个可以插入到应用程序中的运行时程序,因此可以将您的Java8流代码转换为优化的SQL查询。这也是我将在本文中专门描述的部分。生成代码要开始在Maven项目中使用Speedment,您需要将以下行添加到您的pom.xml文件中。在本例中,我使用的是MySQL,但您也可以选择使用PostgreSQL或MariaDB。针对像Oracle这样的专有数据库可供企业客户使用。pom.xml3.0.1mysqlmysql-connector-java5.1.39com.speedment运行时${speedment.version}pom${db.groupId}${db.artifactId}${db.version}com.speedmentspeedment-maven-plugin${speedment.version}${db.groupId}${db.artifactId}${db.version}现在可以访问了有许多新的Maven存储库可以让您更轻松地使用此工具包。要启动SpeedmentUI,请执行以下命令:mvnspeedment:tool将有一个过程指导您连接到数据库并配置代码生成。最简单的启动方法是先使用默认设置运行。当您按下生成按钮“生成”时,Speedment会分析您的数据库元数据并将实体和实体管理器等类添加到您的项目中。初始化Speedment生成域模型后,设置Speedment就很容易了。创建一个新的Main.java文件并添加以下代码行。您看到的类都是生成的,因此它们是根据数据库模式、表和列名称命名的。Main.javapublicclassMain{publicstaticvoidmain(String...param){finalHaresApplicationapp=newHaresApplicationBuilder().withPassword("password").build();}}上面的代码创建了一个新的应用实体,它使用了构建构造函数模式。构造函数可以设置任何运行时配置细节,例如数据库密码。一旦我们有了一个应用程序实体,我们就可以使用它来访问生成的实体管理器。在这里,我的数据库中有四个表;“野兔”、“胡萝卜”、“人类”和“朋友”。(您可以在此处找到完整的数据库定义)。finalCarrotManagercarrots=app.getOrThrow(CarrotManager.class);finalHareManagershares=app.getOrThrow(HareManager.class);finalHumanManagerhumans=app.getOrThrow(HumanManager.class);finalFriendManagershares=app.getOrThrow(FriendManager.class);现在这些实体管理器可以用来执行所有的CRUD操作。创建实体创建实体的方式非常简单。我们只是使用实体生成的实现,设置列的值并将其持久化到数据源。hares.persist(newHareImpl().setName("Harry").setColor("Gray").setAge(8));persist方法将返回一个(可能)新的Hare实例,它是自动生成的,就像“id”键已经设置好了。如果我们想在持久化之后继续使用Harry,我们可以使用persist方法返回的这个:finalHareharry=hares.persist(newHareImpl().setName("Harry").setColor("Gray").setAge(8));如果持久化操作失败,例如,如果外键违反唯一约束,则会抛出SpeedmentException。我们应该检查这一点,如果有什么东西悄悄地阻止我们持久保存hare记录,则显示一条错误消息。try{finalHareharry=hares.persist(newHareImpl().setName("Harry").setColor("Gray").setAge(8));}catch(finalSpeedmentExceptionex){System.err.println(ex.getMessage());return;}读取实体Speedment运行时中最酷的功能之一是能够使用Java8的StreamAPI从数据库流式传输数据。“为什么这会很酷?”你可能会问自己。“现在甚至Hibernate都支持流式传输!”就是答案。使用Speedment流操作的最好的事情是它们在构建流时考虑了中间和终止操作。这意味着如果在创建流后向流添加过滤器,则在构建SQL语句时也会考虑该过滤器。下面是一个示例,我们要计算数据库中hare记录的总数。finallongharesTotal=hares.stream().count();System.out.format("Thereare%dharesintotal.%n",haresTotal);此代码将生成的SQL查询如下:SELECTCOUNT(id)FROMshares.hare;这里的终止操作是.count(),所以Speedment知道创建一个SELECTCOUNT(…)语句。它还知道“hare”表的主键是“id”列,因此可以将发送到数据库的整个语句减少到这个。一个更复杂的示例可能是查找名称以“rry”开头且年龄为5岁或更大的兔子的数量。可以这样写:finallongcomplexTotal=hares.stream().filter(Hare.NAME.endsWith("rry")).filter(Hare.AGE.greaterOrEqual(5)).count();我们在构建器中使用Speedment为我们生成的值来定义过滤器。这使得以编程方式分析流并将其简化为单个SQL语句成为可能:SELECTCOUNT(id)FROMshares.hareWHEREhare.nameLIKECONCAT("%",?)ANDhare.age>=5;如果我们添加ASpeedment无法对流执行优化操作,它将像普通Java8流一样处理。我们永远不会限制使用生成的本地构建器,这可以使流操作更加高效。finallonginefficientTotal=hares.stream().filter(h->h.getName().hashCode()==52).count();上面的代码会生成如下极其低效的语句,但是仍然可以运行。SELECTid,名字,颜色,ageFROMshares.share;更新实体更新现有实体与读取和持久化实体非常相似。在我们调用update()方法之前,对实体的本地副本所做的更改不会影响数据库内容。接下来,我们使用之前使用Hare创建的Harry,并将其颜色更改为棕色:harry.setColor("brown");finalHareupdatedHarry=hares.update(harry);如果更新被接受,管理器将返回一个新的副本,因为我们稍后会继续使用这个实例。与尝试“创建”的情况一样,更新可能会失败。也许颜色被定义为“价值独特”,而棕色已经存在于野兔中。在这种情况下,将抛出SpeedmentException。我们还可以通过将多个实体合并到一个流中来同时更新多个实体。假设我们要将所有名为Harry的野兔变成棕色,我们可以这样做:hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater());//更新流中存在的元素我们还应该使用try-catch语句来确保在运行过程中发生故障时警告用户。try{hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater());}catch(finalSpeedmentExceptionex){System.err.println(ex.getMessage());return;}实体删除我们需要知道的最后一个CRUD操作是从数据库中删除一个实体。这个操作几乎等同于“更新”操作。如果我们想删除所有10岁以上兔子的记录,我们应该这样做:try{hares.stream().filter(Hare.AGE.greaterThan(10)).forEach(hares.remover());//Removesremaininghares}catch(finalSpeedmentExceptionex){System.err.println(ex.getMessage());return;}总结通过阅读本文,您已经了解了如何在Maven项目中设置Speedment,以及如何使用Java8Stream用于从数据库中创建、更新、读取和删除实体的API。这是您可以使用Speedment执行的操作的一小部分,但它是让您入门的良好开端。更多示例和更高级的使用场景可以在GitHub页面上找到。