jooq使用自定义策略生成代码(How to use a custom strategy with the jOOQ code-generator and Maven?)

工程结构:
这里写图片描述

  1. generator子模块,用于自定义策略
  2. jooq模块为父模块,用于实现业务

自定义代码生成策略:MyStratege

package com.code.generator.stratege;


import org.jooq.tools.StringUtils;
import org.jooq.util.CatalogDefinition;
import org.jooq.util.DefaultGeneratorStrategy;
import org.jooq.util.Definition;
import org.jooq.util.SchemaDefinition;

public class MyStratege extends DefaultGeneratorStrategy {


    public String getJavaClassName(Definition definition, Mode mode) {
        String name = getFixedJavaClassName(definition);
        return name != null ? name : this.getJavaClassName0(definition, mode);
    }

    private String getJavaClassName0(Definition definition, Mode mode) {
        StringBuilder result = new StringBuilder();
        result.append(StringUtils.toCamelCase(definition.getOutputName().replace(' ', '_').replace('-', '_').replace('.', '_')));
        if (mode == Mode.RECORD) {
            result.append("Record");
        } else if (mode == Mode.DAO) {
            result.append("Dao");
        } else if (mode == Mode.POJO) {
            result.append("Bo");
        } else if (mode == Mode.INTERFACE) {
            result.insert(0, "I");
        }

        return result.toString();
    }

    final String getFixedJavaClassName(Definition definition) {
        if (definition instanceof CatalogDefinition && ((CatalogDefinition) definition).isDefaultCatalog()) {
            return "DefaultCatalog";
        } else {
            return definition instanceof SchemaDefinition && ((SchemaDefinition) definition).isDefaultSchema() ? "DefaultSchema" : null;
        }
    }
}

generator子模块 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.code</groupId>
    <artifactId>generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>generator</name>
    <description>generator code project</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta</artifactId>
            <version>${jooq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen</artifactId>
            <version>${jooq.version}</version>
        </dependency>
    </dependencies>
</project>

jooq的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.study</groupId>
    <artifactId>jooq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>jooq</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/>
    </parent>

    <modules>
        <module>generator</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <jooq.version>3.9.5</jooq.version>
        <mysql.version>6.0.5</mysql.version>
    </properties>

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

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen-maven</artifactId>
                <version>${jooq.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>com.code</groupId>
                        <artifactId>generator</artifactId>
                        <version>0.0.1-SNAPSHOT</version>
                        <scope>system</scope>
                        <systemPath>${project.basedir}/generator/target/generator-0.0.1-SNAPSHOT.jar</systemPath>
                    </dependency>
                </dependencies>
                <configuration>
                    <configurationFile>src/main/resources/jooqConfig.xml</configurationFile>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

jooq代码生成相关配置:src/main/resources/jooqConfig.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <jdbc>
        <driver>com.mysql.cj.jdbc.Driver</driver>
        <url>jdbc:mysql://localhost:3306?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;rewriteBatchedStatements=TRUE&amp;useSSL=false&amp;serverTimezone=UTC</url>
        <user>root</user>
        <password>root</password>
    </jdbc>
    <generator>
        <strategy>
            <name>com.code.generator.stratege.MyStratege</name>
        </strategy>
        <database>
            <name>org.jooq.util.mysql.MySQLDatabase</name>
            <includes>.*</includes>
            <excludes/>
            <inputSchema>world</inputSchema>
            <forcedTypes>
                <forcedType>
                    <name>BOOLEAN</name>
                    <types>(?i:TINYINT(\s*\(\d+\))?(\s*UNSIGNED)?)</types>
                </forcedType>
            </forcedTypes>
        </database>
        <target>
            <packageName>com.study.jooq.db</packageName>
            <directory>src/main/java</directory>
        </target>
        <generate>
            <pojos>true</pojos>
            <daos>true</daos>
            <deprecated>false</deprecated>
        </generate>
    </generator>
</configuration>

使用mvn clean install 进行编译,则可生成代码!

F:\ideaworkplace\jooq>mvn clean install
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.study:jooq:pom:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin[org.jooq:jooq-codegen-maven].dependencies.dependency.systemPath' for com.code:generator:jar refers to a non-existing file F:\ideaworkplace\jooq\generator\target\generator-0.0.1-SNAPS
HOT.jar @ line 89, column 37
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] generator
[INFO] jooq
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building generator 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ generator ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ generator ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory F:\ideaworkplace\jooq\generator\src\main\resources
[INFO] skip non existing resourceDirectory F:\ideaworkplace\jooq\generator\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ generator ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to F:\ideaworkplace\jooq\generator\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ generator ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory F:\ideaworkplace\jooq\generator\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ generator ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ generator ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ generator ---
[INFO] Building jar: F:\ideaworkplace\jooq\generator\target\generator-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ generator ---
[INFO] Installing F:\ideaworkplace\jooq\generator\target\generator-0.0.1-SNAPSHOT.jar to C:\Users\Natasha\.m2\repository\com\code\generator\0.0.1-SNAPSHOT\generator-0.0.1-SNAPSHOT.jar
[INFO] Installing F:\ideaworkplace\jooq\generator\pom.xml to C:\Users\Natasha\.m2\repository\com\code\generator\0.0.1-SNAPSHOT\generator-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jooq 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ jooq ---
[INFO]
[INFO] --- jooq-codegen-maven:3.9.5:generate (default) @ jooq ---
[INFO] Reading external configuration
[INFO] No <inputCatalog/> was provided. Generating ALL available catalogs instead.
[INFO] License parameters
[INFO] ----------------------------------------------------------
[INFO]   Thank you for using jOOQ and jOOQ's code generator
[INFO]
[INFO] Database parameters
[INFO] ----------------------------------------------------------
[INFO]   dialect                : MYSQL
[INFO]   URL                    : jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false&serverTimezone=UTC
[INFO]   target dir             : F:\ideaworkplace\jooq\src/main/java
[INFO]   target package         : com.study.jooq.db
[INFO]   includes               : [.*]
[INFO]   excludes               : []
[INFO]   includeExcludeColumns  : false
[INFO] ----------------------------------------------------------
[INFO]
[INFO] JavaGenerator parameters
[INFO] ----------------------------------------------------------
[INFO]   strategy               : class com.code.generator.stratege.MyStratege
[INFO]   deprecated             : false
[INFO]   generated annotation   : true
[INFO]   JPA annotations        : false
[INFO]   validation annotations : false
[INFO]   instance fields        : true
[INFO]   sequences              : true
[INFO]   udts                   : true
[INFO]   routines               : true
[INFO]   tables                 : true
[INFO]   records                : true
[INFO]   pojos                  : true
[INFO]   immutable pojos        : false
[INFO]   interfaces             : false
[INFO]   immutable interfaces   : false
[INFO]   daos                   : true
[INFO]   relations              : true
[INFO]   table-valued functions : true
[INFO]   global references      : true
[INFO] ----------------------------------------------------------
[INFO]
[INFO] Generation remarks
[INFO] ----------------------------------------------------------
[INFO]
[INFO] ----------------------------------------------------------
[INFO] Generating catalogs      : Total: 1
[INFO]

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@  @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@
@@@@@@@@@@@@@@@@  @@  @@    @@@@@@@@@@
@@@@@@@@@@  @@@@  @@  @@    @@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@
@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@
@@@@@@@@@@        @@  @  @  @@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Thank you for using jOOQ 3.9.5

[INFO] ARRAYs fetched           : 0 (0 included, 0 excluded)
[INFO] Tables fetched           : 3 (3 included, 0 excluded)
[INFO] Enums fetched            : 2 (2 included, 0 excluded)
[INFO] No schema version is applied for catalog . Regenerating.
[INFO]
[INFO] Generating catalog       : DefaultCatalog.java
[INFO] ==========================================================
[INFO] Generating schemata      : Total: 1
[INFO] No schema version is applied for schema world. Regenerating.
[INFO] Generating schema        : World.java
[INFO] ----------------------------------------------------------
[INFO] Sequences fetched        : 0 (0 included, 0 excluded)
[INFO] UDTs fetched             : 0 (0 included, 0 excluded)
[INFO] Generating tables
[INFO] Adding foreign key       : city_ibfk_1 (world.city.CountryCode) referencing KEY_country_PRIMARY
[INFO] Adding foreign key       : countryLanguage_ibfk_1 (world.countrylanguage.CountryCode) referencing KEY_country_PRIMARY
[INFO] Synthetic primary keys   : 0 (0 included, 0 excluded)
[INFO] Overriding primary keys  : 3 (0 included, 3 excluded)
[INFO] Generating table         : City.java [input=city, output=city, pk=KEY_city_PRIMARY]
[INFO] Generating table         : Country.java [input=country, output=country, pk=KEY_country_PRIMARY]
[INFO] Generating table         : Countrylanguage.java [input=countrylanguage, output=countrylanguage, pk=KEY_countrylanguage_PRIMARY]
[INFO] Tables generated         : Total: 690.4ms
[INFO] Generating table POJOs
[INFO] Generating POJO          : CityBo.java
[INFO] Generating POJO          : CountryBo.java
[INFO] Generating POJO          : CountrylanguageBo.java
[INFO] Table POJOs generated    : Total: 720.12ms, +29.72ms
[INFO] Generating DAOs
[INFO] Generating DAO           : CityDao.java
[INFO] Generating DAO           : CountryDao.java
[INFO] Generating DAO           : CountrylanguageDao.java
[INFO] Table DAOs generated     : Total: 731.969ms, +11.848ms
[INFO] Generating table references
[INFO] Table refs generated     : Total: 737.721ms, +5.751ms
[INFO] Generating Keys
[INFO] Keys generated           : Total: 740.715ms, +2.993ms
[INFO] Generating table records
[INFO] Generating record        : CityRecord.java
[INFO] Generating record        : CountryRecord.java
[INFO] Generating record        : CountrylanguageRecord.java
[INFO] Table records generated  : Total: 771.507ms, +30.792ms
[INFO] Generating ENUMs
[INFO] Generating ENUM          : CountryContinent.java
[INFO] Generating ENUM          : CountrylanguageIsofficial.java
[INFO] Enums generated          : Total: 775.367ms, +3.86ms
[INFO] Domains fetched          : 0 (0 included, 0 excluded)
[INFO] Routines fetched         : 0 (0 included, 0 excluded)
[INFO] Generation finished: world: Total: 791.212ms, +15.844ms
[INFO]
[INFO] Removing excess files
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ jooq ---
[INFO] Installing F:\ideaworkplace\jooq\pom.xml to C:\Users\Natasha\.m2\repository\com\study\jooq\0.0.1-SNAPSHOT\jooq-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] generator .......................................... SUCCESS [  1.466 s]
[INFO] jooq ............................................... SUCCESS [  1.662 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.536 s
[INFO] Finished at: 2017-08-13T16:06:15+08:00
[INFO] Final Memory: 33M/391M
[INFO] ------------------------------------------------------------------------
public class JooqGeneratorUtil {
    public static void main(String[] args) throws Exception {
        generate("jooqConfig.xml");
    }

    private static void generate(String xml) throws Exception {
        URL url = JooqGeneratorUtil.class.getClassLoader().getResource(xml);
        String s = URLDecoder.decode(url.getFile(), "utf-8");
        Configuration configuration = JAXB.unmarshal(new File(s), Configuration.class);
        GenerationTool.generate(configuration);
    }
}

猜你喜欢

转载自blog.csdn.net/u013725455/article/details/77145698