Java 8流中的数据库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

这将指导您完成连接数据库和配置代码生成的过程。 开始时最简单的方法就是您与默认设置一起运行。 一旦按下“ Generate”,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

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

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

相关文章

网络时间同步

linux yum install ntp ntpdate -y 时间同步命令&#xff1a;ntpdate time.windows.com 开机启动: chkconfig ntpd on 查看开机启动&#xff1a;chkconfig --list ntpd ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off 转载于:https://www.cnblogs.com/…

java 权限url权限_SpringBootSecurity学习(11)网页版登录之URL动态权限

动态权限前面讨论用户登录认证的时候&#xff0c;根据用户名查询用户会将用户拥有的角色一起查询出来&#xff0c;自动实现判断当前登录用户拥有哪些角色。可以说用户与角色之间的动态配置和判断security做的非常不错。不过在配置方法级别的权限的时候&#xff0c;使用注解虽然…

线程使用

嵌入式中线程应用还是看需求&#xff0c;一般不常用&#xff08;在不会使用的情况下&#xff09;一、编译有线程的应用程序需要编译时指定编译lib库 &#xff08; -l pthread&#xff09; 如&#xff1a;gcc main.c -o main -l pthread 才能编译通过。二、线程使用。1、线程运行…

C++ MFC string转Cstring为什么会乱码

前段时间学习mfc编了一个小程序&#xff0c;其中涉及到CString 与string的转换的时候感觉特别蛋疼&#xff0c;因此再此总结一下经验。希望能够对大家能有所帮助 通常有两种字符集模式 unicode字符集 和 ascii字符集&#xff0c;其中unicode有多种编码方式。utf8&#xff0c; …

metaq原理简介

1. 前言 本文档旨在描述RocketMQ的多个关键特性的实现原理&#xff0c;并对消息中间件遇到的各种问题进行总结&#xff0c;阐述RocketMQ如何解决这些问题。文中主要引用了JMS规范与CORBA Notification规范&#xff0c;规范为我们设计系统指明了方向&#xff0c;但是仍有不少问题…

3d展示网页开发_超实用:一篇文章带你了解市面上主流通用的3D模型格式

说到格式&#xff0c;相信大家都不陌生。随着互联网的普及&#xff0c;我们几乎每天都会和不同的格式打交道&#xff0c;文本的TXT、图片的JPG、视频的MP4&#xff0c;就连压缩包也有不同的格式。通俗来说&#xff0c;你可以把“格式”理解成基于同一规范的技术表征&#xff0c…

java三件套_Java开发人员应该知道的三件事

java三件套对于那些长期关注JavaOne 2012会议的读者来说&#xff0c;这是一篇有趣的文章。 我最近对Java冠军Heinz Kabutz的采访引起了我的注意&#xff1b; 包括他的Java内存难题程序&#xff0c;从Java内存管理的角度来看&#xff0c;这很有启发性。 采访中有一个特别的部分吸…

Python 的变量作用域和 LEGB 原则

在 Python 程序中创建、改变或查找变量名时&#xff0c;都是在一个保存变量名的地方进行中&#xff0c;那个地方我们称之为命名空间。作用域这个术语也称之为命名空间。 具体地说&#xff0c;在代码中变量名被赋值&#xff08;Python 中变量声明即赋值&#xff0c;global 声明的…

让MessageBox在最前面弹出来的信息在

nt MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); 在uType参数中设置MB_SYSTEMMODAL就能让MessageBox在最前面 消息框…

Confluence 6 管理协同编辑 - 关于 Synchrony

协同编辑能够让项目小组中的协同合作达到下一个高度。这个页面对相关协同编辑中的问题进行了讨论&#xff0c;能够提供给你所有希望了解的内容。 进入 Collaborative editing 页面来获得项目小组是如何进行实时的协同工作的&#xff0c;这些协同工作包括在软件需求&#xff0c;…

如何初始化局部变量c语言_【C语言更新】C语言中如何来定义一个指针,并且对其进行初始化...

文/Edward上一节中&#xff0c;我们利用了一个小知识来介绍了一下指针&#xff0c;在上面这个例子中&#xff0c;小明和小丽手中的这个杯子就好比我们C语言中的变量&#xff0c;它确实是实实在在存放一些有具体意义的数据。这个杯套就类似于C语言中指针的作用&#xff0c;假设我…

Spring Environment仅用于初始化代码

从3.1版开始&#xff0c; Spring框架提供了对几种不同来源的抽象&#xff0c;通过它们您可以轻松地配置应用程序&#xff1a; Environment 。 在这篇文章中&#xff0c;我描述了一个微基准测试&#xff0c;我可以证明该基准测试是一个方便的API&#xff08;如果您在应用程序中…

linux查看和关闭后台执行程序

后台执行的程序会有一个pid,查看后台程序主要用到jobs,ps 关闭后台程序用到kill详细说明转自http://blog.csdn.net/tianlesoftware/article/details/6165753 一. 有关进程的几种常用方法 1.1 & 符号 在命令后面加上一个 & 符号&#xff0c;表示该命令放在后台执行&…

Mysql 多表联合查询效率分析及优化

1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN&#xff0c;或者使用, 如&#xff1a; SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两…

Python的__getattr__方法学习

内容部分来自网络 __getattr__函数的作用&#xff1a; 如果属性查找&#xff08;attribute lookup&#xff09;在实例以及对应的类中&#xff08;通过__dict__)失败&#xff0c; 那么会调用到类的__getattr__函数&#xff1b; 如果没有定义这个函数&#xff0c;那么抛出Attribu…

python to_excel新增sheet_Python使用xlrd和xlwt读写Excel的简单用法

前言数据处理是 Python 的一大应用场景&#xff0c;而 Excel 则是最流行的数据处理软件。因此用Python 进行数据相关的工作时&#xff0c;难免要和 Excel 打交道。标准的 Excel 文件&#xff08;xls/xlsx&#xff09;具有较复杂的格式&#xff0c;并不方便像普通文本文件一样直…

linux 线程管理、同步机制等

线程学了那么多有关进程的东西&#xff0c;一个作业从一个进程开始&#xff0c;如果你需要执行其他的东西你可以添加一些进程&#xff0c;进程之间可以通信、同步、异步。似乎所有的事情都可以做了。 对的&#xff0c;进程是当初面向执行任务而开发出来的&#xff0c;每个进程代…

SQL多表连接查询(详细实例)

本文主要列举两张和三张表来讲述多表连接查询。 新建两张表&#xff1a; 表1&#xff1a;student 截图如下&#xff1a; 表2&#xff1a;course 截图如下&#xff1a; &#xff08;此时这样建表只是为了演示连接SQL语句&#xff0c;当然实际开发中我们不会这样建表&#xff0c;…

cf 1059e 思维 贪心 树

参考博客&#xff1a;http://www.cnblogs.com/waldenlake/p/9750249.html 题意&#xff1a;将一棵n个点的带权有根树剖分成尽量少的链&#xff0c;使得 &#xff08;1&#xff09;链的两个端点是祖先关系 &#xff08;2&#xff09;链含有的顶点个数小于等于L &#xff08;3&am…

powermock模拟对象_使用PowerMock模拟构造函数

powermock模拟对象在我看来&#xff0c;依赖注入的主要好处之一是可以将模拟和/或存根对象注入代码中&#xff0c;以提高可测试性&#xff0c;增加测试覆盖率并编写更好&#xff0c;更有意义的测试。 但是&#xff0c;有时候您会遇到一些不使用依赖注入的传统代码&#xff0c;而…