乐趣区

关于springboot:个人学习系列-Spring-Boot整合Jooq

之前应用的都是 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 的代码生成了。

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 的代码

生成代码目录解析:

├─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. 运行代码,测试喽

能够发现曾经返回失常的数据,示意咱们框架搭建胜利了。

前面会再增加其余的办法,明天就先简略搭建一个框架喽,也能够本人看一下教程学习一下。

集体博客地址

http://www.zhouzhaodong.xyz/

Github 代码地址

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

退出移动版