jooq sql
这篇文章最初发表在jooq.org上 ,这是一个博客,从jOOQ的角度着眼于所有开源,Java和软件开发。
SQL是唯一真正流行和成熟的4GL(第四代编程语言) 。 即,它是唯一流行的声明性语言。
同时,SQL已证明图灵完整性不保留给诸如C,C ++或Java之类的较小语言。 自从SQL:1999及其分层的公用表表达式以来, 可以将SQL安全地视为“图灵完善” 。 这意味着任何程序都可以用SQL编写。 不相信吗? 以这个SQL Mandelbrot集计算为例,可以在此Stack Overflow问题中看到 。
![来源:http://stackoverflow.com/q/314864/521799上的用户Elie](https://i-blog.csdnimg.cn/blog_migrate/5d404b227a4bb329b7872f9593f98f6c.png)
来源:http://stackoverflow.com/q/314864/521799上的用户Elie
精彩! 不再需要程序和面向对象的任务。
到目前为止,我们怎么错了…
在Data Geekery ( jOOQ背后的公司 ),我们喜欢SQL。 而且我们喜欢Java。 但是过去一件事一直困扰着我们。 Java并不是真正的纯声明性语言。 对于开明的声明式程序员而言,许多Java语言构造都是真正的反模式。 例如:
1个
2
3
4
5
6
7
8
9
10
11
|
// This is bad
for (String string : strings)
System.out.println(string);
// This is even worse
try {
someSQLStatements();
}
catch (SQLException e) {
someRecovery();
}
|
以上代码的命令式样式几乎没有用处。 程序员需要单调乏味地告诉Java编译器和JVM他们打算实现什么算法,直到单个语句,而实际上,实际上并不需要使用JIT和其他高级优化技术。
幸运的是,有注释
但是,从Java 5开始,专家组中就有远见卓识的人在Java语言中添加了一个强大的新概念:Annotations( 更多信息,请参见此处 )。 首先,仅使用少数有限使用的注释进行实验,例如:
-
@Override
-
@SuppressWarnings
但是,然后,更多有远见的人开始将这些注释结合起来,以完全声明性的形式形成类似组件的内容 :
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Path ( "/MonsterRest" )
@Stateless
@WebServlet (urlPatterns = "/MonsterServlet" )
@Entity
@Table (name = "MonsterEntity" )
@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
@NamedQuery (name = "findAll" , query = "SELECT c FROM Book c" )
public class Book extends HttpServlet {
// ======================================
// = Attributes =
// ======================================
@Id
@GeneratedValue
private Long id;
private String isbn;
private Integer nbOfPage;
private Boolean illustrations;
private String contentLanguage;
@Column (nullable = false )
@Size (min = 5 , max = 50 )
@XmlElement (nillable = false )
private String title;
private Float price;
@Column (length = 2000 )
@Size (max = 2000 )
private String description;
@ElementCollection
@CollectionTable (name = "tags" )
private List<String> tags = new ArrayList<>();
|
看这个美女。 归功于Antonio Goncalves
但是,我们仍然认为上面有很多不必要的面向对象的膨胀。 幸运的是,使Java注释完全完成( 甚至是有感觉? )的最新创新现在终于可以使我们改善这种情况,特别是对于jOOQ而言,其目的是在Java中建模声明性SQL语言。 最后,注释非常合适!
这些创新是:
- Java 8重复注释
- Spring
@AliasFor
注释 (很少有人意识到这是注释类型系统理论的改变者)
这些创新使我们能够完全重新实现整个jOOQ 4.0 API,以允许用户按以下方式编写SQL:
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Select ({
@Column ( "FIRST_NAME" ),
@Column ( "LAST_NAME" )
})
@From (
table = @Table ( "AUTHOR" ),
join = @Join ( "BOOK" ),
predicate = @On (
left = @Column ( "AUTHOR.ID" ),
op = @Eq ,
right = @Column ( "BOOK.AUTHOR_ID" )
)
)
@Where (
predicate = @Predicate predicate = (
left = @Column ( "BOOK.TITLE" ),
op = @Like ,
right = @Value ( "%Annotations in a Nutshell%" @Value "%Annotations in a Nutshell%" )
)
)
class SQLStatement {}
|
就像JPA一样,这使jOOQ现在通过使用注释完全透明和声明式。 现在,开发人员将能够完全毫不费力地将其从中级到高度复杂SQL查询转换为与jOOQ批注完全相同的查询。
不用担心,我们将提供迁移脚本,以将您的旧版jOOQ 3.x应用程序升级到4.0。 一个正在运行的原型正在开发中,预计将很快发布,非常欢迎早期采用者的反馈,敬请期待更多令人兴奋SQL优点!
jooq sql