java crud_Java 8流中的数据库CRUD操作

java crud

在开始使用新工具时要克服的最大障碍是让您着手处理小事情。 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询。 为了帮助您开始使用Stream API创建,修改和读取SQL数据库,我整理了此快速入门。 希望它可以帮助您将信息流提升到一个新的水平!

背景

Speedment是一个开源工具包 ,可用于生成Java实体和管理器以与数据库进行通信。 使用图形工具,您可以连接到数据库并生成一个完整的ORM,量身定制以代表您的域模型。 但是Speedment不仅是代码生成器,而且是插入到您的应用程序中的运行时,并可以将Java 8流转换为优化SQL查询。 这是本文中我将重点讨论的部分。

产生程式码

要开始在Maven项目中使用Speedment,请将以下行添加到pom.xml文件中。 在此示例中,我使用的是MySQL,但您也可以使用PostgreSQL或MariaDB。 企业客户可以使用Oracle等专有数据库的连接器。

pom.xml

<properties><speedment.version>3.0.1</speedment.version><db.groupId>mysql</db.groupId><db.artifactId>mysql-connector-java</db.artifactId><db.version>5.1.39</db.version>
</properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency><dependency><groupId>${db.groupId}</groupId><artifactId>${db.artifactId}</artifactId><version>${db.version}</version></dependency>
</dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>${db.groupId}</groupId><artifactId>${db.artifactId}</artifactId><version>${db.version}</version></dependency></dependencies></plugin></plugins>
</build>

现在,您可以访问许多新的Maven目标,这些目标使使用工具包变得更加容易。 启动Speedment UI,执行:

mvn speedment:tool

这将指导您完成连接数据库的过程并配置代码生成。 一开始最简单的方法就是您与默认设置一起运行。 单击“生成”后,Speedment将分析您的数据库元数据,并用诸如实体和经理类之类的新资源填充您的项目。

初始化速度

生成域模型后,轻松设置Speedment。 创建一个新的Main.java文件并添加以下行。 您看到的所有类都是生成的,因此它们的名称将取决于数据库模式,表和列的名称。

Main.java

public class Main {public static void main(String... param) {final HaresApplication app = new HaresApplicationBuilder().withPassword("password").build();}
}

上面的代码使用生成的生成器模式创建一个新的应用程序实例。 使用该构建器可以设置任何运行时配置详细信息,例如数据库密码。

有了应用程序实例后,就可以使用它来访问生成的管理器。 在这种情况下,数据库中有四个表。 “野兔”,“胡萝卜”,“人”和“朋友”。 (您可以在此处查看整个数据库定义 )。

final CarrotManager carrots = app.getOrThrow(CarrotManager.class);
final HareManager hares     = app.getOrThrow(HareManager.class);
final HumanManager humans   = app.getOrThrow(HumanManager.class);
final FriendManager hares   = app.getOrThrow(FriendManager.class);

这些经理现在可以用来执行我们的所有CRUD操作。

创建实体

创建实体非常简单。 我们使用生成的实体实现,为列设置所需的值,然后将其持久化到数据源。

hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8)
);

persist方法返回(可能)新的Hare实例,其中已设置了自动生成的键(例如“ id”)。 如果我们要在持久化Harry后再使用Harry,则应使用persist返回的实例。

final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8)
);

如果持久性失败,例如外键或唯一约束失败,则抛出SpeedmentException。 如果有什么阻止我们坚持野兔,我们应该检查并显示错误。

try {final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8));
} catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return;
}

读取实体

Speedment运行时中最酷的功能是能够使用Java 8 Streams流化数据库中的数据。 “为什么这么酷?” 你可能会问自己。 “如今,即使Hibernate也支持流 !”

Speedment流的美丽之处在于,在构造流时,它们会考虑中介和终止操作。 这意味着,如果在创建流后将过滤器添加到流中,则在构建SQL语句时仍将其考虑在内。

这是一个例子。 我们要计算数据库中的野兔总数。

final long haresTotal = hares.stream().count();
System.out.format("There are %d hares in total.%n", haresTotal);

将生成SQL查询如下:

SELECT COUNT(*) FROM hares.hare;

终止操作是一个.count(),因此Speedment知道它是要创建的SELECT COUNT(…)语句。 还知道“ hare”表的主键是“ id”列,这使得将发送给数据库的整个语句缩减到此范围内成为可能。

一个更复杂的示例可能是查找名称以字母“ rry”结尾且年龄大于或等于5的野兔数量。可以这样写:

final long complexTotal = hares.stream().filter(Hare.NAME.endsWith("rry")).filter(Hare.AGE.greaterOrEqual(5)).count();

我们使用Speedment生成的谓词构建器来定义过滤器。 这使我们能够以编程方式分析流并将其简化为以下SQL语句:

SELECT COUNT(id) FROM hares.hare
WHERE hare.name LIKE CONCAT("%", ?)
AND hare.age >= 5;

如果我们向流添加无法优化Speedment的操作,它将像任何Java 8流一样被解析。 我们绝不仅限于使用生成的谓词构建器,它只是使流更有效。

final long inefficientTotal = hares.stream().filter(h -> h.getName().hashCode() == 52).count();

这将产生以下效率极低的语句,但仍然可以使用。

SELECT id,name,color,age FROM hares.hare;

更新实体

更新现有实体的方式与读取和保留实体的方式非常相似。 在我们在管理器中调用update()方法之前,对实体的本地副本所做的更改不会影响数据库。

在这种情况下,我们采用了哈利先前创建的野兔,并希望将其颜色更改为棕色:

harry.setColor("brown");
final Hare updatedHarry = hares.update(harry);

如果更新被接受,管理器将返回新的野兔副本,因此在此之后我们应该继续使用该实例。 就像在“创建”示例中一样,更新可能会失败。 也许将颜色定义为“唯一”列,并且已经存在“棕色”兔子。 在这种情况下,将抛出SpeedmentException。

我们还可以通过将其与流组合来同时更新多个实体。 假设我们要将所有名为“哈利”的野兔都变成棕色。 在这种情况下,我们这样做:

hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater()); // Updates remaining elements in the Stream

我们还应该将其包装在try-catch中,以确保在约束失败时向用户发出警告。

try {hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater());
} catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return;
}

移除实体

我们需要知道的最后一个CRUD操作是如何从数据库中删除实体。 这几乎与“更新”相同。 假设我们要删除所有10年以上的野兔。 然后,我们这样做:

try {hares.stream().filter(Hare.AGE.greaterThan(10)).forEach(hares.remover()); // Removes remaining hares
} catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return;
}

摘要

在本文中,您学习了如何在Maven项目中设置Speedment,以及如何使用Java 8 Streams从数据库创建,更新,读取和删除实体。 这只是Speedment可以做的所有事情的一小部分,但它是开始弄脏双手的很好的介绍。 可以在GitHub-page上找到更多示例和更高级的用例。

直到下一次!

翻译自: https://www.javacodegeeks.com/2016/10/database-crud-operations-java-8-streams.html

java crud

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

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

相关文章

HH SaaS电商系统的线下服务商品库存和采购设计

线下服务商品库存和采购整体思路 线下服务商品直接在商品编辑页面编辑库存数量即可&#xff0c;服务端直接修改服务商品的销售库存即可线下服务商品则不必生成采购单和出库单线下服务商品无需发货&#xff0c;但是需要商家核销服务权益

HH SaaS电商系统的仓储系统设计

如果商城或者店铺选择开通了供应系统&#xff0c;那么就必然有仓储系统&#xff0c;如果选择不开通供应系统&#xff0c;可以独立开通仓储系统 未开通仓储系统 商城和店铺如果不需要仓储系统&#xff0c;那么商城和店铺就不会有仓储模块&#xff0c;所以无法手动创建库存单据…

wps如何将字体竖着排列_WPS文字中怎么竖着打字?wps文字竖排的设置方法介绍

wps中怎么样才能让文字竖着写啊&#xff1f;WPS现在的应用比较多&#xff0c;其实WPS文字和Word相差不过&#xff0c;都是一个办公软件&#xff0c;我们有时候在编辑的时候需要把文字竖排&#xff0c;那么&#xff0c;wps文字怎么竖排呢&#xff1f;接下来脚本之家小编就给大家…

cloudfoundry_在Cloudfoundry上部署RESTful服务

cloudfoundry在本文中&#xff0c;我们将使用Pivotal Cloud Foundry&#xff08;PCF&#xff09;开发人员在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分&#xff0c;因此我已经创建了employee-service &#xff0c;它具有静态后端&#xff0c;可以从…

HH SaaS电商系统的线上服务商品库存和采购设计

文章目录线上服务商品库存和采购整体思路线上服务商品的采购单状态线上服务商品的出库单状态商家完成服务线上服务商品库存和采购整体思路 线上服务商品直接在商品编辑页面编辑库存数量即可&#xff0c;服务端自动生成类型为“调整入库”的入库单和类型为“调整出库”的出库单…

arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色

最近在研究基于imx6ull开发板&#xff0c;想让开发板支持显示图片、字符串、背景色的功能。 操作的主要步骤如下&#xff1a;移植设备树和驱动移植libjpeg库编写测试程序一、移植设备树和驱动开发板原厂SDK已经移植了lcd对应的设备树和驱动。具体可以参考韦东山老师的文章https…

动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中

动态代码生成 静态代码生成Speedment是一个开源工具包 &#xff0c;可用于生成Java实体和管理器以与数据库进行通信。 如果您需要域模型的对象关系映射&#xff0c;那么这很好&#xff0c;但是在某些情况下&#xff0c;您可能希望使用数据库作为模板来生成完全不同的东西。 在本…

HH SaaS电商系统的库存调整单设计

为了更加灵活地变动商品的库存&#xff0c;以及其它原因导致系统库存数和实际库存数不一致&#xff0c;可以通过库存调整单进行校正。 简简单单设计&#xff0c;没有状态管理&#xff0c;不需要通过审核&#xff0c;直接变更库存数~ 原型设计 库存调整单列表 库存调整单详情…

mysql优化 运维_MySQL运维---MySQL优化

一、优化1、优化的角度2、优化的方向3、数据库优化思路4、MySQL优化介绍5、优化工具介绍二、操作系统优化1、top命令1)CPU2)内存3)slab分配器---Linux内存4)page cache5)swap分区修改成不使用swap分区&#xff1a;永久生效&#xff0c;修改配置文件&#xff1a;2、大页内存机制…

微基准测试 r_在您的构建过程中添加微基准测试

微基准测试 r介绍 作为一个行业&#xff0c;我们正在采用更高的透明度和更可预测的构建过程&#xff0c;以降低构建软件的风险。 持续交付的核心原则之一是通过反馈循环收集反馈。 在Dev9中 &#xff0c;我们采用了与CD原则一致的“ 先知道 ”原则&#xff0c;这意味着我们&…

HH SaaS电商系统服务商品在移动端下单结算的交互设计

服务商品只能单独下单购买&#xff0c;不允许加入购物车我们知道服务商品有三种形式&#xff1a;线上服务、到店服务、上门服务&#xff0c;因为不同服务形式买家和卖家所需的信息不同&#xff0c;所以交互界面也会不同&#xff0c;前端需要判断当前服务商品的服务形式&#xf…

linux 远程备份mysql数据库_使用脚本自动化远程备份MySQL数据库

通常情况下、MySQL都需要备份&#xff0c;备份的方法有很多种。下面是我用脚本配合计划任务完成的自动备份远程的数据库。一、 确认备份方案&#xff1a;备份机&#xff1a;ip192.168.8.51数据库服务器&#xff1a;ip192.168.8.46备份的内容&#xff1a;对mysql的studydb、cour…

javafx动画_JavaFX动画工具

javafx动画好的&#xff0c;我想是时候让您讲一个小秘密了。 最近三个月左右&#xff0c;我从事一个私人项目&#xff0c;目标是创建一个工具&#xff0c;使我可以轻松地为Java桌面应用程序创建动画。 JavaFX在API级别上提供了出色的动画支持&#xff0c;但对于初学者甚至中级程…

HH SaaS电商系统的商品类目设计

文章目录商品的基础类目创建基础类目编辑基础类目删除基础类目启用/禁用基础类目商城的营销类目新增商城营销类目编辑商城营销类目营销类目关联商品店铺的营销类目新增营销类目营销类目关联商品编辑店铺营销类目类目启用规则&#xff08;适用于全部类目&#xff09;商品类目分为…

mysql 匹配单个字符串_MySQL中的字符串模式匹配

MySQL提供标准的SQL模式匹配&#xff0c;以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。标准的SQL模式匹配SQL的模式匹配允许你使用“_”匹配任何单个字符&#xff0c;而“%”匹配任意数目字符(包括零个字符)。在 MySQL中&#xff0c;SQL的模式缺…

dynamodb容器使用_使用DynamoDBMapper插入DynamoDB项目

dynamodb容器使用在上一篇文章中&#xff0c;我们使用DynamoDBMapper来将DynamoDB表映射到Java对象。 插入时&#xff0c;我们的动作几乎相同&#xff0c;但是方式更方便。 为了插入项目&#xff0c;您要做的就是使用对象映射器持久化对象 在我们的例子中&#xff0c;我们将创…

HH SaaS电商系统的品牌模块设计

品牌和商品基础类目属于多对多的关系创建品牌时必须关联商品基础类目&#xff0c;且只能关联三级类目&#xff0c;至少关联一种品牌只能由租户统一进行维护管理&#xff0c;供应商、商家、商城可以申请新品牌&#xff0c;但是由租户进行审核品牌被删除或者停用后&#xff0c;关…

mysql可以存布尔_哪个MySQL数据类型用于存储布尔值

由于MySQL似乎没有任何“布尔”数据类型&#xff0c;你滥用哪种数据类型来存储MySQL中的真/假信息&#xff1f;特别是在写入和读取PHP脚本的上下文中。随着时间的推移&#xff0c;我使用并看到了几种方法&#xff1a;tinyint&#xff0c;包含值0/1的varchar字段&#xff0c;包含…

java反射面试

1什么是反射&#xff1f; 反射是指在运行时动态地获取类的信息&#xff08;包括类的成员变量、方法、构造函数等&#xff09;&#xff0c;并且可以通过反射调用类的方法、访问和修改类的属性&#xff0c;以及创建对象实例。 Java的反射机制提供了一种强大的能力&#xff0c;使得…

chameleon 算法_为了简单起见,Arquillian Chameleon

chameleon 算法使用Arquillian时&#xff0c;您需要做的一件事情就是定义要在哪个容器下执行所有测试。 这是通过在适配器的类路径中添加依赖项并取决于所使用的模式&#xff08;嵌入式&#xff0c;托管或远程&#xff09;来下载的来完成的。 他是应用程序服务器。 例如&…