【问题标题】:jOOQ - Does jOOQ support definition files or creation of SQL creation scripts?jOOQ - jOOQ 是否支持定义文件或创建 SQL 创建脚本?
【发布时间】:2016-02-17 22:52:57
【问题描述】:

在我们的项目中,concepts 在配置文件中定义。举个例子:

<concepts>
    <concept name="person">
        <property name="age" type="integer"/>
        ...
    </concept>
    ...
</concepts>

虽然这和SQL关系不大,但是这个配置文件恰好可以映射到SQL表、列……

从这个配置文件开始,我需要能够做两件事:

  • 生成 SQL 创建脚本 (CREATE TABLE person ( ... ))。
  • 开发人员可以使用的 jOOQ POJO、表等生成

我想在这个项目中开始使用 jOOQ。 jOOQ 是否支持不从现有数据库开始的任何类型的生成(SQL 创建脚本及其 POJO、表……)?我浏览了文档,但找不到太多内容。

如果不是,我正在考虑两种选择:

  1. 基于配置文件生成 jOOQ POJO、表等(自定义开发)
  2. 基于 jOOQ POJO、表等生成 SQL 创建脚本,如步骤 1 中生成的(自定义开发)

  1. 基于配置文件生成SQL创建脚本(自定义开发)
  2. 在可嵌入的数据库中执行这些脚本,例如 H2 或 SQLite(非常简单)(虽然脚本也将在“真实”数据库中执行,但最好在此处使用内存数据库,以避免任何依赖)
  3. 基于此数据库生成 jOOQ POJO、表等(由 jOOQ 库提供)

虽然我认为第一个选项需要更多的努力,但目前我更喜欢它,因为第二个选项中的第 3 步可能会导致信息丢失。

【问题讨论】:

    标签: java sql xml code-generation jooq


    【解决方案1】:

    这显然应该用 XSLT 解决

    生成 SQL 脚本:

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:template match="/">
            <result>
                <xsl:apply-templates select="concepts/concept"/>
            </result>
        </xsl:template>
    
        <xsl:template match="concept">
            <xsl:text>CREATE TABLE </xsl:text>
            <xsl:value-of select="@name"/>
            <xsl:text>(</xsl:text>
            <xsl:apply-templates select="property"/>
            <xsl:text>
    );
    </xsl:text>
        </xsl:template>
    
        <xsl:template match="property">
            <xsl:choose>
                <xsl:when test="position() > 1">
                    <xsl:text>
    , </xsl:text>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>
      </xsl:text>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:value-of select="@name"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="@type"/>
        </xsl:template>
    </xsl:stylesheet>
    

    生成 jOOQ 元 XML

    jOOQ-meta 支持使用 XMLDatabase 从 XML 导入模式元信息

    <configuration>
        <generator>
            <database>
                <name>org.jooq.util.xml.XMLDatabase</name>
                <properties>
                    <property>
                        <key>dialect</key>
                        <value>ORACLE</value>
                    </property>
                    <property>
                        <key>xml-file</key>
                        <value>src/main/resources/concepts-transformed.xml</value>
                    </property>
                </properties>
    

    只需将您的 XML 文件转换为以下格式: http://www.jooq.org/xsd/jooq-meta-3.5.4.xsd

    ... 例如使用以下 XSLT:

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:variable name="schema" select="'MY_SCHEMA'"/>
    
        <xsl:template match="/">
            <information_schema xmlns="http://www.jooq.org/xsd/jooq-meta-3.5.4.xsd">
                <schemata>
                    <schema>
                        <schema_name><xsl:value-of select="$schema"/></schema_name>
                    </schema>
                </schemata>
                <tables>
                    <xsl:apply-templates select="concepts/concept"/>
                </tables>
                <columns>
                    <xsl:apply-templates select="concepts/concept/property"/>
                </columns>
            </information_schema>
        </xsl:template>
    
        <xsl:template match="concept">
            <table>
                <schema_name><xsl:value-of select="$schema"/></schema_name>
                <table_name><xsl:value-of select="@name"/></table_name>
            </table>
        </xsl:template>
    
        <xsl:template match="property">
            <column>
                <schema_name><xsl:value-of select="$schema"/></schema_name>
                <table_name><xsl:value-of select="../@name"/></table_name>
                <column_name><xsl:value-of select="@name"/></column_name>
                <data_type><xsl:value-of select="@type"/></data_type>
            </column>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • (1) XMLDatabase 非常好!这就是我需要的。由于您是自己生成 SQL 创建脚本,所以 jOOQ 不支持从XMLDatabase 配置文件(或任何其他方式)开始生成 SQL 创建脚本?
    • (2) XSLT 的美丽让我惊叹不已。我仍然记得寒冷但舒适的星期五晚上,只有我,一些热巧克力,XSLT 和 Apache Xalan。啊啊啊。
    • (1):不,尽管从长远来看,用这种 XML 格式做更多事情可能是一个有趣的想法。我们会考虑的。了解更多关于您的用例的信息会非常有趣,也许在jOOQ user group 上? (2):1955 年的玛歌酒庄让那些夜晚更加美好
    • 我将在本周晚些时候尝试提供有关用户组的更多详细信息!
    • 玛歌一定很贵:)。
    猜你喜欢
    • 2017-12-05
    • 2013-04-10
    • 2013-08-28
    • 2018-09-12
    • 2019-03-25
    • 2012-12-12
    • 2014-12-21
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多