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

java crud_Java 8流中的数据库CRUD操作相关推荐

  1. Java 8流中的数据库CRUD操作

    在开始使用新工具时要克服的最大障碍是让您着手处理小事情. 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询. 为了帮助您开始使用Strea ...

  2. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  3. JDBC操作1:实现对数据库crud操作

    目录 1. JDBC概念 1.1 什么是JDBC 1.2 JDBC实现形式 1.3 jdbc操作API介绍 1.4 jdbc操作步骤(固定) 2. JDBC实现对数据库crud操作 2.1 第一步 加 ...

  4. html 连续发送数据库,不要在循环中对数据库进行操作.htm

    不要在循环中对数据库进行操作 不要在循环中对数据库进行操作 性能非常低下,应改为用IN查询 示例: 1.在循环中查询数据库,增加gv_title属性(性能低下) foreach ($res['data ...

  5. 使用Java Spring消费MySQL中的数据库存储过程

    进行这个练习的一些先决条件. 创建一张student数据库表: CREATE TABLE Student(ID INT NOT NULL AUTO_INCREMENT,NAME VARCHAR(20) ...

  6. Neo4j(二) Neo4j中的入门CRUD操作(小猪佩奇关系网)

    Neo4j(二) Neo4j中的CRUD操作(小猪佩奇关系网) 本章介绍Neo4j中的基本操作 以小猪佩奇的关系网为案例 素材来自B站视频学习 前言 上图为小猪佩奇一家人,为了更加丰富,案例添加了人物 ...

  7. QTP中对数据库的操作(查询,更新和删除等)

    标题为QTP对数据库的操作,其实应该改为QTP/VBS对数据库的操作.因为QTP中就是通过vbs完成数据库操作的.以access为例. 通过ADO对数据库访问的步骤如下: a.创建一个到数据库的 AD ...

  8. 项目中对数据库的操作

    首先,介绍一下关系型数据库的相关知识: 我们最起码我说接触的都是关系模型: 关系数据结构:关系模型的结构非常单一.关系型数据库以行和列的形式存储数据. 关系操作:关系模型给出了关系操作的能力. 关系完 ...

  9. java 对比函数_java中字符串比较函数和操作函数,详细解析

    java编程语言中关于字符的内容也是极其丰富的,所以学习这方面的知识也十分重要的.今天就来为大家介绍一些与java字符串有关的内容,也就是java中字符串比较函数和操作函数,并为大家进行详细的解析,一 ...

最新文章

  1. 19级:班级日常分享 | 一天一瞬间
  2. rcu宽限期_如何处理宽限期错误:静默失败不是一种选择
  3. opencv画图_c++
  4. 接口测试基础——第5篇xlrd模块
  5. 依据imu姿态角计算z轴倾角_[姿态估计] DenseFusion详解
  6. python在城市规划中的运用_温州市城市规划展示厅
  7. python控制键盘事件、粘贴_python调用键盘控制游戏事件
  8. WaitForSingleObject与WaitForMultipleObjects用法详解
  9. python多进程与多线程_第十五章 Python多进程与多线程
  10. json学习笔记,json与js对象格式的转换,js对象转json字符串,json格式转js对象
  11. 【TBSchedule】TBSchedule应用实战手册
  12. C++ 隐藏窗口在任务栏的显示
  13. 邮件服务器的渗透,渗透基础——从Exchange服务器上搜索和导出邮件
  14. 微型计算机与巨型计算机相比,微型计算机的特点及应用
  15. Python | NumPy | 3D 数据可视化 - 散点图
  16. 读书笔记_006 《查令十字街84号》
  17. css 让图标上下跳,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
  18. 2000-2020年上市公司常用控制变量数据整理
  19. 这10本书,带你了解 ChatGPT 的底层逻辑!
  20. Android学习——Shortcut

热门文章

  1. 洛谷P4173:残缺的字符串(FFT、通配符匹配)
  2. CF718E Matvey‘s Birthday(状压、bfs、暴力、分类讨论)
  3. AT1983-[AGC001E]BBQ Hard【dp,组合数学】
  4. YbtOJ-大收藏家【分层图,最大流】
  5. jzoj5702-[gdoi2018day2]滑稽子图【树形dp,二项式定理】
  6. P3808,P3796-[模板]AC自动机(简单版/加强版)
  7. POJ2279-Mr. Young's Picture Permutations【线性dp】
  8. OJ4121 and OJ2968-股票买卖 and Maximun sum【各种dp之6 and 9】
  9. 设计数据库表时,你真的会选数据类型吗
  10. 浅析神经网络为什么能够无限逼近任意连续函数