java - jOOQ - jOOQ 支持定义文件或 SQL 创建脚本的创建吗?

标签 java sql xml code-generation jooq

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

<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. 基于步骤 1 中生成的 jOOQ POJO、表等生成 SQL 创建脚本(自定义开发)

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

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

最佳答案

这显然应该用 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>

关于java - jOOQ - jOOQ 支持定义文件或 SQL 创建脚本的创建吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33742190/

相关文章:

java - 可执行的 .jar - 适用于某些用户,但不适用于其他用户

javascript - addStudent.php 中的 Idnumber 没有重复条目

php - 从 php 调用存储过程

mysql - 在表中插入值时的内部 SQL 语句

java - 启动 fragment 并滚动时键盘打开

javascript - 在 javascript 中设置时,svg 文本实体会被转义

php - 如何在 PHP Nusoap 中解决 "XML error parsing SOAP payload on line 1: Invalid document end"

java - 更新多个文本框 Java GUI

java - 如何计算一行中作为方法参数给出的正值的数量?

java - 从具有 hibernate ManyToMany 关系的集合中删除对象