文档章节

修改jOOQ codegen默认生成类策略

Landas
 Landas
发布于 2017/11/14 19:52
字数 1123
阅读 433
收藏 1

使用默认生成类策略

项目中采用了jOOQ作为ORM框架,并使用jOOQ codegen生成Table,Record和PO。

codegen使用说明请见这里。codegen的gradle配置请见这里

表结构:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

gradle配置:

import groovy.xml.MarkupBuilder
import org.jooq.util.GenerationTool
import javax.xml.bind.JAXB

buildscript {
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath('mysql:mysql-connector-java:5.1.39')
        classpath('org.jooq:jooq-codegen:3.9.1')
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

version = '1.0'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    providedRuntime
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-jooq')
	compile('mysql:mysql-connector-java:5.1.39')
	compile('com.zaxxer:HikariCP:2.6.1')
    compileOnly('org.jooq:jooq-codegen:3.9.1')
}

task jooq_code_generate(type: Task) {
    // Use your favourite XML builder to construct the code generation configuration file
    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
            .configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.9.0.xsd') {
        jdbc() {
            driver('com.mysql.jdbc.Driver')
            url('jdbc:mysql://${IP}:${PORT}?characterEncoding=UTF-8&allowMultiQueries=true')
            user('${username}')
            password('${passwd}')
        }
        generator() {
            database() {
                name('org.jooq.util.mysql.MySQLDatabase')
                inputSchema('${schema}')
                includes("user")
//                excludes("schema_version")
            }
            generate([:]) {
                pojos true
//                daos true
            }
            target() {
                packageName('com.landas.temp')
                directory('src/main/java')
                encoding("UTF-8")
            }
        }
    }

    // Run the code generator
    doLast {
        GenerationTool.generate(
                JAXB.unmarshal(new StringReader(writer.toString()), 
                                    org.jooq.util.jaxb.Configuration.class)
        )
    }
}

此时运行task,生成的po如下:

public class User implements Serializable {

    private static final long serialVersionUID = -1585262004;

    private Integer id;
    private String  userName;

    // omitted...
}

可见codegen将数据库中的下划线自动转换为了驼峰命名。

因为要兼容老接口,必须将userName改为user_name格式。

修改默认策略

打开上面gradle配置中的xmlns定义URL,发现Generator中有strategy配置项:

<complexType name="Generator">
  <all>
    <element name="name" type="string" default="org.jooq.util.DefaultGenerator" minOccurs="0" maxOccurs="1"/>
    <element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1"/>
    <element name="database" type="tns:Database" minOccurs="1" maxOccurs="1"/>
    <element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1"/>
    <element name="target" type="tns:Target" minOccurs="0" maxOccurs="1"/>
  </all>
</complexType>
<complexType name="Strategy">
  <choice>
    <element name="name" type="string" minOccurs="0" maxOccurs="1" default="org.jooq.util.DefaultGeneratorStrategy"/>
    <element name="matchers" type="tns:Matchers" minOccurs="0" maxOccurs="1"/>
  </choice>
</complexType>

查询jOOQ codegen文档,发现确实可以在generator中配置策略。按照文档教程,自定义了策略类AsInDatabaseStratege,添加到generator中,修改后的gradle文件如下:

        // omitted ...
        generator() {
            database() {
                name('org.jooq.util.mysql.MySQLDatabase')
                inputSchema('${schema}')
                includes("user")
//                excludes("schema_version")
            }
            strategy() {
                name('com.landas.AsInDatabaseStrategy')
            }
            generate([:]) {
                pojos true
//                daos true
            }
            target() {
                packageName('com.landas.temp')
                directory('src/main/java')
                encoding("UTF-8")
            }
        }
        // omitted ...

AsInDatabaseStratege类如下,注意几个重写的方法getJavaMemberName/getJavaSetterName等:

import org.jooq.util.DefaultGeneratorStrategy;
import org.jooq.util.Definition;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

/**
 * Created by Landas on 2017/10/17.
 */
public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {

    /**
     * Override this to specifiy what identifiers in Java should look like.
     * This will just take the identifier as defined in the database.
     */
    @Override
    public String getJavaIdentifier(Definition definition) {
        return definition.getOutputName();
    }

    /**
     * Override these to specify what a setter in Java should look like. Setters
     * are used in TableRecords, UDTRecords, and POJOs. This example will name
     * setters "set[NAME_IN_DATABASE]"
     */
    @Override
    public String getJavaSetterName(Definition definition, Mode mode) {
        String name = definition.getOutputName();
        return "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
    }

    /**
     * Just like setters...
     */
    @Override
    public String getJavaGetterName(Definition definition, Mode mode) {
        String name = definition.getOutputName();
        return "get" +  name.substring(0, 1).toUpperCase() + name.substring(1);
    }

    /**
     * Override this method to define what a Java method generated from a database
     * Definition should look like. This is used mostly for convenience methods
     * when calling stored procedures and functions. This example shows how to
     * set a prefix to a CamelCase version of your procedure
     */
    @Override
    public String getJavaMethodName(Definition definition, Mode mode) {
        return "call" + org.jooq.tools.StringUtils.toCamelCase(definition.getOutputName());
    }

    /**
     * Override this method to define how your Java classes and Java files should
     * be named. This example applies no custom setting and uses CamelCase versions
     * instead
     */
    @Override
    public String getJavaClassName(Definition definition, Mode mode) {
        return super.getJavaClassName(definition, mode);
    }

    /**
     * Override this method to re-define the package names of your generated
     * artefacts.
     */
    @Override
    public String getJavaPackageName(Definition definition, Mode mode) {
        return super.getJavaPackageName(definition, mode);
    }

    /**
     * Override this method to define how Java members should be named. This is
     * used for POJOs and method arguments
     */
    @Override
    public String getJavaMemberName(Definition definition, Mode mode) {
        return definition.getOutputName();
    }

    /**
     * Override this method to define the base class for those artefacts that
     * allow for custom base classes
     */
    @Override
    public String getJavaClassExtends(Definition definition, Mode mode) {
        return Object.class.getName();
    }

    /**
     * Override this method to define the interfaces to be implemented by those
     * artefacts that allow for custom interface implementation
     */
    @Override
    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
        return Arrays.asList(Serializable.class.getName(), Cloneable.class.getName());
    }

    /**
     * Override this method to define the suffix to apply to routines when
     * they are overloaded.
     *
     * Use this to resolve compile-time conflicts in generated source code, in
     * case you make heavy use of procedure overloading
     */
    @Override
    public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) {
        return "_OverloadIndex_" + overloadIndex;
    }
}

注意,这个类直接放在项目中gradle任务运行时是引用不到的,会报找不到类的异常:

Execution failed for task ':jooq_code_generate'.
> java.lang.ClassNotFoundException: com.landas.AsInDatabaseStrategy

为了让任务正常运行,需要在项目中新建buildSrc目录,将自定义的类放到buildSrc的src目录下,gradle能自动引用到此目录下的所有类(详情请查询gradle手册)。此时项目结构如下:

buildSrc中的gradle配置如下:

apply plugin: 'groovy'

version=1.0

repositories {
    mavenCentral()
}

dependencies {
    compile('org.jooq:jooq-codegen:3.9.1')
    compile gradleApi()
    compile localGroovy()
}

此时,重新运行 jooq_code_generate 任务,得到期望的结果:

public class User implements Serializable {

    private Integer id;
    private String  user_name;

    // omitted ...

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUser_name() {
        return this.user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    // omitted ...
}

 

© 著作权归作者所有

Landas
粉丝 5
博文 38
码字总数 65405
作品 0
深圳
程序员
私信 提问
jOOQ 1.6.2 发布

jOOQ 高效的合并了复杂SQL、类型安全、源码生成、Active Records、存储过程以及高级数据类型的 Java 类库。 示例代码: 新版本引入三个项目: 1. The project CURSOR is where jOOQ finally ...

红薯
2011/07/11
649
0
jOOQ 3.2.4/3.3.1 发布,Java 的 ORM 框架

jOOQ 3.2.4 发布,此版本是 jOOQ 3.2 系列的 bug 修复版本。 jOOQ 3.3.1 发布,此版本是 jOOQ 3.3 系列的 bug 修复版本。 jOOQ 高效的合并了复杂SQL、类型安全、源码生成、Active Records、存...

oschina
2014/03/08
891
0
ORM “杀器”之 JOOQ

摘要: 介绍JOOQ简单实用,以及相对于传统ORM框架的不同点。 (图片来自http://www.jooq.org/) 正文: JOOQ是啥? JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可...

力谱宿云
2016/08/30
3.6K
16
jOOQ 2.0 发布,轻量级Java的ORM框架

jOOQ 2.0 是 jOOQ 的一个全新开始,主要定位一些长期以来用户强烈要求的需求开发。 jOOQ 高效的合并了复杂SQL、类型安全、源码生成、Active Records、存储过程以及高级数据类型的 Java 类库。...

红薯
2011/11/28
951
0
jOOQ 2.0.1 发布,Java的ORM框架

jOOQ 2.0.1 发布了,这是 2.0 版本的一个维护版,主要是更好的和 Spring Data 进行集成,支持命名参数允许修改已构造的查询对象的绑定值;增强了 MERGE 语句以更好支持 Oracle;另外 jOOQ 已...

红薯
2011/12/24
702
2

没有更多内容

加载失败,请刷新页面

加载更多

比特币转账nodejs

去nodejs官网下载nodejs $ node index.js启动项目

八戒八戒八戒
28分钟前
1
0
Android8.1 SystemUI 之图案锁验证流程

在Keyguard之滑动解锁流程一文中,我们已经分析过,不同的安全锁类型是在KeyguardSecurityContainer中使用getSecurityView根据不同的securityMode inflate出来,并添加到界面上的。那么本文我...

天王盖地虎626
30分钟前
1
0
LNMP 环境搭建(Linux Nginx MariaDB PHP)

安装顺序:MariaDB-->PHP-->Nginx 一、MariaDB安装 官方下载网站:https://downloads.mariadb.org/ 1. 获取MySQL 下载:wget http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.2.8/bintar......

Yue_Chen
33分钟前
1
0
MySQL中授权(grant)和撤销授权(revoke

MySQL中授权(grant)和撤销授权(revoke MySQL 赋予用户权限命令的简单格式可概括为: 1 grant 权限 on 数据库对象 to 用户   一、grant 普通数据用户,查询、插入、更新、删除 数据...

linjin200
36分钟前
1
0
你分得清楚Maven的聚合和继承吗?

用了 Maven 好几年了,许多人还是只懂得简单的依赖坐标。对于 Maven 的聚合和继承还是一知半解,甚至很多人以为是同一个东西。但其实聚合是用于快速构建项目,是表示项目与子项目之间的关系。...

java菜分享
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部