查看: 413|回复: 0

[Java语言] 【jOOQ中文】1. 七个步骤快速入门

发表于 2017-8-9 08:00:01
关于jOOQ

jOOQ: The easiest way to write SQL in Java

jOOQ是一个基于Java编写SQL的工具包,具有:简单、轻量、函数式编程写SQL等独特优势,非常适合敏捷快速迭代开发。

初见jOOQ

使用jOOQ,SQL看起来好像是由Java原生支持的,保留SQL原有的简单。

SQL语句:

  1. SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
  2. FROM AUTHOR
  3. JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
  4. WHERE BOOK.LANGUAGE = 'DE'
  5. AND BOOK.PUBLISHED > DATE '2008-01-01'
  6. GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
  7. HAVING COUNT(*) > 5
  8. ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
  9. LIMIT 2
  10. OFFSET 1
复制代码

java代码

  1. create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
  2. .from(AUTHOR)
  3. .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
  4. .where(BOOK.LANGUAGE.eq("DE"))
  5. .and(BOOK.PUBLISHED.gt(date("2008-01-01")))
  6. .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
  7. .having(count().gt(5))
  8. .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
  9. .limit(2)
  10. .offset(1)
复制代码
一、准备

如果还没有下载,请下载jOOQ:
http://www.jooq.org/download
或者,可是使用Maven:

  1. <dependency>
  2. <groupId>org.jooq</groupId>
  3. <artifactId>jooq</artifactId>
  4. <version>3.9.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.jooq</groupId>
  8. <artifactId>jooq-meta</artifactId>
  9. <version>3.9.5</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.jooq</groupId>
  13. <artifactId>jooq-codegen</artifactId>
  14. <version>3.9.5</version>
  15. </dependency>
复制代码
二、创建数据库

我们要创建一个名为library的数据库,和一个author表,在表中插入zhang3,li4数据。

  1. CREATE DATABASE `library`;
  2. USE `library`;
  3. CREATE TABLE `author` (
  4. `id` int NOT NULL,
  5. `first_name` varchar(255) DEFAULT NULL,
  6. `last_name` varchar(255) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. );
  9. INSERT INTO `author` (`id`, `first_name`, `last_name`) VALUES ('1', '3', 'zhang'), ('2', '4', 'li');
复制代码
三、代码生成

在这一步中,我们将使用jOOQ的命令行工具生成映射到author表的Java类。
有关jOOQ代码生成器的更详细信息,请参见:
jOOQ manual pages about setting up the code generator
代码生成的最简单的方法是将jOOQ的3个jar文件和MySQL Connector jar文件复制到一个临时目录(本示例中目录是test-generated), 然后创建一个如下所示的library.xml(名字随意修改)

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.9.2.xsd">
  3. <!-- Configure the database connection here -->
  4. <jdbc>
  5. <driver>com.mysql.jdbc.Driver</driver>
  6. <!-- 数据库url -->
  7. <url>jdbc:mysql://localhost:3306/library?useUnicode=true&amp;characterEncoding=UTF-8</url>
  8. <!-- 数据库账号 -->
  9. <user>root</user>
  10. <!-- 数据库账号密码 -->
  11. <password>123456</password>
  12. </jdbc>
  13. <generator>
  14. <!-- The default code generator. You can override this one, to generate your own code style.
  15. Supported generators:
  16. - org.jooq.util.JavaGenerator
  17. - org.jooq.util.ScalaGenerator
  18. Defaults to org.jooq.util.JavaGenerator -->
  19. <name>org.jooq.util.JavaGenerator</name>
  20. <database>
  21. <!-- The database type. The format here is:
  22. org.util.[database].[database]Database -->
  23. <name>org.jooq.util.mysql.MySQLDatabase</name>
  24. <!-- The database schema (or in the absence of schema support, in your RDBMS this
  25. can be the owner, user, database name) to be generated -->
  26. <inputSchema>library</inputSchema>
  27. <!-- All elements that are generated from your schema
  28. (A Java regular expression. Use the pipe to separate several expressions)
  29. Watch out for case-sensitivity. Depending on your database, this might be important! -->
  30. <includes>.*</includes>
  31. <!-- All elements that are excluded from your schema
  32. (A Java regular expression. Use the pipe to separate several expressions).
  33. Excludes match before includes, i.e. excludes have a higher priority -->
  34. <excludes></excludes>
  35. </database>
  36. <target>
  37. <!-- The destination package of your generated classes (within the destination directory) -->
  38. <!-- 生成的包名,生成的类在此包下 -->
  39. <packageName>test.generated</packageName>
  40. <!-- The destination directory of your generated classes. Using Maven directory layout here -->
  41. <!-- 输出的目录 -->
  42. <directory>C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java</directory>
  43. </target>
  44. </generator>
  45. </configuration>
复制代码

在Windows中,cd到test-generated目录,执行以下命令:

注意jar包的版本号与您本地对应上,在这个例子中,jOOQ使用3.9.5,MySQL使用5.1.30。

  1. java -classpath jooq-3.9.5.jar;jooq-meta-3.9.5.jar;jooq-codegen-3.9.5.jar;mysql-connector-java-5.1.30.jar; org.jooq.util.GenerationTool library.xml
复制代码

UNIX / Linux / Mac中:

  1. java -classpath jooq-3.9.5.jar:jooq-meta-3.9.5.jar:jooq-codegen-3.9.5.jar:mysql-connector-java-5.1.30.jar: org.jooq.util.GenerationTool library.xml
复制代码

如果一切正常,您应该在控制台输出中看到这些信息:

  1. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  2. 信息: Initialising properties : library.xml
  3. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  4. 信息: No <inputCatalog/> was provided. Generating ALL available catalogs instead.
  5. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  6. 信息: License parameters
  7. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  8. 信息: ----------------------------------------------------------
  9. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  10. 信息: Thank you for using jOOQ and jOOQ's code generator
  11. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  12. 信息:
  13. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  14. 信息: Database parameters
  15. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
  16. 信息: ----------------------------------------------------------
  17. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  18. 信息: dialect : MYSQL
  19. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  20. 信息: URL : jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8
  21. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  22. 信息: target dir : C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java
  23. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  24. 信息: target package : test.generated
  25. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  26. 信息: includes : [.*]
  27. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  28. 信息: excludes : []
  29. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  30. 信息: includeExcludeColumns : false
  31. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  32. 信息: ----------------------------------------------------------
  33. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  34. 信息:
  35. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  36. 信息: JavaGenerator parameters
  37. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  38. 信息: ----------------------------------------------------------
  39. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  40. 信息: strategy : class org.jooq.util.DefaultGeneratorStrategy
  41. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  42. 信息: deprecated : true
  43. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  44. 信息: generated annotation : true
  45. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  46. 信息: JPA annotations : false
  47. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  48. 信息: validation annotations : false
  49. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  50. 信息: instance fields : true
  51. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  52. 信息: sequences : true
  53. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  54. 信息: udts : true
  55. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  56. 信息: routines : true
  57. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  58. 信息: tables : true
  59. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  60. 信息: records : true
  61. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  62. 信息: pojos : false
  63. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  64. 信息: immutable pojos : false
  65. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  66. 信息: interfaces : false
  67. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  68. 信息: immutable interfaces : false
  69. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  70. 信息: daos : false
  71. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  72. 信息: relations : true
  73. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  74. 信息: table-valued functions : true
  75. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  76. 信息: global references : true
  77. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  78. 信息: ----------------------------------------------------------
  79. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  80. 信息:
  81. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  82. 信息: Generation remarks
  83. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  84. 信息: ----------------------------------------------------------
  85. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  86. 信息:
  87. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  88. 信息: ----------------------------------------------------------
  89. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  90. 信息: Generating catalogs : Total: 1
  91. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  92. 信息:
  93. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  94. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  95. @@@@@@@@@@@@@@@@ @@ @@@@@@@@@@
  96. @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@
  97. @@@@@@@@@@@@@@@@ @@ @@ @@@@@@@@@@
  98. @@@@@@@@@@ @@@@ @@ @@ @@@@@@@@@@
  99. @@@@@@@@@@ @@ @@@@@@@@@@
  100. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  101. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  102. @@@@@@@@@@ @@ @@@@@@@@@@
  103. @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@
  104. @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@
  105. @@@@@@@@@@ @@ @ @ @@@@@@@@@@
  106. @@@@@@@@@@ @@ @@@@@@@@@@
  107. @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@
  108. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  109. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Thank you for using jOOQ 3.9.5
  110. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  111. 信息: ARRAYs fetched : 0 (0 included, 0 excluded)
  112. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  113. 信息: Enums fetched : 0 (0 included, 0 excluded)
  114. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  115. 信息: Packages fetched : 0 (0 included, 0 excluded)
  116. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  117. 信息: Routines fetched : 0 (0 included, 0 excluded)
  118. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  119. 信息: Tables fetched : 1 (1 included, 0 excluded)
  120. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  121. 信息: No schema version is applied for catalog . Regenerating.
  122. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  123. 信息:
  124. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  125. 信息: Generating catalog : DefaultCatalog.java
  126. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  127. 信息: ==========================================================
  128. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  129. 信息: Generating schemata : Total: 1
  130. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  131. 信息: No schema version is applied for schema library. Regenerating.
  132. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  133. 信息: Generating schema : Library.java
  134. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  135. 信息: ----------------------------------------------------------
  136. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  137. 信息: Sequences fetched : 0 (0 included, 0 excluded)
  138. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  139. 信息: UDTs fetched : 0 (0 included, 0 excluded)
  140. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  141. 信息: Generating tables
  142. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  143. 信息: Synthetic primary keys : 0 (0 included, 0 excluded)
  144. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  145. 信息: Overriding primary keys : 1 (0 included, 1 excluded)
  146. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  147. 信息: Generating table : Author.java [input=author, output=author, pk=KEY_author_PRIMARY]
  148. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  149. 信息: Tables generated : Total: 819.168ms
  150. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  151. 信息: Generating table references
  152. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  153. 信息: Table refs generated : Total: 827.491ms, +8.323ms
  154. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  155. 信息: Generating Keys
  156. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  157. 信息: Keys generated : Total: 835.486ms, +7.995ms
  158. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  159. 信息: Generating table records
  160. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  161. 信息: Generating record : AuthorRecord.java
  162. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  163. 信息: Table records generated : Total: 854.667ms, +19.18ms
  164. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  165. 信息: Domains fetched : 0 (0 included, 0 excluded)
  166. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  167. 信息: Generation finished: library: Total: 860.822ms, +6.155ms
  168. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  169. 信息:
  170. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
  171. 信息: Removing excess files
复制代码
四、连接到您的数据库

我们在工程中编写一个测试类Main.java:

  1. package test.generated;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. /**
  5. * 测试类
  6. * Created by jan on 2017/7/30.
  7. */
  8. public class Main {
  9. public static void main(String[] args) {
  10. // 用户名
  11. String userName = "root";
  12. // 密码
  13. String password = "123456";
  14. // mysql连接url
  15. String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8";
  16. // Connection is the only JDBC resource that we need
  17. // PreparedStatement and ResultSet are handled by jOOQ, internally
  18. try (Connection conn = DriverManager.getConnection(url, userName, password)) {
  19. // ...
  20. }
  21. // For the sake of this tutorial, let's keep exception handling simple
  22. catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
复制代码

这是一个标准的JDBC MySQL连接代码。

五、查询

我们使用jOOQ的DSL构建出一个简单查询:

  1. DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
  2. Result<Record> result = create.select().from(AUTHOR).fetch();
复制代码

传入Connection连接对象、数据方言得到一个DSLContext的实例,然后使用DSL对象查询得到一个Result对象。

注意:DSLContext不会主动关闭连接,需要我们手动关闭。

六、输出结果

得到Result对象后,循环输出结果集:

  1. for (Record r : result) {
  2. Integer id = r.getValue(AUTHOR.ID);
  3. String firstName = r.getValue(AUTHOR.FIRST_NAME);
  4. String lastName = r.getValue(AUTHOR.LAST_NAME);
  5. System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
  6. }
复制代码

完成的代码应该是这样的:

  1. package test.generated;
  2. import org.jooq.DSLContext;
  3. import org.jooq.Record;
  4. import org.jooq.Result;
  5. import org.jooq.SQLDialect;
  6. import org.jooq.impl.DSL;
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import static test.generated.tables.Author.AUTHOR;
  10. /**
  11. * 测试类
  12. * Created by jan on 2017/7/30.
  13. */
  14. public class Main {
  15. public static void main(String[] args) {
  16. // 用户名
  17. String userName = "root";
  18. // 密码
  19. String password = "123456";
  20. // mysql连接url
  21. String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8";
  22. // Connection is the only JDBC resource that we need
  23. // PreparedStatement and ResultSet are handled by jOOQ, internally
  24. try (Connection conn = DriverManager.getConnection(url, userName, password)) {
  25. DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
  26. Result<Record> result = create.select().from(AUTHOR).fetch();
  27. for (Record r : result) {
  28. Integer id = r.getValue(AUTHOR.ID);
  29. String firstName = r.getValue(AUTHOR.FIRST_NAME);
  30. String lastName = r.getValue(AUTHOR.LAST_NAME);
  31. /**
  32. * 控制台输出
  33. * ID: 1 first name: 3 last name: zhang
  34. * ID: 2 first name: 4 last name: li
  35. */
  36. System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
  37. }
  38. // 关闭连接对象
  39. conn.close();
  40. }
  41. // For the sake of this tutorial, let's keep exception handling simple
  42. catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
复制代码

七、更多示例

jOOQ已经是一个全面的SQL库,更多学习文档请参考:

http://www.jooq.org/learn

http://www.jooq.org/javadoc/l...

http://ikaisays.com/2011/11/0...


【jOOQ中文】教程代码都会放在码云,希望多多宣传给Star(^_?)☆。

https://gitee.com/xujian_jaso...



回复

使用道具 举报