jooq和jdbc_将jOOQ与JDBC比较
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
jooq和jdbc
jooq和jdbc_将jOOQ与JDBC比较相关推荐
- jooq和jdbc_在jOOQ之上构建的RESTful JDBC HTTP服务器
jooq和jdbc jOOQ生态系统和社区正在持续增长. 我们个人总是很高兴看到基于jOOQ构建的其他开源项目. 今天,我们非常高兴为您介绍BjörnHarrtell结合REST和RDBMS的一种非常 ...
- 使用jOOQ的MockDataProvider破解简单的JDBC ResultSet缓存
某些查询不应该一直访问数据库. 例如,当您查询主数据 (例如系统设置,语言,翻译等)时,您可能希望避免一直通过网络发送相同的愚蠢查询(和结果). 例如: SELECT * FROM languages ...
- jooq代码生成_将jOOQ与Spring结合使用:代码生成
jooq代码生成 我们可能在本教程的第一部分中还记得jOOQ指出 jOOQ从您的数据库生成Java代码,并允许您通过其流畅的API构建类型安全SQL查询. 本教程的第一部分描述了如何配置使用jOOQ的 ...
- jooq 事务_将jOOQ与Spring结合使用:排序和分页
jooq 事务 JOOQ是一个库,可以帮助我们控制SQL. 它可以从我们的数据库生成代码,并允许我们使用其流畅的API来构建类型安全的数据库查询. 本教程前面的部分向我们介绍了如何配置应用程序的应用程 ...
- jpa 使用jdbc_在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ
jpa 使用jdbc Java杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章: http : //www.javamagazine.mozaicreader.c ...
- jooq 执行sql_使用jOOQ和Java 8的CompletableFuture进行异步SQL执行
jooq 执行sql 响应式编程是一个新的流行词,它实际上仅表示异步编程或消息传递. 事实是,函数语法极大地帮助构建了异步执行链,今天,我们将看到如何使用jOOQ和新的CompletableFutur ...
- [JavaWeb-JDBC]JDBC_快速入门_idea jdbc连接Mysql数据库
快速入门: * 步骤:1. 导入驱动jar包 mysql-connector-java-8.0.17.jar1.复制mysql-connector-java-8.0.17.jar到项目的libs目录下 ...
- java jooq_将Java EE与jOOQ结合使用的初学者指南
java jooq Java EE附带了自己的持久性API:JPA. 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略. 其背后的思想是,业务逻辑通 ...
- jooq权限配置_将jOOQ与Spring结合使用:配置
jooq权限配置 我遇到了由ORM引起的性能问题. 尽管我不得不承认大多数这些问题确实是由您造成的,但是我开始认为在只读操作中使用ORM是不值得的. 我开始寻找实现这些操作的替代方法. 这就是我遇到j ...
最新文章
- LVS+Keepalived+httpd安装及配置
- LeetCode 170. 两数之和 III - 数据结构设计(哈希map)
- spring AOP注解实现
- php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件
- if单分支,二分支,多分支
- swift label不同颜色、不同字体
- STL 格式解析--文本以及二进制格式
- origin数据平滑_Origin平滑曲线的使用方法
- 天翼云服务器80、443等特殊端口无法访问原因记录
- ico在线制作,网站小图标Favicion.ico在线制作工具软件
- linux开机故障,Entering emeryency mode. Exit the shell to continue.
- 如何使用命令提示符查找和打开文件
- Photoshop调出田园照片唯美手绘油画效果
- 设计 - 收藏集 - 掘金
- 扫描转换html,html+css实现图片扫描仪特效
- 【微信小程序】自定义弹窗蒙版输入框效果图完整代码
- java excel 设置列为日期,POI - 如何将单元格值设置为日期并应用默认Excel日期格式?...
- php生成表格数据类型,phpspreadsheet 中文文档(四) 创建电子表格+档案格式
- 新唐单片机选型手册_新唐单片机选型手册_新唐8051标准系列单片机选型指南
- microbit测试题