工程结构:
- generator子模块,用于自定义策略
- 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&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false&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);
}
}