使用jOOQ(二)

发表于2020-01-19,长度2726, 331个单词, 7分钟读完
Flag Counter

上一篇《使用jOOQ代替Mybatis》介绍了jOOQ的简单入门,这里介绍一下它的代码生成和更复杂的查询能力。

代码生成器

代码生成器相关的依赖我们已经加入了。然后在pom中使用插件:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.5.0</version>
    <executions>
        <execution>
            <goals><goal>java</goal></goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>org.jooq.util.GenerationTool</mainClass>
        <arguments>
            <argument>jooq.xml</argument>
        </arguments>
        <cleanupDaemonThreads>false</cleanupDaemonThreads>
    </configuration>
</plugin>

这里一方面指定了主类org.jooq.util.GenerationTool,根据版本不同这个类的包可能不同;另一方面指定了运行参数jooq.xml,这是告诉生成器使用什么配置。所以在src/main/resources下创建jooq.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.9.0.xsd">
    <jdbc> <!--数据库连接-->
        <driver>com.mysql.jdbc.Driver</driver>
        <url>jdbc:mysql://localhost:3306</url>
        <user>root</user>
        <password>123456</password>
    </jdbc>
    <generator>
        <name>org.jooq.util.JavaGenerator</name><!--不写默认也是这个-->
        <database>
            <name>org.jooq.util.mysql.MySQLDatabase</name>
            <inputSchema>jooq_test</inputSchema><!--数据库名-->
            <includes>.*</includes>
            <excludes />
        </database>
        <target>
            <packageName>test.generated</packageName><!--生成类所在包-->
            <directory>/Users/.../src/main/java</directory><!--路径-->
        </target>
    </generator>
</configuration>

这样运行该插件会生成一大堆类。其中,Tables类包含了所有的表,Keys类包含了所有的键,还有一个以数据库名称为名字的类。另外每个表都会生成一个类,里面是表的一些信息,比如有哪些字段,字段都以全大写字母表示;此外还有和记录相关的类,都是表名加Record结尾,里面是一些操作字段值的方法。

复杂查询

看一个例子:

Book b = Book.BOOK.as("b");
Author a = Author.AUTHOR.as("a");
BookStore s = BookStore.BOOK_STORE.as("s");
BookToBookStore t = BookToBookStore.BOOK_TO_BOOK_STORE.as("t");

Result<Record3<String, String, Integer>> result =
        create.select(a.FIRST_NAME, a.LAST_NAME, countDistinct(s.NAME))
        .from(a)
        .join(b).on(b.AUTHOR_ID.eq(a.ID))
        .leftJoin(t).on(t.BOOK_ID.eq(b.ID))
        .rightJoin(s).on(t.NAME.eq(s.NAME))
        .groupBy(a.FIRST_NAME, a.LAST_NAME)
        .orderBy(countDistinct(s.NAME).desc())
        .fetch();

表都是单例的,所以提供了全大写的单例工厂方法。

可以看到jooq提供了各种对应SQL语法关键字的方法,应该能满足绝大多数场景。实在找不对对应方法还可以执行字符串sql。



其他更多的API可以参考官方文档:https://www.jooq.org/doc/3.12/manual-single-page/

Written on January 19, 2020
分类: dev, 标签: java database
如果你喜欢,请赞赏! davelet