jOOQ - jOOQ 是否支持定义文件或创建 SQL 创建脚本?
jOOQ - Does jOOQ support definition files or creation of SQL creation scripts?
在我们的项目中,concepts
是在配置文件中定义的。举个例子:
<concepts>
<concept name="person">
<property name="age" type="integer"/>
...
</concept>
...
</concepts>
虽然这与 SQL 没有太大关系,但这个配置文件恰好可以映射到 SQL 表、列、...
从这个配置文件开始,我需要能够做两件事:
- 代 SQL 创建脚本 (
CREATE TABLE person ( ... )
).
- 生成 jOOQ POJO、表...可供开发人员使用
我想在这个项目中开始使用 jOOQ。 jOOQ 是否支持不从现有数据库开始的任何类型的生成(SQL 创建脚本及其 POJO、表等)?我查看了文档,但找不到太多内容。
如果没有,我正在考虑两种选择:
- 基于配置文件生成 jOOQ POJO、表...(自定义开发)
- 生成 SQL 基于 jOOQ POJO、表...的创建脚本,如步骤 1 中生成的(自定义开发)
或
- 根据配置文件生成SQL创建脚本(自定义开发)
- 在可嵌入的数据库中执行这些脚本,例如 H2 或 SQLite(非常简单)(虽然这些脚本也会在 'real' 数据库中执行,但最好是在这里使用内存数据库,以避免任何依赖)
- 基于此数据库(由 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>
在我们的项目中,concepts
是在配置文件中定义的。举个例子:
<concepts>
<concept name="person">
<property name="age" type="integer"/>
...
</concept>
...
</concepts>
虽然这与 SQL 没有太大关系,但这个配置文件恰好可以映射到 SQL 表、列、...
从这个配置文件开始,我需要能够做两件事:
- 代 SQL 创建脚本 (
CREATE TABLE person ( ... )
). - 生成 jOOQ POJO、表...可供开发人员使用
我想在这个项目中开始使用 jOOQ。 jOOQ 是否支持不从现有数据库开始的任何类型的生成(SQL 创建脚本及其 POJO、表等)?我查看了文档,但找不到太多内容。
如果没有,我正在考虑两种选择:
- 基于配置文件生成 jOOQ POJO、表...(自定义开发)
- 生成 SQL 基于 jOOQ POJO、表...的创建脚本,如步骤 1 中生成的(自定义开发)
或
- 根据配置文件生成SQL创建脚本(自定义开发)
- 在可嵌入的数据库中执行这些脚本,例如 H2 或 SQLite(非常简单)(虽然这些脚本也会在 'real' 数据库中执行,但最好是在这里使用内存数据库,以避免任何依赖)
- 基于此数据库(由 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
<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>