将jOOQ与JDBC比较

本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。

在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特定语言如何可以极大地提高开发人员的生产率,从而将SQL内部化为Java。

在本课程中,我们将看到如何使用jOOQ有效地查询数据库。 在这里查看 !

目录

1.简介 2.检查异常
2.1。 JDBC 2.2。 OO
3.结果集
3.1。 您可以在foreach循环中使用jOOQ结果 3.2。 您可以将jOOQ结果与Java 8流一起使用
4.准备的陈述
4.1。 JDBC 4.2。 OO
5.带有结果集的语句
5.1。 JDBC 5.2。 OO

1.简介

也可以从org.jooq.academy.section3包中获得本节中显示的示例 。

大多数Java开发人员对JDBC是什么以及它如何工作都有深刻的了解。 如果还没有的话,请查看Oracle的官方JDBC教程以了解有关JDBC的更多信息。

JDBC通常因冗长而受到批评。 JDBC也因选择了错误的“默认值”而受到批评,例如,默认的结果集的延迟实现。 我们将看到jOOQ如何改进这些批评:

2.检查异常

Java的检查异常已被视为失败,这也是Java 8的新Streams API和所有相关功能接口不再支持检查异常的原因。

jOOQ的所有API都将抛出从jOOQ的org.jooq.exception.DataAccessException派生的RuntimeExceptions ,在大多数情况下您无需捕获它,从而使其中止当前的正在运行的事务。 比较两者的示例:

JDBC

// These two calls can throw a SQLException
try (PreparedStatement stmt = connection.prepareStatement("SELECT FIRST_NAME FROM AUTHOR");ResultSet rs = stmt.executeQuery()) {// This can throw a SQLExceptionwhile (rs.next()) {// This can throw a SQLExceptionSystem.out.println(rs.getString(1));}
}

OO

DSL.using(connection).select(AUTHOR.FIRST_NAME).from(AUTHOR).fetch().forEach(record -> System.out.println(record.getValue(AUTHOR.FIRST_NAME)));

3.结果集

JDBC的ResultSet是一个非常有状态的对象,无法与Java collections API很好地互操作。 例如,它没有实现Iterator ,因为它还必须适应在基础数据库游标中向后滚动-几乎任何人都不需要的功能。

jOOQ通过org.jooq.Result类型更好地集成了SQL结果集,可容纳所有用例的95%:

  • jOOQ的Result实现了java.util.List ,因此继承了List的所有功能,包括将其转换为Java 8 Stream的功能 。
  • jOOQ的Result已完全实现到Java内存中,而不是默认情况下是惰性的。 这样可以尽早释放资源。
  • jOOQ的Result知道其自己的Record类型,该类型允许通过列引用而不是列索引进行类型安全的访问记录属性。

请注意,以上是默认设置。 如果您有较大的结果集,并且不想逐条记录地实现,则可以始终使用jOOQ的惰性获取功能。 在以下示例中可以看出:

您可以在foreach循环中使用jOOQ结果

for (Record record : DSL.using(connection).select().from(AUTHOR).fetch()) {System.out.println(record);
}

您可以将jOOQ结果与Java 8流一起使用

DSL.using(connection).select().from(AUTHOR).fetch().stream().flatMap(record -> Arrays.stream(record.intoArray())).forEach(System.out::println);

4.准备的陈述

奇怪的是,JDBC区分静态java.sql.Statement类型和java.sql.PreparedStatement类型。 这种做法将使您不必执行往返数据库的操作即可在执行之前准备语句-但是,无论如何,最好使用准备好的语句来执行所有查询的95%,所以为什么要打扰呢?

jOOQ不会通过单独的语句类型来区分这两种执行模式 。 相反,您可以使用设置标志来指示在真正需要时应执行静态语句。 一个例子:

JDBC

// Static statement
try (Statement stmt = connection.createStatement()) {// Remember to pass the SQL string here!stmt.executeUpdate("ALTER TABLE ...");
}// Prepared statement
try (PreparedStatement stmt = connection.prepareStatement("SELECT * FROM ... ")) {// Remember not to pass the SQL string here!stmt.executeUpdate();// ... although, from an API perspective, this would be possible toostmt.executeUpdate("Some SQL here");
}

OO

// Static statement
DSL.using(connection, new Settings().withStatementType(StatementType.STATIC_STATEMENT)).fetch("SELECT * FROM AUTHOR")// Prepared statement
DSL.using(connection).fetch("SELECT * FROM AUTHOR")

5.带有结果集的语句

另一方面,无法从JDBC语句类型推断出该语句是否实际上是一个查询返回结果集,或者它是否将返回许多更新的行,或者什么都不返回。 如果您不知道,则必须运行以下乏味的JDBC代码:

JDBC

try (PreparedStatement stmt = connection.prepareStatement("SELECT FIRST_NAME FROM AUTHOR")) {// Use the little-known execute() methodboolean moreResults = stmt.execute();// Use the rarely-used do {} while (...) loopdo {// Check first, if there is any ResultSet availableif (moreResults) {try (ResultSet rs = stmt.getResultSet()) {while (rs.next()) {System.out.println(rs.getString(1));}}}else {System.out.println(stmt.getUpdateCount());}}// Repeat until there are neither any more result sets or update countswhile ((moreResults = stmt.getMoreResults()) || stmt.getUpdateCount() != -1);
}

OO

使用jOOQ,您可以按类型区分两种类型的语句 :

  • org.jooq.Query是具有更新计数且没有结果的语句
  • org.jooq.ResultQuery是带有结果的语句

只有ResultQuery具有各种fetch()方法:

Query q1 = dsl.query("ALTER TABLE ...");
int rows = q1.execute();ResultQuery<?> q2 = dsl.resultQuery("SELECT * FROM AUTHOR");
Result<?> result = q2.fetch();

翻译自: https://www.javacodegeeks.com/2015/09/comparing-jooq-with-jdbc.html

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

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

相关文章

matlab三维选取二维,基于Matlab绘制二维和三维图形以及其他图形控制函数的使用方法...

Matlab绘图强大的绘图功能是Matlab的特点之一&#xff0c;Matlab提供了一系列的绘图函数&#xff0c;用户不需要过多的考虑绘图的细节&#xff0c;只需要给出一些基本参数就能得到所需图形&#xff0c;这类函数称为高层绘图函数。此外&#xff0c;Matlab还提供了直接对图形句柄…

迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException

迭代器生成器可迭代对象Java Collection类是快速失败的&#xff0c;这意味着如果在使用迭代器遍历某个线程的同时更改了Collection&#xff0c;则iterator.next&#xff08;&#xff09;将抛出ConcurrentModificationException 。 在多线程以及单线程环境中都可能出现这种情况。…

Console命令详解,让调试js代码变得更简单

刚刚在浏览关于js方面的博客时发现这个方法挺好玩的&#xff0c;自己爽了一把。 1 <script> 2 console.time(/X(.)X/ test); 3 "XX".match(/X(.)X/); 4 console.timeEnd(/X(.)X/ test); 5 </script> 然后恶补了一下关于Firebug控制台的知识。熟练地使用…

mysql as tmp,启动mysql时显示:/tmp/mysql.sock 不存在的解决办法

启动mysql时显示&#xff1a;/tmp/mysql.sock 不存在的解决方法启动mysql时显示&#xff1a;/tmp/mysql.sock 不存在的解决方法启动mysql时报错的解决(mysql 5.0.45 redhat as43)启动mysql时报错的解决(mysql 5.0.45 redhat as 43)作者: lawzjf(http://lawzjf.itpub.net)发表于…

PHP求体重成绩函数,PHP数组

数组提出一个问题&#xff1a;一个养鸡场有6只鸡&#xff0c;他们的体重分别为3kg&#xff0c;5kg&#xff0c;1k个&#xff0c;3.4kg&#xff0c;2kg&#xff0c;6.kg请问这六只鸡的总体重是多少平均体重是多少请你用现在掌握的技术编一个程序现在我们使用现有的技术来解决问题…

Sublime Text 3插件之Emmet:HTML/CSS代码快速编写神器

一、快速编写HTML代码 1. 初始化 HTML文档需要包含一些固定的标签&#xff0c;比如<html>、<head>、<body>等&#xff0c;现在你只需要1秒钟就可以输入这些标签。比如输入“!”或“html:5”&#xff0c;然后按Tab键&#xff1a; html:5 或!&#xff1a;用于…

批处理停止php服务,通过批处理启动和停止MSSQL+IIS

电脑安装了不少的开发工具环境&#xff0c;如MSSQL2005(2000)IIS\MySQLApache等等&#xff0c;开机和娱乐时为了加快速度&#xff0c;都得把这些占用内存的开发工具系统服务停止&#xff0c;每项手工操作明显麻烦&#xff0c;用批处理就简单多了... 点一下启动&#xff0c;再点…

k8s secret使用_Java Secret:使用枚举构建状态机

k8s secret使用总览 Java中的枚举比许多其他语言更强大&#xff0c;可以导致令人惊讶的用途。 在本文中&#xff0c;我概述了Java 枚举的一些单独功能&#xff0c;并将它们放在一起形成一个状态机。 单例和实用程序类的枚举 您可以非常简单地将枚举用作Singleton或Utility。…

mydumper备份原理和使用方法

mydumper介绍 MySQL自身的mysqldump工具支持单线程工作&#xff0c;依次一个个导出多个表&#xff0c;没有一个并行的机&#xff0c;这就使得它无法迅速的备份数据。 mydumper作为一个实用工具&#xff0c;能够良好支持多线程工作&#xff0c;可以并行的多线程的从表中读入数据…

大津阈值分割matlab实验,OTSU(大津法)分割源程序(MATLAB版)

接下来介绍OTSU方法的原理&#xff1a;***************************************************************************************************************************************************************OTSU法对于具有双峰性质的灰度图像或是彩色图像的某一通道的分割效…

BZOJ-1798 维护序列

线段树。支持区间加、区间乘、区间查询和。 标记下移还有取模要注意。 var n,p,q,i,s,t:longint; a:int64; num,n1,n2,n3:array[0..500000] of int64; procedure build(o,l,r:longint); var m,i:longint; begin m:(lr) div 2; if lr then begin n1[o]:num[l];…

matlab pca可视化,利用Matlab实现PCA demo展示

input_data rand(1000,3);%随机生成1000个样本&#xff0c;每个样本有x,y,z三个属性 figure(1);%控制画图的窗口为1hold off;%使当前轴和图形不再具备被刷新的性质&#xff0c;关闭在此基础上再画图plot3(input_data(:,1), input_data(:,2), input_data(:,3), ‘ro‘);%% Func…

matlab短均线滞后项,均线理论的滞后性问题

对移动平均线有一定了解的人都会发现移动平均线理论存在一个缺点&#xff0c;那就是移动平均线的信号具有一定的滞后性&#xff0c;这是制约移动平均线运用的最大因素。介绍了均线的计算方法.从它的计算方法中也能看出目前均线的数值要受到前一阶段股价的影响&#xff0c;而且均…

IOS侧滑框架合集

侧滑框架 https://github.com/gresrun/GHSidebarNav https://github.com/ipup/PPRevealSideViewController https://github.com/gotosleep/JASidePanels https://github.com/jamztang/JTRevealSidebarDemo https://github.com/ECSlidingViewController/ECSlidingViewController…

python捕获摄像头帧_Xuggler教程:帧捕获和视频创建

python捕获摄像头帧注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 到目前为止&#xff0c;在我们的Xuggler教程系列中&#xff0c;我们已经对视频处理的Xuggler进行了介绍&#xff0c;并讨论了转码和媒体修改 。 在本教程中&#xff0c;我们将看到如何解码视…

【python核心编程】第六章 序列

1、操作符 &#xff08;1&#xff09;成员关系操作符&#xff1a;in 、not in >>> string abcdefg>>> a in stringTrue>>> h in stringFalse>>> h not in stringTrue *补充知识*&#xff1a;string模块 >>> import string>>…

java物业管理系统设计,JAVA物业管理系统设计与实现(论文+源代码)

【实例简介】JAVA物业管理系统设计与实现(论文源代码)【实例截图】【核心代码】JAVA物业管理系统设计与实现(论文源代码)└── JAVA物业管理系统设计与实现(论文源代码)├── JAVA物业管理系统设计与实现(论文源代码)│ ├── JAVA物业管理系统│ │ ├── JWS│ │…

MyEclipse 编写 ExtJS 卡死问题解决方法

MyEclipse 8.6 在 jsp 中编写 ExtJS时&#xff0c;会出现卡死现象&#xff0c;让人甚是头疼。网上找了很多方法&#xff0c;折腾半天&#xff0c;还是不管用。 什么MyEclipse 优化&#xff0c;Validation 取消&#xff0c;MyEclipse 在 JSP 中打 "点" 时&#xff0…

matlab试用版的user id,免费试用MATLAB

请选择其一AlabamaAlaska美属萨摩亚APO/FPO AAAPO/FPO AEAPO/FPO APArizonaArkansasCaliforniaCaroline IslandsColoradoConnecticutDelawareDistrict of ColumbiaFlorida格鲁吉亚关岛HawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMariana Islands马绍尔群岛Mar…

java的aqs是什么,AQS在Java中的应用

上篇文章我们详细分析了AQS的底层实现原理,这节就来探索jdk中使用AQS实现的工具类ReentrantLock一, 是什么?怎么用?是什么?是一个独占锁,也就是在并发环境下同一时刻只能有一个线程获得资源,也是一个可重入锁.可重入锁: 一个线程已经获取到了该资源,下次再次获取资源时不会出…