摘要:關于是一個基于編寫的工具包,具有簡單輕量函數式編程寫等獨特優勢,非常適合敏捷快速迭代開發。三代碼生成在這一步中,我們將使用的命令行工具生成映射到表的類。注意不會主動關閉連接,需要我們手動關閉。
關于jOOQ
jOOQ: The easiest way to write SQL in Java
jOOQ是一個基于Java編寫SQL的工具包,具有:簡單、輕量、函數式編程寫SQL等獨特優勢,非常適合敏捷快速迭代開發。
初見jOOQ使用jOOQ,SQL看起來好像是由Java原生支持的,保留SQL原有的簡單。
SQL語句:
SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID WHERE BOOK.LANGUAGE = "DE" AND BOOK.PUBLISHED > DATE "2008-01-01" GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME HAVING COUNT(*) > 5 ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST LIMIT 2 OFFSET 1
Java代碼:
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count()) .from(AUTHOR) .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID)) .where(BOOK.LANGUAGE.eq("DE")) .and(BOOK.PUBLISHED.gt(date("2008-01-01"))) .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .having(count().gt(5)) .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst()) .limit(2) .offset(1)一、準備
如果還沒有下載,請下載jOOQ:
http://www.jooq.org/download
或者,可是使用Maven:
二、創建數據庫org.jooq jooq 3.9.5 org.jooq jooq-meta 3.9.5 org.jooq jooq-codegen 3.9.5
我們要創建一個名為library的數據庫,和一個author表,在表中插入zhang3,li4數據。
CREATE DATABASE `library`; USE `library`; CREATE TABLE `author` ( `id` int NOT NULL, `first_name` varchar(255) DEFAULT NULL, `last_name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ); 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(名字隨意修改):
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8 root 123456 org.jooq.util.JavaGenerator org.jooq.util.mysql.MySQLDatabase library .* test.generated C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java
在Windows中,cd到test-generated目錄,執行以下命令:
注意jar包的版本號與您本地對應上,在這個例子中,jOOQ使用3.9.5,MySQL使用5.1.30。
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中:
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
如果一切正常,您應該在控制臺輸出中看到這些信息:
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: Initialising properties : library.xml 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: No四、連接到您的數據庫was provided. Generating ALL available catalogs instead. 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: License parameters 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: Thank you for using jOOQ and jOOQ"s code generator 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: Database parameters 七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: dialect : MYSQL 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: URL : jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: target dir : C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: target package : test.generated 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: includes : [.*] 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: excludes : [] 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: includeExcludeColumns : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: JavaGenerator parameters 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: strategy : class org.jooq.util.DefaultGeneratorStrategy 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: deprecated : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: generated annotation : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: JPA annotations : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: validation annotations : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: instance fields : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: sequences : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: udts : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: routines : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: tables : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: records : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: pojos : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: immutable pojos : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: interfaces : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: immutable interfaces : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: daos : false 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: relations : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: table-valued functions : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: global references : true 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generation remarks 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating catalogs : Total: 1 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@ @@ @@ @@@@@@@@@@ @@@@@@@@@@ @@@@ @@ @@ @@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@ @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@ @@@@@@@@@@ @@ @ @ @@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Thank you for using jOOQ 3.9.5 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ARRAYs fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Enums fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Packages fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Routines fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Tables fetched : 1 (1 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: No schema version is applied for catalog . Regenerating. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating catalog : DefaultCatalog.java 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ========================================================== 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating schemata : Total: 1 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: No schema version is applied for schema library. Regenerating. 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating schema : Library.java 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: ---------------------------------------------------------- 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Sequences fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: UDTs fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating tables 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Synthetic primary keys : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Overriding primary keys : 1 (0 included, 1 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating table : Author.java [input=author, output=author, pk=KEY_author_PRIMARY] 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Tables generated : Total: 819.168ms 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating table references 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Table refs generated : Total: 827.491ms, +8.323ms 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating Keys 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Keys generated : Total: 835.486ms, +7.995ms 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating table records 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generating record : AuthorRecord.java 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Table records generated : Total: 854.667ms, +19.18ms 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Domains fetched : 0 (0 included, 0 excluded) 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Generation finished: library: Total: 860.822ms, +6.155ms 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info 信息: Removing excess files
我們在工程中編寫一個測試類Main.java:
package test.generated; import java.sql.Connection; import java.sql.DriverManager; /** * 測試類 * Created by jan on 2017/7/30. */ public class Main { public static void main(String[] args) { // 用戶名 String userName = "root"; // 密碼 String password = "123456"; // mysql連接url String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need // PreparedStatement and ResultSet are handled by jOOQ, internally try (Connection conn = DriverManager.getConnection(url, userName, password)) { // ... } // For the sake of this tutorial, let"s keep exception handling simple catch (Exception e) { e.printStackTrace(); } } }
這是一個標準的JDBC MySQL連接代碼。
五、查詢我們使用jOOQ的DSL構建出一個簡單查詢:
DSLContext create = DSL.using(conn, SQLDialect.MYSQL); Resultresult = create.select().from(AUTHOR).fetch();
傳入Connection連接對象、數據方言得到一個DSLContext的實例,然后使用DSL對象查詢得到一個Result對象。
六、輸出結果注意:DSLContext不會主動關閉連接,需要我們手動關閉。
得到Result對象后,循環輸出結果集:
for (Record r : result) { Integer id = r.getValue(AUTHOR.ID); String firstName = r.getValue(AUTHOR.FIRST_NAME); String lastName = r.getValue(AUTHOR.LAST_NAME); System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName); }
完成的代碼應該是這樣的:
package test.generated; import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.impl.DSL; import java.sql.Connection; import java.sql.DriverManager; import static test.generated.tables.Author.AUTHOR; /** * 測試類 * Created by jan on 2017/7/30. */ public class Main { public static void main(String[] args) { // 用戶名 String userName = "root"; // 密碼 String password = "123456"; // mysql連接url String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need // PreparedStatement and ResultSet are handled by jOOQ, internally try (Connection conn = DriverManager.getConnection(url, userName, password)) { DSLContext create = DSL.using(conn, SQLDialect.MYSQL); Resultresult = create.select().from(AUTHOR).fetch(); for (Record r : result) { Integer id = r.getValue(AUTHOR.ID); String firstName = r.getValue(AUTHOR.FIRST_NAME); String lastName = r.getValue(AUTHOR.LAST_NAME); /** * 控制臺輸出 * ID: 1 first name: 3 last name: zhang * ID: 2 first name: 4 last name: li */ System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName); } // 關閉連接對象 conn.close(); } // For the sake of this tutorial, let"s keep exception handling simple catch (Exception e) { e.printStackTrace(); } } }
七、更多示例
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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67526.html
摘要:一簡介什么是是獨立于數據庫的應用管理跟蹤數據庫變更的數據庫版本管理工具。當升級完成時,數據庫表結構及數據應當與升級后的產品版本保持一致。 在執行數據庫遷移時,我們推薦使用jOOQ與Flyway - 數據庫遷移輕松。 在本章中,我們將簡單的來使用這兩個框架。 一、Flyway簡介 showImg(https://segmentfault.com/img/bVSjro?w=400&h=31...
摘要:在這個例子中,我們將整合但您也可以使用其他連接池,如,,等。作為構建和執行。 jOOQ和Spring很容易整合。 在這個例子中,我們將整合: Alibaba Druid(但您也可以使用其他連接池,如BoneCP,C3P0,DBCP等)。 Spring TX作為事物管理library。 jOOQ作為SQL構建和執行library。 一、準備數據庫 DROP TABLE IF EXIS...
摘要:摘要介紹簡單實用,以及相對于傳統框架的不同點。最令人滿意的就是在實際使用過程中解決問題的靈活性。當前在數據服務組擔任開發工程師,主要負責服務器開發。 摘要 介紹JOOQ簡單實用,以及相對于傳統ORM框架的不同點。 showImg(https://segmentfault.com/img/remote/1460000006763840); (圖片來自http://www.jooq.org...
摘要:摘要介紹簡單實用,以及相對于傳統框架的不同點。最令人滿意的就是在實際使用過程中解決問題的靈活性。當前在數據服務組擔任開發工程師,主要負責服務器開發。 摘要 介紹JOOQ簡單實用,以及相對于傳統ORM框架的不同點。 showImg(https://segmentfault.com/img/remote/1460000006763840); (圖片來自http://www.jooq.org...
閱讀 3159·2021-10-14 09:42
閱讀 3564·2019-08-26 13:56
閱讀 3444·2019-08-26 11:59
閱讀 938·2019-08-23 18:00
閱讀 2196·2019-08-23 17:51
閱讀 3522·2019-08-23 17:17
閱讀 1479·2019-08-23 15:11
閱讀 5145·2019-08-23 15:05