[JRuby]ActiveRecord JDBC Adapterを使いMySQLに接続する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

JRubyを使い、MySQLに接続してデータを操作する方法について調べました。幾つか方法はあるようなのですが、RailsのActiveRecordと同じようにデータを操作できるActiveRecord JDBC Adapterを使ってみました。以下、その実装方法とサンプルソースについて書いてみたいと思います。

環境について

今回は以下の環境で検証しました。

  • jruby 9.0.0.0
  • java version "1.8.0_25"

実装方法とソースについて

では実装についてです。まずはGemfileを編集し、必要なGemをインストールします。

source "https://rubygems.org"

gem 'activerecord', '~> 3.2.18'
gem 'activerecord-jdbcmysql-adapter'

gem 'warbler'

3、4行目がActiveRecord JDBC Adapterに関する記述です。6行目は今回とは直接関係ありませんが、jarを作成するためwarblerというGemです。
上記を記述したら、以下のコマンドでインストールします。

$ bundle install --path vendor/bundle

次にMySQLに接続し、データを操作するソースです。

# encoding: utf-8

require "jdbc/mysql"
require "java"
require "active_record"

Jdbc::MySQL.load_driver(:require) if Jdbc::MySQL.respond_to?(:load_driver)

module JrubyMysqlSample
  config = {
      url: 'jdbc:mysql://domain:3306/database_name',
      adapter: 'jdbc',
      username: 'username',
      password: 'password',
      driver: 'com.mysql.jdbc.Driver',
  }

  ActiveRecord::Base.establish_connection(config)

  class Groups < ActiveRecord::Base
  end

  class << self
    def main
      create
      find
      delete

    rescue => e
      puts e.message
    end

    private
      def create
        group = Groups.new
        group[:company] = 'クラスメソッド'
        group[:section] = 'テスト用'
        group[:deleted] = 0
        group.save
      end

      def find
        groups = Groups.find(:all, :conditions => ["company = ?", 'クラスメソッド'])

        groups.each do |group|
          puts group[:id].to_s + ',' + group[:company] + ',' + group[:section]
        end
      end

      def delete
        groups = Groups.find(:all, :conditions => ["company = ? and section = ?", 'クラスメソッド', 'テスト用'])

        groups.each do |group|
          group.destroy
        end
      end
  end
end

3〜18行目がActiveRecord JDBC Adapterを使用する際のポイントとなります。3〜5行目で必要なものをrequireで取り込みます。7行目でMySQLのドライバをロードし、10〜18行目でMySQLへの接続情報を渡しています。
1行目はActiveRecord JDBC Adapterとは関係ありません(笑)。warblerでjarを作成した際、日本語が文字化けしないようにするために入れてあります。

20行目以降は一般的なActiveRecordと同じソースとなります。24行目以降のmain()内でcreate・find・deleteを呼び出し、それぞれのメソッド内でデータの作成・取得・削除を行っています。データの操作対象となるのは「Groups」テーブルで、20行目でActiveRecordクラスを継承してModelを作成しています。

なお、実際にはmain()を外部から呼び出して実行しました(mainの呼び出しについては省略します)。

まとめ

簡単でしたが以上です。JDBCのドライバを使っているため、他のデータベースに接続することもできそうです。

参考サイト

activerecord-jdbc-adapter
JRuby: connect to a MSSQL database via ActiveRecord and create ActiveRecord::Base classes
cannot load Java class com.mysql.jdbc.Driver
JRubyでSyntaxError: test.rb:1: invalid multibyte char (US-ASCII)