【问题标题】:How to initialize the SQLite3 JDBC driver in JRuby?如何在 JRuby 中初始化 SQLite3 JDBC 驱动程序?
【发布时间】:2010-12-15 14:49:05
【问题描述】:

如何在不使用活动记录的情况下通过 JDBC 访问 SQLite3?

【问题讨论】:

    标签: java ruby sqlite jdbc jruby


    【解决方案1】:

    安装 jdbc-sqlite3 gem

    然后,在你的 jruby 脚本中:

    require 'jdbc/sqlite3'
    url = "jdbc:sqlite:path.to.your.db"
    begin        
        Java::org.sqlite.JDBC #initialize the driver
        connection = JavaLang::DriverManager.getConnection(url) #grab your connection
    rescue => error      
        #handle error
    end
    

    【讨论】:

    • 尝试执行此操作时出现错误:capitalized package or class not found (java.org.sqlite.JDBC')"`。任何建议将不胜感激。即使有人能告诉我如何找到为自己出去。
    • @duckyfuzz 您使用的是什么版本的 JRuby 等?运行gem list时会出现jdbc-sqlite3吗?只要我将require 'rubygems' 添加为第一行,以上内容就对我有用,没有错误。我正在使用 jruby-1.6.4。
    • @RobertHaines 使用 1.6.4。我有一堂课,里面有import Java。该类中的一种方法使用上面答案中的代码。当我尝试运行它时,我现在收到错误消息:Java package java' 没有方法 '+'`。我需要 ruby​​gems 并且 gem 已正确安装。
    • @duckyfuzz 就像一个非常简单的健全性检查一样,上述是否可以单独工作? IE。没有调用、需要或导入您的任何其他代码?
    【解决方案2】:

    jdbc 驱动程序文件sqlite-3.5.8.jar 被复制到 gem 目录中。需要将其复制到 jruby/lib 目录中。应用程序也需要重启。

    驱动文件可以直接从这里下载

    http://files.zentus.com/sqlitejdbc/sqlitejdbc-v056.jar
    
    http://www.zentus.com/sqlitejdbc/
    

    【讨论】:

      【解决方案3】:

      这是一个使用 JRuby 1.6.6(在 Ruby 1.8 兼容模式下)和 jdbc-sqlite3 3.7.2 的示例。

      require 'rubygems'
      require 'jdbc/sqlite3'
      require 'java'
      
      org.sqlite.JDBC                 # load the driver so DriverManager detects it 
      #Java::OrgSqlite::JDBC          # alternate means of same
      
      connection = java.sql.DriverManager.getConnection 'jdbc:sqlite:test.sqlite3'
      begin
        statement = connection.createStatement
        begin
          statement.executeUpdate("create table user (name varchar, pass varchar)")
          statement.executeUpdate("insert into user values ('alice', 1234)")
          statement.executeUpdate("insert into user values ('bob', 5678)")
          statement.executeUpdate("insert into user values ('charlie', 'asdf')")
      
          rs = statement.executeQuery("select * from user")
          begin
            puts "user\tpass"
            while rs.next
              puts ["#{rs.getString(1)}",
                    "#{rs.getString(2)}"].join("\t")
            end
          ensure
            rs.close
          end
      
        ensure
          statement.close
        end
      ensure
        connection.close
      end
      

      输出:

      $ rm -f test.sqlite3; ruby sql.rb
      user    pass
      ------------
      alice   1234
      bob     5678
      charlie asdf
      

      【讨论】:

      • 这是一个非常有用的答案。但是,我想我要指出的是,我必须在 org.sqlite.JDBC 行之前执行 Jdbc::SQLite3.load_driver 才能使其正常工作——可能是由于发布此答案后 Jdbc 发生了变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2015-09-09
      • 2014-05-30
      • 1970-01-01
      相关资源
      最近更新 更多