文档章节

【译】jOOQ vs MyBatis

Landas
 Landas
发布于 2017/04/07 15:36
字数 859
阅读 446
收藏 2
点赞 1
评论 0

        当下jOOQ和MyBatis都是热门的JPA替代品,相对于JPA来说它们也更加注重于SQL本身。它们之间最明显的区别包括:

  • jOOQ本质上是通过Java流式API使用领域专用语言(domain-specific language)来构造SQL
  • MyBatis则基于XML的SQL模板映射,它的动态SQL是通过XML-DSL生成的

        MyBatis当前的成功大部分是因为JPA本身充满争议(JPA还需要证明自己优于JDO),而MyBatis在这个时间窗提供了一个可选的、容易被SQL爱好者们接受的方案:

  • 将Java与SQL完全分离,SQL代码在一个独立文件中。便于让DBA在生产环境调整、优化SQL。
  • 能自动将结果集封装为对象。和动态sql一样,都是通过xml DSL实现。

用jOOQ实现SQL模板

        jOOQ也能做同样的事情。和MyBatis不同的是,jOOQ的SQL模板(jOOQ 3.2)并没有使用专用的模板语言。将自由选择的权利留给用户自己。目前已集成的包括:

    看一个Velocity的例子。在where查询中加入了一个ID的列表作为动态参数:

SELECT
  a.first_name,
  a.last_name,
  count(*)
FROM
  t_author a
LEFT OUTER JOIN
  t_book b ON a.id = b.author_id
WHERE
  1 = 0
#foreach ($param in $p)
  OR a.id = ?
#end
GROUP BY
  a.first_name,
  a.last_name
ORDER BY
  a.id ASC

        jOOQ的模板实现可以接受上面的模板,使用确定的输入对象来构造具体的jOOQ QueryPart。QueryPart是用于渲染SQL、绑定变量的对象:

class VelocityTemplate
implements org.jooq.Template {
 
  private final String file;
 
  public VelocityTemplate(String file) {
    this.file = file;
  }
 
  @Override
  public QueryPart transform(Object... input) {
 
    // Velocity code
    // -----------------------------------------
    URL url = this.getClass().getResource(
      "/org/jooq/test/_/templates/");
    File file = url.getFile();
 
    VelocityEngine ve = new VelocityEngine();
    ve.setProperty(RESOURCE_LOADER, "file");
    ve.setProperty(FILE_RESOURCE_LOADER_PATH,
      new File(file ).getAbsolutePath());
    ve.setProperty(FILE_RESOURCE_LOADER_CACHE,
      "true");
    ve.init();
 
    VelocityContext context = new VelocityContext();
    context.put("p", input);
 
    StringWriter writer = new StringWriter();
    ve.getTemplate(file, "UTF-8")
      .merge(context, writer);
 
    // jOOQ Code
    // -----------------------------------------
    return DSL.queryPart(writer.toString(), input);
  }
}

        就是这么简单。你可以随意控制自己的模板引擎适配器,向其中自由加入缓存、对象池等等。

        然后上面的模板可以在任何jOOQ API允许使用普通SQL的地方使用了。如一个高层query:

Template tpl = new VelocityTemplate(
    "authors-and-books.vm");
 
DSL.using(configuration)
   .resultQuery(tpl, 1, 2, 3)
   .fetch();

        或者来一个类型安全的DSL嵌套查询:

DSL.using(configuration)
   .select()
   .from(new TableSourceTemplate("my-table.vm"))
   .fetch();

        当然你可以利用jOOQ的结果映射,它允许你实现自定义的表格——对象转换算法。这通常比生硬的XML更加友好(如MyBatis):

List<MyType> result =
DSL.using(configuration)
   .select()
   .from(new TableSourceTemplate("my-table.vm"))
   .fetch(new RecordMapper<Record, MyType>() {
      public MyType map(Record record) {
        // Custom mapping logic here
      }
   });

Java 8:

List<MyType> result =
DSL.using(configuration)
   .select()
   .from(new TableSourceTemplate("my-table.vm"))
   .fetch((Record) -> new MyType().init(record));

可能性是最好的东西

        SQL模板是一个强大的工具。如果你喜欢简单的,基于字符串的SQL,它可以随时调整,比如插入一个小循环或if语句,注入一些动态SQL子句。下面有一些这样的SQL引擎:

        在所有这些工具中,只有jOOQ鼓励用户使用自己的模板引擎,从而为模板扩展性提供无限可能。

© 著作权归作者所有

共有 人打赏支持
Landas
粉丝 3
博文 12
码字总数 39008
作品 0
深圳
程序员
jOOQ 3.11:新增支持四款数据库以及 implicit joins

jOOQ 3.11 已发布,新增支持 4 个新的数据库、implicit joins、诊断等等。 新增支持的数据库 jOOQ 专业版 Aurora MySQL Edition Aurora PostgreSQL Edition Azure SQL Data Warehouse jOOQ 企...

局长 ⋅ 06/08 ⋅ 1

Spring Boot 2.0.3 和 1.5.14 发布,包含 bug 修复和改进

Spring Boot 2.0.3 和 1.5.14 均已发布,可从 repo.spring.io 和 Maven Central 获取更新。 据发布主页显示,两者的更新主要都是修复了 bug,功能改进以及依赖的升级。 Spring Boot 1.5.14 发...

淡漠悠然 ⋅ 06/14 ⋅ 0

分享几个JAVA程序员们最容易犯的错误,你中了几枪?

都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最常犯的几个错误都是什么样的呢?...

启示录是真的 ⋅ 05/25 ⋅ 0

第二章——Spring Boot启动器与依赖管理

强烈推荐选择支持依赖管理和可以发布到“Maven中央”仓库的构建系统。推荐使用Maven或Gradle。Spring Boot可以使用其他构建系统(例如,Ant),但支持得并不是很好。 1 依赖管理 Spring Boo...

Leech ⋅ 02/04 ⋅ 0

10 个精妙的 Java 编码最佳实践

(点击上方公众号,可快速关注) 来源:ImportNew - liken 这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表。和Josh Bloch的列表容易学习并且关注日常情况相比,这...

ImportNew ⋅ 04/15 ⋅ 0

2----Apache的工作模式

本文转自 wpf926 51CTO博客,原文链接:http://blog.51cto.com/wupengfei/1955990,如需转载请自行联系原作者

余二五 ⋅ 2017/11/14 ⋅ 0

Redis Expireat 命令与EXPIREAT命令的区别

Expireat命令- 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 Redis Expire 命令 Redis Expire 命令用于设置 ...

Airship ⋅ 01/22 ⋅ 0

ORM “杀器”之 JOOQ

摘要: 介绍JOOQ简单实用,以及相对于传统ORM框架的不同点。 (图片来自http://www.jooq.org/) 正文: JOOQ是啥? JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可...

力谱宿云 ⋅ 2016/08/30 ⋅ 16

unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:Program Files (x86)UnityEditor 运行exe 点击Browse,选择文件夹C:Program Fil...

王文刚_AR_VR ⋅ 2014/10/28 ⋅ 1

jOOQ 3.2.4/3.3.1 发布,Java 的 ORM 框架

jOOQ 3.2.4 发布,此版本是 jOOQ 3.2 系列的 bug 修复版本。 jOOQ 3.3.1 发布,此版本是 jOOQ 3.3 系列的 bug 修复版本。 jOOQ 高效的合并了复杂SQL、类型安全、源码生成、Active Records、存...

oschina ⋅ 2014/03/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win环境下jdk7与jdk8共存配置

1.jdk安装包 jdk安装包 安装步骤略 2.jdk等配置文件修改 在安装JDK1.8时(本机先安装jdk1.7再安装的jdk1.8),会将java.exe、javaw.exe、javaws.exe三个文件copy到了C:\Windows\System32,这...

泉天下 ⋅ 11分钟前 ⋅ 0

windows profesional 2017 build problem

.net framework .... https://stackoverflow.com/questions/43330915/could-not-load-file-or-assembly-microsoft-build-frameworkvs-2017...

机油战士 ⋅ 45分钟前 ⋅ 0

python3中报错的解决方法(长期更新)

1、ImportError: No module named ‘DjangoUeditor’ 出错原因:安装DjangoUeditor库适用于python2,需要下载适用python3的 下载地址:https://github.com/twz915/DjangoUeditor3 2、python3......

xiaoge2016 ⋅ 50分钟前 ⋅ 0

数据结构与算法之双向链表

一、双向链表 1.双向链表的结点结构 typedef struct DualNode{ ElemType data; struct DualNode *prior; // 前驱结点 struct DualNode *next; // 后继结点}DualNode, *DuL...

aibinxiao ⋅ 今天 ⋅ 0

五大最核心的大数据技术

大数据技术有5个核心部分,数据采集、数据存储、数据清洗、数据挖掘、数据可视化。关于这5个部分,有哪些核心技术?这些技术有哪些潜在价值?看完今天的文章就知道了。 大数据学习群:7165810...

董黎明 ⋅ 今天 ⋅ 0

PhpStorm 头部注释、类注释和函数注释的设置

首先,PhpStorm中文件、类、函数等注释的设置在:setting-》Editor-》FIle and Code Template-》Includes下设置即可,其中方法的默认是这样的: /**${PARAM_DOC}#if (${TYPE_HINT} != "v...

nsns ⋅ 今天 ⋅ 0

spring.net AOP

http://www.springframework.net/doc-latest/reference/html/aop-quickstart.html https://www.cnblogs.com/wujy/archive/2013/04/06/3003120.html AOP系列(一)——ProxyFactoryObject 显式创......

whoisliang ⋅ 今天 ⋅ 0

【HAVENT原创】创建 Dockerfile 生成新的镜像,并发布到 DockerHub

注意:Win7 与 Win10 的版本存在差异,Win7 版本使用 Docker Quickstart Terminal 进入控制台,Win10下面直接用管理员权限打开控制台或者 PowerShell 即可;另外 Win7 下面只能访问 C盘,/ap...

HAVENT ⋅ 今天 ⋅ 0

pom.xml出现web.xml is missing ...解决方案

提示信息应该能看懂。也就是缺少了web.xml文件,<failOnMissingWebXml>被设置成true了。 搜索了一下,Stack Overflow上的答案解决了问题,分享一下。 目前被顶次数最多的回答原文如下: This...

源哥L ⋅ 今天 ⋅ 0

js时间戳与日期格式之间相互转换

1. 将时间戳转换成日期格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己...

Jack088 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部