简体   繁体   English

JOOQ与SQL Server

[英]JOOQ with SQL Server

I am a big fan of ORM especially when it comes to .NET with Entity Framework and using LINQ makes your data access less tedious and more enjoyable. 我是ORM的忠实粉丝,特别是涉及.NET with Entity Framework并使用LINQ使您的数据访问变得不那么繁琐和愉快。

However, I am working on Java at the moment and particularly looking at ORMs. 但是,我目前正在研究Java,特别是关注ORM。 I've tried nHybernate against our SQL Server database - and with the absence of keys (unique constraints) on some tables, I've started looking at JOOQ. 我已经尝试过对我们的SQL Server数据库进行nHybernate - 并且在某些表上缺少键(唯一约束),我开始关注JOOQ。

I've managed to generate my Java classes from the SQL Server database however - not without error - using JOOQ (v3.2.0). 我已经设法从SQL Server数据库生成我的Java类 - 但并非没有错误 - 使用JOOQ(v3.2.0)。

According to this page JOOQ Connections it mentions a class org.jooq.util.sqlserver.SQLServerDatabase. 根据这个页面JOOQ Connections,它提到了一个类org.jooq.util.sqlserver.SQLServerDatabase。 However when I generated with this in the configuration, I got class not found exception and nothing was generated. 但是当我在配置中生成这个时,我得到了class not found异常并且没有生成任何内容。 I have had to use org.jooq.util.jdbc.JDBCDatabase to generate my code. 我不得不使用org.jooq.util.jdbc.JDBCDatabase来生成我的代码。

Here is my configuration file (myjooqdbconfig.xml): 这是我的配置文件(myjooqdbconfig.xml):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.2.0.xsd">
  <jdbc>
    <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>
    <url>jdbc:sqlserver://MYSERVER:1433;DatabaseName=MYDB</url>
    <user>MYUSER</user>
    <password>PWD</password>
  </jdbc>

  <generator>
    <name>org.jooq.util.DefaultGenerator</name>

    <database>
      <name>org.jooq.util.jdbc.JDBCDatabase</name>

      <inputSchema>dbo</inputSchema>

      <includes>.*</includes>

      <excludes></excludes>
    </database>

    <target>
      <packageName>com.quorum.sentinel.dataAccess</packageName>

      <directory>F:\Libraries\jooq\jOOQ-3.2.0\lib\gen</directory>
    </target>
  </generator>
</configuration>

With the class not found exception I had a peek in the JAR file jooq-meta-3.2.0.jar using Java Decompiler where it would appear these classes are located. 在找不到类的异常的情况下,我使用Java Decompiler查看了JAR文件jooq-meta-3.2.0.jar,它将显示这些类所在的位置。 I cannot see the org.jooq.util.sqlserver.SQLServerDatabase class definition. 我看不到org.jooq.util.sqlserver.SQLServerDatabase类的定义。

JOOQ反编译

I am compiling with: 我正在编译:

java -classpath jooq-3.2.0.jar;jooq-meta-3.2.0.jar;jooq-codegen-3.2.0.jar;sqljdbc4.jar;. java -classpath jooq-3.2.0.jar; jooq-meta-3.2.0.jar; jooq-codegen-3.2.0.jar; sqljdbc4.jar;。 org.jooq.util.GenerationTool /myjooqdbconfig.xml org.jooq.util.GenerationTool /myjooqdbconfig.xml

Does this org.jooq.util.sqlserver.SQLServerDatabase definition exist in any JAR? 这个org.jooq.util.sqlserver.SQLServerDatabase定义是否存在于任何JAR中?

Additionally, having generated the code from the above configuration, it seemed to take a long time and appeared to be in some loop. 另外,从上面的配置生成代码后,似乎需要很长时间,并且似乎处于某种循环中。

Looking in the generated files under dbo - Keys/Tables/Dbo, there were duplicate names of my tables which I noticed when I copied the files into a Netbeans project (lots of errors). 查看dbo下的生成文件 - Keys / Tables / Dbo,当我将文件复制到Netbeans项目(很多错误)时,我注意到了我的表的重复名称。 I removed the duplicates and so far so good, I can read various tables from the database in my code below: 我删除了重复项,到目前为止很好,我可以在下面的代码中从数据库中读取各种表:

public static void main(String[] args) {
    Connection conn = null;

    String userName = "MYUSER";
    String password = "PWD";
    String url = "jdbc:sqlserver://MYSERVER:1433;DatabaseName=MYDB";

    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        conn = DriverManager.getConnection(url, userName, password);

        DSLContext create = DSL.using(conn);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(new Date( new GregorianCalendar().getTimeInMillis())));
        SelectJoinStep<Record> from = create.select().from(Configuration.CONFIGURATION);
        Result<Record> result = from.fetch();
        System.out.println(simpleDateFormat.format(new Date( new GregorianCalendar().getTimeInMillis())));
        for (Record r : result) {
            Object id =  r.getValue(Configuration.CONFIGURATION.NAME);
            Object time = r.getValue(Configuration.CONFIGURATION.VALUE);
            System.out.println("Record:              : ID: " + id + " Time: " + time);
        }

        System.out.println(simpleDateFormat.format(new Date( new GregorianCalendar().getTimeInMillis())));

    } catch (Exception e) {
        // For the sake of this tutorial, let's keep exception handling simple
        e.printStackTrace();
    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ignore) {
            }
        }
    }
}

So just to reiterate my questions amongst that mess: 所以只是在那个混乱中重申我的问题:

  1. Where is the SQL Server specific class org.jooq.util.sqlserver.SQLServerDatabase? SQL Server特定的类org.jooq.util.sqlserver.SQLServerDatabase在哪里?
  2. Is the above information how you would typically generate SQL Server object mappings? 以上信息通常是如何生成SQL Server对象映射的?
  3. Given that the above almost generated correctly, and that there was duplicate definitions generated in Keys/Tables/Dbo .java files, I don't want to immediately say it is a bug with Jooq - but could be bad database design/incorrect configuration/silly developer! 鉴于以上几乎生成正确,并且在Keys / Tables / Dbo .java文件中生成了重复的定义,我不想立即说它是Jooq的错误 - 但可能是错误的数据库设计/错误的配置/傻开发商!

With jOOQ 3.2, jOOQ has become dual-licensed . 随着jOOQ 3.2,jOOQ已经成为双重许可 The SQL Server integration is available only with a jOOQ Professional Edition license . SQL Server集成仅适用于jOOQ Professional Edition许可证 You may, however, download a free 30 day trial version that works with SQL Server. 但是,您可以下载适用于SQL Server的30天免费试用版

Note, there is also a fix for jOOQ 3.2.1 (to be released soon), to give community edition users more information rather than just a stack trace. 请注意,还有一个针对jOOQ 3.2.1 (即将发布) 的修复 ,为社区版用户提供更多信息,而不仅仅是堆栈跟踪。

See also: jooq-3.2.0 and db2 database 另请参见: jooq-3.2.0和db2数据库

I want to share my working config for sql server 2012 and 2014 that both made it work after many attempts. 我想分享我的sql server 2012和2014的工作配置,它们都经过多次尝试后才能运行。 I downloaded jooq3.7.2 enterprise edition to make it work. 我下载了jooq3.7.2企业版以使其工作。

Here is my sample config file "library.xml" 这是我的示例配置文件“library.xml”

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.7.0.xsd">
  <!-- Configure the database connection here -->
  <jdbc>
    <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>
    <url>jdbc:sqlserver://testdelta1:1433;databaseName=NEO_DB</url>
    <user>LOB_ManilaUsers</user>
    <password>lobpassword3123</password>
  </jdbc>

  <generator>
    <!-- The default code generator. You can override this one, to generate your own code style.
         Supported generators:
         - org.jooq.util.JavaGenerator
         - org.jooq.util.ScalaGenerator
         Defaults to org.jooq.util.JavaGenerator -->
    <name>org.jooq.util.JavaGenerator</name>

    <database>
      <!-- The database type. The format here is:
           org.util.[database].[database]Database -->
      <!--<name>org.jooq.util.mysql.MySQLDatabase</name> -->
      <name>org.jooq.util.sqlserver.SQLServerDatabase</name>
      <!-- The database schema (or in the absence of schema support, in your RDBMS this
           can be the owner, user, database name) to be generated -->

      <!-- specify database name -->
      <inputSchema>dbo</inputSchema>

      <!-- All elements that are generated from your schema
           (A Java regular expression. Use the pipe to separate several expressions)
           Watch out for case-sensitivity. Depending on your database, this might be important! -->
      <includes>.*</includes>

      <!-- All elements that are excluded from your schema
           (A Java regular expression. Use the pipe to separate several expressions).
           Excludes match before includes -->
      <excludes></excludes>
    </database>

    <target>
      <!-- The destination package of your generated classes (within the destination directory) -->
      <packageName>com.neoapi.entity</packageName>

      <!-- The destination directory of your generated classes -->
      <directory>jooq_directory/src_generated</directory>
    </target>
  </generator>
</configuration>

Usually the default schema value is 'dbo'. 通常默认架构值为'dbo'。 At first, I entered 'NEO_DB' which did not work. 起初,我输入的“NEO_DB”无效。

you can specify your desired and 你可以指定你想要的和

Free version or opensource jooq 3.7.2 does not contain the database name SQLServerDatabase. 免费版或opensource jooq 3.7.2不包含数据库名称SQLServerDatabase。 Enterprise edition(30 days trial) works. 企业版(30天试用期)有效。 I'm not sure how the trial days start counting. 我不确定审判日是如何开始计算的。

here is the sample log from my terminal: 这是我终端的示例日志:

> INFO: Generating table         : Tobservationrawdataobservations.java [input=tObservationRawDataObservations, output=tObservationRawDataObservations, pk=PK_ObservationRawDataObservations]
Feb 16, 2016 7:03:35 AM org.jooq.tools.JooqLogger info

INFO: Generating table         : UdvPublisheddata.java [input=udv_PublishedData, output=udv_PublishedData, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : UdvPublishinghistory.java [input=udv_PublishingHistory, output=udv_PublishingHistory, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : UdvScreamertanksystems.java [input=udv_ScreamerTankSystems, output=udv_ScreamerTankSystems, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : UdvSiradwmconfig.java [input=udv_SiraDWMConfig, output=udv_SiraDWMConfig, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : Vwauditlog.java [input=vwAuditLog, output=vwAuditLog, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : Vwcompanysitetanksystem.java [input=vwCompanySiteTankSystem, output=vwCompanySiteTankSystem, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table         : Vwdocketdeliveries.java [input=vwDocketDeliveries, output=vwDocketDeliveries, pk=N/A]
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Tables generated         : Total: 01:06
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table references
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Table refs generated     : Total: 01:06, +17.847ms
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating Keys          
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Keys generated           : Total: 01:06, +49.833ms
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating table records 
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : _Tmptsis_20151019Record.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : DataRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : FuncgetchasedatatableRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : FuncgetcompliancestatisticspasstableRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : FuncgetcurrentfailsinctableRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcalibrationsRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcompaniesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcompanyfilereadersRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcompanyrolecontactsRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcompanyrolepermissionsRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcompanyrolesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcontactregionsRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcontactsRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcontactsitesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcorrectiongroupRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TcorrectiongroupsiteRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TdomainusersRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TfilereadersRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TgradealiasesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TgradesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TimportedfilemessagesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating record        : TimportedfilesRecord.java
Feb 16, 2016 7:03:40 AM org.jooq.tools.JooqLogger info
INFO: Generating routine       : SpCreatediagram.java
Feb 16, 2016 7:03:43 AM org.jooq.tools.JooqLogger info
INFO: Generating routine       : SpDropdiagram.java
Feb 16, 2016 7:03:45 AM org.jooq.tools.JooqLogger info
INFO: Generating routine       : SpHelpdiagramdefinition.java
Feb 16, 2016 7:03:45 AM org.jooq.tools.JooqLogger info
INFO: Generating routine       : SpHelpdiagrams.java
Feb 16, 2016 7:03:46 AM org.jooq.tools.JooqLogger info
INFO: Generating routine       : SpRenamediagram.java
Feb 16, 2016 7:03:46 AM org.jooq.tools.JooqLogger info
INFO: Routines generated       : Total: 01:11, +5.132s
Feb 16, 2016 7:03:46 AM org.jooq.tools.JooqLogger info
INFO: Packages fetched         : 0 (0 included, 0 excluded)
Feb 16, 2016 7:03:46 AM org.jooq.tools.JooqLogger info
INFO: Removing excess files    
Feb 16, 2016 7:03:46 AM org.jooq.tools.JooqLogger info
INFO: GENERATION FINISHED: dbo : Total: 01:11, +2.713ms

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM