jOOQ - Може ли jOOQ да поддържа definition файлове или правене на SQL скриптове?

+7 гласа
30 прегледа
попитан 2016 май 11 в Java от Nikola.Nikolov. (3,100 точки)

В един наш проект concepts се дефинират в config файл.Ето ви и пример: 

<concepts> 

    <concept name="person"> 

        <property name="age" type="integer"/> 

        ... 

    </concept> 

    ... 

</concepts> 

Въпреки че няма много общо със SQL, този конфиг. файл може да се вкара в SQL таблици,колони и т.н... 

Като отворя конфиг. файла,трябва да мога да направя тези 2 неща: 

  • Да генерирам SQL generation скриптове (CREATE TABLE person ( . . . ) ). 
  • Да генерирам jOOQ POJOs (Plain Old Java Objects), таблици и т.н. , които могат да бъдат използвани от developer-ите. 

Искам да почна да използвам jOOQ в този проект. Може ли jOOQ да поддържа някакъв вид генерация за създаване на SQL generation скриптове и своите POJO-та,таблици, които да не се стартират от вече съществуващи база данни? Гледах в документацията, но не можах да намеря много. 

 
Ако ли не, чудя се между тези 2 опции: 

1.Генериране на jOOQ POJO-та, таблици и т.н. базирани на конфиг. файл (custom development) 

2.Изпълняванена тези скриптове във вградена база от данни,като например H2 или SQLite. 

или 

1.Генериране на SQL creation скриптове, базирани на  конфиг. файл (custom development) 

2. Изпълняване на тези скриптове във вградена база от данни (embeddable) (Въпреки,че скриптовете ще трябва да бъдат изпълнявани в „истинска“ база от данни, най-добре ще е да се използва база данни в самата памет ,иначе казано IMDB (in-memory database), за да избегнем всякакви зависимости). 

3.Генериране на jOOQ POJO-та,таблици, и т.н. ...базирани на тази база (дадената ни от jOOQ библиотека) 

Въпреки,че си мисля че първата опция иска повече труд, ми допада повече,понеже стъпка 3 във 2-рата опция може да докара до загуба на информация. 

1 отговор

0 гласа
отговорени 2016 май 12 от Daniel Ivanov (11,160 точки)
редактиран 2016 май 12 от Daniel Ivanov

Тук със сигурност трябва да използваме 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 meta XML:
jOOQ – meta поддържа импортването на схема на мета информацията от XML,ползвайки
 XML Database

<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>
коментиран 2016 май 12 от Daniel Ivanov (11,160 точки)
Просто си трансформирай своя 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>
...