之前使用的都是Spring Boot + Mybatis或者Hibernate进行数据库相关的开发,可是这些框架对于联表查询等又不是很友好,最近发现了一个Jooq框架,据说很好用。。。

搭建Spring Boot项目

这个搭建方式我也就不在赘述了,不可能不会的吧?

pom.xml文件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jooq</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--jooq 需要的meta和生成代码的codegen包
            这里注意查看spring-boot-starter-jooq 中的jooq是什么版本-->
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta</artifactId>
            <version>3.13.4</version>
        </dependency>

        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen</artifactId>
            <version>3.13.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 代码生成器插件 -->
            <plugin>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen-maven</artifactId>
                <version>3.13.4</version>
                <configuration>
                    <!-- 配置jdbc驱动连接 -->
                    <jdbc>
                        <driver>com.mysql.cj.jdbc.Driver</driver>
                        <url>jdbc:mysql://IP地址:3306/jooq?serverTimezone=GMT%2B8</url>
                        <user>用户名</user>
                        <password>密码</password>
                    </jdbc>
                    <generator>
                        <database>
                            <!-- 生成包含,*表示包含所有内容 -->
                            <includes>.*</includes>
                            <!-- 数据库名 -->
                            <inputSchema>jooq</inputSchema>
                        </database>
                        <target>
                            <!-- 生成的代码所在的包结构 -->
                            <packageName>xyz.zhouzhaodong.jooq.dao</packageName>
                            <!-- 生成的代码存放路径,默认会以src同目录开始 -->
                            <directory>/src/main/java</directory>
                        </target>
                    </generator>
                </configuration>
            </plugin>
        </plugins>
    </build>

1. 代码生成模块整合进pom.xml里面

里面包含了代码生成模块,可以在maven里面一键生成代码,这里需要注意的是,每次生成代码会覆盖之前的代码,也就是每次都是根据数据库生成最新的代码。

配置好更新maven之后就会发现里面有jooq的代码生成了。
image.png

2. 代码生成模块单独写工具类

如果不想在pom.xml里面加入代码生成模块的话,我们还是可以将其分离出来的:

/**
 * 代码生成器
 *
 * @author zhouzhaodong
 */
public class JOOQGenerator extends JavaGenerator {


    private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    private static final String JDBC_URL = "jdbc:mysql://IP地址:3306/jooq?useUnicode=true&characterEncoding=utf8";
    private static final String JDBC_USERNAME = 用户名;
    private static final String JDBC_PASSWORD = 密码;

    private static final String JOOQ_DATABASE_NAME = "org.jooq.meta.jdbc.JDBCDatabase";

    private static final String GENERATOR_PATH = "src/main/java";

    public static void genTables(String schemaName, String packageName, String includes, String excludes) throws Exception {

        Jdbc jdbc = createJdbc();
        Generator generator = createGenerator(schemaName, packageName, includes, excludes);

        Configuration configuration = new Configuration()
                .withJdbc(jdbc)
                .withGenerator(generator);

        GenerationTool.generate(configuration);

    }

    private static Generator createGenerator(String schemaName, String packageName, String includes, String excludes) {

        Database database = createDatabase(schemaName, includes, excludes);
        Target target = createTarget(packageName);
        Generate generate = createGenerate();

        return new Generator()
                .withDatabase(database)
                .withTarget(target)
                .withGenerate(generate);
    }

    private static Jdbc createJdbc() {
        return new Jdbc()
                .withDriver(JDBC_DRIVER)
                .withUrl(JDBC_URL)
                .withUser(JDBC_USERNAME)
                .withPassword(JDBC_PASSWORD);
    }

    private static Target createTarget(String packageName) {

        return new Target().withDirectory(GENERATOR_PATH).withPackageName(packageName);
    }

    private static Database createDatabase(String schemaName, String includes, String excludes) {
        Database database = new Database().withName(JOOQ_DATABASE_NAME).withInputSchema(schemaName);
        if (includes != null && !"".equals(includes)) {
            database.withIncludes(includes);
        }

        if (excludes != null && !"".equals(excludes)) {
            database.withExcludes(excludes);
        }
        return database;
    }

    private static Generate createGenerate() {
        Generate generate = new Generate();
        generate.withDaos(false)
                .withPojos(true);
        return generate;
    }

    private static void generate() throws Exception {
        genTables("jooq", "xyz.zhouzhaodong.jooq.code", ".*", "");
    }

    public static void main(String[] args) throws Exception {
        generate();
    }

}

application.yml

server:
  port: 9999 # 端口号
spring:
  # 数据库连接信息
  datasource:
    url: jdbc:mysql://ip地址:3306/jooq?useUnicode=true&characterEncoding=utf8
    username: 用户名
    password: 密码

自动生成代码

我们这里使用第一种方式生成Jooq的代码
image.png

生成代码目录解析:

├─src/main/java/.../dao     ---- // 生成路径
│ ├─tables --------------------- // 表定义目录
│ │ ├─Jooq --------------------- // jooq 表描述包含: 字段,主键,索引,所属Schema
│ │ └─records ------------------ // 表操作对象目录
│ │   └─JooqRecord   ----------- // jooq 表操作对象,包含字段get,set方法
│ ├─DefaultCatalog ------------- // Catalog对象,包含Schema常量
│ ├─Keys ----------------------- // 当前数据库所有表主键,唯一索引等常量
│ ├─Jooq ----------------------- // 数据库`jooq`常量,包含该库所有表描述常量
│ └─Tables --------------------- // 所有数据库表常量

开发喽

1. 新建实体类

/**
 * 实体类
 *
 * @author zhouzhaodong
 */
public class JooqPojo {

    private String name;

    private Integer age;

    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

2. 新建service

我们这里写一个简单的查询:

public interface JooqService {

    /**
     * 根据姓名查询
     * @param name
     * @return
     */
    JooqPojo selectByName(String name);

}

3. 新建serviceImpl

@Service
public class JooqServiceImpl implements JooqService {

    @Resource
    DSLContext dslContext;

    Jooq jooq = Jooq.JOOQ_.as("jooq");

    @Override
    public JooqPojo selectByName(String name) {
        return dslContext.select()
                .from(jooq)
                .where(jooq.NAME.eq(name)).fetchAny(r -> r.into(JooqPojo.class));
    }
}

4. 新建controller

/**
 * 控制层
 *
 * @author zhouzhaodong
 */
@RestController
public class JooqController {

    @Resource
    JooqService jooqService;

    @RequestMapping("/selectByName")
    public JooqPojo selectByName(String name) {
        return jooqService.selectByName(name);
    }

}

5. 运行代码,测试喽

可以发现已经返回正常的数据,表示我们框架搭建成功了。
image.png

后面会再添加其他的方法,今天就先简单搭建一个框架喽,也可以自己看一下教程学习一下。

Github代码地址

https://github.com/zhouzhaodong/springboot/tree/master/jooq

上一篇 下一篇