Data Geekery公司发布了其Java对象关系映射(ORM,Object-Relational Mapping)工具包jOOQ的3.9.0版。jOOQ首次推出于2010年8月,实现从数据库生成代码,用于类型安全查询。该新版本给出的新特性包括:

\\

  • \\t

    实验性的语法解析器:

    \\\t

    • 将字符串形式的SQL语句解析为jOOQ表达式树。\\t

    \\t

  • \\t

    集成了Checker框架:

    \\\t

    • 为jOOQ提供进一步的类型安全。\\t

    \\t

  • \\t

    改进了与Oracle 12c和PL/SQL的集成:

    \\\t

    • 支持Oracle 12c中的新特性。\\t

    \\t

  • \\t

    JSR-310 Java Time API:

    \\\t

    • 支持传统的JDBC日期/时间类型和JSR-310的Java Time API的一个单独的API。\\t

    \

开源版本的jOOQ支持下列数据库:

\\

  • MySQL 5.5、5.6、5.7和8.0\\t
  • PostgreSQL 9.3及以后版本\\t
  • MariaDB 5.2及以后版本\\t
  • CUBRID 8.4及以后版本\\t
  • Apache Derby 10.10及以后版本\\t
  • Firebird 2.5和3.0\\t
  • H2 1.3和1.4\\t
  • HSQLDB 2.2及以后版本\\t
  • SQLite 3\

jOOQ的许可页面给出了一系列的许可选项。

\\

入门指南

\\

为初步了解如何构建jOOQ应用,我们考虑使用如下实体关系图去建模一个称为pubs的出版数据库:

\\

\\

我们使用Maven,依赖关系中应包括数据库驱动和jOOQ的代码生成器:

\\

\\u0026lt;dependencies\u0026gt;\    \u0026lt;dependency\u0026gt;\        \u0026lt;groupId\u0026gt;mysql\u0026lt;/groupId\u0026gt;\        \u0026lt;artifactId\u0026gt;mysql-connector-java\u0026lt;/artifactId\u0026gt;\        \u0026lt;version\u0026gt;6.0.3\u0026lt;/version\u0026gt;\    \u0026lt;/dependency\u0026gt;\    \u0026lt;dependency\u0026gt;\        \u0026lt;groupId\u0026gt;org.jooq\u0026lt;/groupId\u0026gt;\        \u0026lt;artifactId\u0026gt;jooq\u0026lt;/artifactId\u0026gt;\        \u0026lt;version\u0026gt;3.9.0\u0026lt;/version\u0026gt;\    \u0026lt;/dependency\u0026gt;\    \u0026lt;dependency\u0026gt;\        \u0026lt;groupId\u0026gt;org.jooq\u0026lt;/groupId\u0026gt;\        \u0026lt;artifactId\u0026gt;jooq-meta\u0026lt;/artifactId\u0026gt;\        \u0026lt;version\u0026gt;3.9.0\u0026lt;/version\u0026gt;\    \u0026lt;/dependency\u0026gt;\    \u0026lt;dependency\u0026gt;\        \u0026lt;groupId\u0026gt;org.jooq\u0026lt;/groupId\u0026gt;\        \u0026lt;artifactId\u0026gt;jooq-codegen\u0026lt;/artifactId\u0026gt;\        \u0026lt;version\u0026gt;3.9.0\u0026lt;/version\u0026gt;\    \u0026lt;/dependency\u0026gt;\\u0026lt;/dependencies\u0026gt;

\\

在配置文件的\u0026lt;profile\u0026gt;部分,定义数据库的相关属性:

\\

\\u0026lt;profile\u0026gt;\    \u0026lt;id\u0026gt;default\u0026lt;/id\u0026gt;\    \u0026lt;activation\u0026gt;\        \u0026lt;activeByDefault\u0026gt;true\u0026lt;/activeByDefault\u0026gt;\    \u0026lt;/activation\u0026gt;\    \u0026lt;properties\u0026gt;\        \u0026lt;jdbc.user\u0026gt;root\u0026lt;/jdbc.user\u0026gt;\        \u0026lt;jdbc.password\u0026gt;\u0026lt;/jdbc.password\u0026gt;\        \u0026lt;jdbc.url\u0026gt;jdbc:mysql://localhost:3306/pubs\u0026lt;/jdbc.url\u0026gt;\        \u0026lt;jdbc.driver\u0026gt;com.mysql.cj.jdbc.Driver\u0026lt;/jdbc.driver\u0026gt;\    \u0026lt;/properties\u0026gt;\\u0026lt;/profile\u0026gt;

\\

下面plugin部分的\u0026lt;generate\u0026gt;\u0026lt;/generate\u0026gt;标签对内,定义了Maven编译目标、生成和jOOQ代码生成器的属性,其中包括使用的数据库、数据库模式,并定义了jOOQ生成的Java代码包。

\\

\\u0026lt;plugin\u0026gt;\    \u0026lt;groupId\u0026gt;org.jooq\u0026lt;/groupId\u0026gt;\    \u0026lt;artifactId\u0026gt;jooq-codegen-maven\u0026lt;/artifactId\u0026gt;\    \u0026lt;version\u0026gt;3.9.0\u0026lt;/version\u0026gt;\    \u0026lt;!-- The plugin should hook into the generate goal --\u0026gt;\    \u0026lt;executions\u0026gt;\        \u0026lt;execution\u0026gt;\            \u0026lt;goals\u0026gt;\                \u0026lt;goal\u0026gt;generate\u0026lt;/goal\u0026gt;\            \u0026lt;/goals\u0026gt;\        \u0026lt;/execution\u0026gt;\    \u0026lt;/executions\u0026gt;\    \u0026lt;configuration\u0026gt;\        \u0026lt;jdbc\u0026gt;\            \u0026lt;driver\u0026gt;${jdbc.driver}\u0026lt;/driver\u0026gt;\            \u0026lt;url\u0026gt;${jdbc.url}\u0026lt;/url\u0026gt;\            \u0026lt;user\u0026gt;${jdbc.user}\u0026lt;/user\u0026gt;\            \u0026lt;password\u0026gt;${jdbc.password}\u0026lt;/password\u0026gt;\        \u0026lt;/jdbc\u0026gt;\        \u0026lt;generator\u0026gt;\            \u0026lt;database\u0026gt;\                \u0026lt;name\u0026gt;org.jooq.util.mysql.MySQLDatabase\u0026lt;/name\u0026gt;\                \u0026lt;includes\u0026gt;.*\u0026lt;/includes\u0026gt;\                \u0026lt;excludes\u0026gt;\u0026lt;/excludes\u0026gt;\                \u0026lt;inputSchema\u0026gt;pubs\u0026lt;/inputSchema\u0026gt;\            \u0026lt;/database\u0026gt;\            \u0026lt;target\u0026gt;\                \u0026lt;packageName\u0026gt;org.redlich.pubs.model\u0026lt;/packageName\u0026gt;\                \u0026lt;directory\u0026gt;src/main/java\u0026lt;/directory\u0026gt;\            \u0026lt;/target\u0026gt;\        \u0026lt;/generator\u0026gt;\    \u0026lt;/configuration\u0026gt;\\u0026lt;/plugin\u0026gt;

\\

以下pubs数据库SQL查询示例将被jOOQ建模:

\\

\SELECT title,publish_date,authors.last_name,types.type,publishers.publisher\FROM publications\INNER JOIN authors ON authors.id = publications.author_id\INNER JOIN types ON types.id = publications.type_id\INNER JOIN publishers ON publishers.id = publications.publisher_id;\

\\

使用jOOQ生成的代码,可以编写实现访问数据库和编写类型安全查询的应用:

\\

\public class Application {\    public static void main(String[] args) throws Exception {\        String user = System.getProperty(\"jdbc.user\");\        String password = System.getProperty(\"jdbc.password\");\        String url = System.getProperty(\"jdbc.url\");\        String driver = System.getProperty(\"jdbc.driver\");\        Class.forName(driver).newInstance();\        try(Connection connection = DriverManager.getConnection(url,user,password)) {\            DSLContext dslContext = DSL.using(connection,SQLDialect.MYSQL);\            Result result = dslContext.select()\                .from(PUBLICATIONS)\                .join(AUTHORS)\                .on(AUTHORS.ID.equal(PUBLICATIONS.AUTHOR_ID))\                .join(TYPES)\                .on(TYPES.ID.equal(PUBLICATIONS.TYPE_ID))\                .join(PUBLISHERS)\                .on(PUBLISHERS.ID.equal(PUBLICATIONS.PUBLISHER_ID))\                .fetch();\            for(Record record : result) {\                Long id = record.getValue(PUBLICATIONS.ID);\                String title = record.getValue(PUBLICATIONS.TITLE);\                Long authorID = record.getValue(PUBLICATIONS.AUTHOR_ID);\                String lastName = record.getValue(AUTHORS.LAST_NAME);\                String firstName = record.getValue(AUTHORS.FIRST_NAME);\                String type = record.getValue(TYPES.TYPE);\                String publisher = record.getValue(PUBLISHERS.PUBLISHER);\                Date publishDate = record.getValue(PUBLICATIONS.PUBLISH_DATE);\                }\            }\        catch(Exception exception) {\            exception.printStackTrace();\            }\        }\    }\

\\

注意jOOQ所生成的表名和表的属性名是大写的。完整的jOOQ项目代码可以在GitHub上找到。

\\

Data Geekery GmbH的创始人兼CEO Lukas Eder向InfoQ介绍了最新版的jOOQ。

\\

InfoQ:您当前在Data Geekery的担任什么职责?

\\

\

Eder:我是推出jOOQ产品的Data Geekery公司的创立人和CEO。我还担任SQL和PL/SQL的顾问,主要针对性能优化。我当前正在开展一些SQL培训项目,今年将写出一本关于SQL的书。

\

\\

InfoQ:是什么使得jOOQ不同于Hibernate、Speedment和Apache Torque等其他的Java ORM框架的?

\\

\

Eder:在我个人看来,对比各种框架间的哲学/方法是十分有意思的,将每一个具体的实现看成是一种,嗯……该怎么说呢,实现细节吧。

\\

我认为Java操作RDBMS的方式至多有五类。下面我为每类方法给出几个例子,但实际肯定远远不止这些:

\\

  • 将SQL逻辑从Java中分离处理:例如:MyBatis、厂商特定的存储过程、视图和jOOQ的存储过程等。\\t
  • 将SQL逻辑作为SQL语句字符串嵌入Java中:例如:JDBC、jOOQ的纯SQL、Spring、JDBi、JPA原生查询等。\\t
  • 以SQL为中心的内部领域特定语言(DLS)方式,将SQL逻辑嵌入Java:例如:jOOQ、Criteria API(用于JPQL而非SQL)等。\\t
  • 以“符合语言习惯”的API集合方式,将SQL逻辑嵌入Java:例如:Speedment、JINQ、Slick(Scala编写)、LINQ(.NET编写)等。\\t
  • 通过ORM或活动记录(Active Record),将SQL逻辑嵌入Java:例如:JPA及其实现,包括Hibernate、jOOQ UpdatableRecords、ActiveJDBC等。\

上述各类技术方法各有其优劣之处。jOOQ侧重于前三类方法,因为所有这些方法是以SQL为中心的,即在用户与数据库的交互方式中SQL语言是其重要的组成部分。这些用户不认可由“符合语言习惯”的API集合或ORM所强加的认知障碍,他们只是想编写SQL。

\\

提供支持代码生成的流畅API是jOOQ的主要特性。这些API从高层次上提供了编译时对开发人员的类型安全,无需对SQL语言做过多妥协。对此内部DSL技术,我写过一个博客文章:

\\

https://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course

\\

同时,jOOQ鼓励开发人员:

\\

  • 通过视图和存储过程将业务逻辑推送到数据库。视图和存储过程在jOOQ中同样非常易用。\\t
  • 使用高级标准和厂商特定的SQL特性,这在分析和报表时尤为有用。\\t
  • 以RDBMS为中心的方法思考。当你的系统规模增长超过了微不足道的单客户或十数个表这样规模数据库时,这就是种非常好的工作方式了。\

当然,有意思的是认识到各种方法之间并非必须要相互竞争。很多jOOQ用户也在同一应用中使用Hibernate,例如:

\\

  • 将jOOQ用于分析、ETL、报表和复杂查询。\\t
  • 在一次事务中更新大量实体时,将Hibernate用于辅助CRUD。\

最后一点,作为一种实现方式,jOOQ重视那些寻求精准实现的用户,对于这些用户而言,SQL语言十分重要。并且我也敢于这样说,jOOQ帮助了不少客户理解到,SQL对很多问题而言常是最好的解答,比他们想象的还要好。

\

\\

InfoQ: 您为我们介绍一下使用jOOQ的友商和客户的情况吧?

\\

\

Eder: 一般而言,jOOQ有助于友商和客户超越他人并成为更好的开发人员。让我解释一下。

\\

我时常非常有兴趣去了解我们用户基础的多样性。一开始,我们按自己的做事和思考问题方式设计jOOQ。在创建Data Geekery之前,我供职于一个大型瑞士银行的电子银行系统团队,时至今日我依然帮助他们解决Oracle SQL性能问题。很显然,他们也在Oracle上使用jOOQ。

\\

他们的系统中大约有500多张数据表,其中一些表有数十亿行的数据,数以千计的视图,数百个PL/SQL软件包,并伴以大量的Java代码。大量的业务逻辑是在深度嵌套的SQL视图和过程中实现的。当然,这个系统也可以使用一些其他的方式构建,但是我们的以SQL为中心的系统给出了一个非常优雅的设计,的确在Oracle数据库上运行得很好。

\\

并非所有的公司都有他们那样的复杂数据库,区别jOOQ在这些公司中的应用的是jOOQ为Java/SQL开发所带来的简单性和乐趣。你也知道,SQL是一门古老的语言,所有的关键字和有意思的语法让SQL看上去十分奇特(对此我近期有一篇博文,地址是:https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations/)。

\\

声明式编程使用了受关系代数所启发的编程语言,在声明式编程中存在着大美之处。使用jOOQ可以简单并直观地编写SQL语句,这对于开发人员而言确实是一种激励。我听到的最好的事情(从不少的客户那里!)是jOOQ是如何有助于满足他们的好奇心,去探索最宽广、最激动人心的SQL世界。

\\

换句话说,对于分布在各行各业中才华横溢的客户,我们只是充当他们的催化剂。

\

\\

InfoQ: jOOQ中将会出现哪些特性?

\\

\

Eder: 我们对与SQL有关的所有特性都有兴趣。当前,我们正对一个内建的SQL解析器进行实验(已经添加在3.9版本中)。这样jOOQ“仅仅”是一个SQL表达式树模型库。使用jOOQ构建SQL语句的用户不再需要构建查询字符串,而是构建一个表达式树,这个树会生成SQL字符串。为什么不反其道而行之,将SQL字符串解析为jOOQ表达式树呢?我们这样做,使得用户可以将一种SQL字符串(例如DB2的)转换为另一种的SQL字符串(例如PostgreSQL的)。这是对于遗留数据库是一种多么好用的迁移工具呀!敬请期待!

\\

jOOQ已有内建的SQL转换SPI,可对我们前面到的表达式树进行转换。这里可能给出包括类似于多租户、行级安全、性能优化以及更多的杀手级特性。这些特性在昂贵的商业数据库中是即可使用的,但是在不少开源数据库中却并非如此。我们已经提供了架构,未来我们将提供这样的即可使用特性。

\\

SQL:2011规范中,最令人激动的特性莫过于可以编写时态查询。假定对于一家保险企业,如果某个特定的政策发生了变化。不同于传统的SQL,你不需要使用UPDATE语句去实际更改数据记录,只需为具有不同时效的同一逻辑策略创建一个新纪录。SQL:2011允许清晰地编写一个时态UPDATE语句,同样也适用于时态DELETE语句的编写。我们正探索在所有的数据库中仿效该特性,包括不支持时态查询的数据库(包括除Oracle和DB2之外的大部分数据库)。

\\

我们还有更多的想法。SQL语言是一个庞大的生态系统,我们拥抱一切与SQL相关的事情。因此敬请期待更为激动人心的jOOQ版本!

\

\\

资源

\\

更多的jOOQ相关内容,可参考下列文章:

\\

  • jOOQ入门指南。\\t
  • Spring技巧:jOOQ,Josh Long提供的视频。\\t
  • 一种使用jOOQ实现动态SQL的函数式编程方法,jOOQ的博客帖子。\\t
  • 如何使用JDBC和jOOQ获取Oracle 12c的隐式游标,jOOQ的博客帖子。\

查看英文原文:Data Geekery Releases Version 3.9.0 of jOOQ, a Java ORM Tool for Building Type Safe Queries

\\


感谢冬雨对本文的审校。

\\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。

\\

Data Geekery发布了Java ORM工具jOOQ的3.9.0版,用于构建类型安全查询相关推荐

  1. 我的Java后端书架 (2016年暮春3.0版)

    我的Java后端书架 (2016年暮春3.0版) 书架主要针对Java后端开发. 3.0版把一些后来买的.看的书添补进来,又或删掉或降级一些后来没有再翻开过的书. 更偏爱那些能用简短流畅的话,把少壮不 ...

  2. Persistence4j 1.1发布,Java ORM框架

    近日,Persistence4j 1.1版本发布了,它是一个小型.轻量级的Java 对象持久层类库,实现关系数据库和Java 对象之间的持久化.此版本主要是对bug的修复,点击查看更新详情:http: ...

  3. java myeclipse 下载_myeclipse 10|MyEclipse(优秀的Java开发工具myeclipse下载) 10.7官方版下载 - 下载吧...

    MyEclipse10官方下载是一款非常优秀的Java开发工具.MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错.MyEclipse目前支持Java Servlet ...

  4. 【插件发布】JAVA微服务框架,Jeecg-P3-Biz-OA 1.0.0 插件开源发布

    JAVA微服务框架,Jeecg-P3-Biz-OA 1.0.0 插件开源发布 OA办公插件,采用JEECG-P3微服务框架技术,实现OA办公基本功能,H5页面素材:相册管理.联系人.联系人详细.报表. ...

  5. 【插件发布】JAVA微服务框架,Jeecg-P3-Base-System 1.0.0 插件开源发布

    JAVA微服务框架,Jeecg-P3-Base-System 1.0.0 插件开源发布 系统管理插件,采用JEECG-P3微服务框架技术,实现了P3插件平台支撑的基础功能:用户管理,角色管理.菜单管理 ...

  6. 【插件发布】JAVA微服务框架,Jeecg-P3-Demo 1.0.0 插件开源发布

    JAVA微服务框架,Jeecg-P3-Demo 1.0.0 插件开源发布 Jeecg-P3-Demo项目,采用JEECG-P3微服务框架技术,做了几个常见Demo功能案例:普通列表.树列表.一对多列表 ...

  7. java uninstall tool_java卸载工具|java卸载工具(JavaUninstallTool)下载v1.1.0.0 - 欧普软件下载...

    java卸载工具(JavaUninstallTool)是甲骨文官方发布的一款专门用于卸载JAVA软件的工具,能够非常方便快捷以及彻底的卸载掉JAVA,使用很简单,只需要解压缩即可使用,赶快下载使用吧! ...

  8. 干翻Java_干翻Java!微软跨平台.NET Core 2.0版发布

    跨平台 .NET Core 2.0 版发布" /> 下载 Visual Studio 2017 version 15.3 下载 .NET Core 2.0 下载 Visual Stud ...

  9. 我的Java后端书架 (2016年暖冬4.0版)

    书架主要针对Java后端开发. 3.0版把一些后来买的.看的书添补进来,又或删掉或降级一些后来没有再翻开过的书. 更偏爱那些能用简短流畅的话,把少壮不努力的程序员所需的基础补回来的薄书,而有些教课书可 ...

最新文章

  1. 在Windows7/10上通过VS2013编译FFmpeg 4.1.3源码操作步骤
  2. OKR的落实过程中如何判断设定的OKR是否是合格的OKR?
  3. Gartner2018新技术成熟度曲线:五大技术趋势成为新热点
  4. linux——部署DNS
  5. 基于线性回归的波士顿房价预测
  6. 快速提示:使用Chrome开发工具调试GWT应用程序
  7. android标题栏的属性,android – 属性“titleTextStyle”已经定义?
  8. weka使用训练集分类测试集_Giao 13C NMR计算分类训练集提高结构归属的准确性和可靠性...
  9. Linux内核分析 - 网络[四补]:路由表补充
  10. PHP中去除换行解决办法小结(PHP_EOL)
  11. 从闭包到 语法糖 装饰器
  12. 赛题解读 | 如何基于 Flink + AI 解决疫情防控难题?
  13. 新手请教个问题,有关cocos2d-x
  14. 安卓linux开机画面,Android开机logo简单修改方法
  15. 终极邮件搜索群发大师 v3.47 绿色
  16. 软件设计师 2022年上半年下午题
  17. 小麦苗的常用代码--常用命令(仅限自己使用)
  18. 南昌人武学院计算机室,【志愿者日记】南昌大学人武学院:用行动感染身边的人...
  19. 一款支持http与dubbo协议互相转换的网关
  20. SD-WAN网络加速,开通游戏快车道

热门文章

  1. CKfinder 和 CKEditor 在 ASP.NET 下的配置
  2. yum安装mysql步骤及报错ERROR 1045 (28000)
  3. “私有云”安全的“过渡”时期-“云朵”方案的设计思路
  4. mysql5.6更改datadir数据存储目录
  5. HTTP 错误 404.3 - Forbidden
  6. 代码片段管理器——SnippetsLab
  7. myBaits SQL
  8. Oracle必知基础总结
  9. spring中间scope详细解释
  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(46)-工作流设计-设计分支