JDBCのサンプル作ってみました。

33 views
Skip to first unread message

taka_2

unread,
Aug 17, 2008, 3:10:46 AM8/17/08
to rubeus
重元です。

表題の通り、JDBCのサンプル作ってみました。
DBには、JDK1.6付属のJavaDBことApache Derbyを使っています。

derbyを埋め込みDBとして使っているので、
コードの中でデータベースを作成し、テーブルを作成し、
データを投入し、SELECTで取得するところまで全てやっています。

サンプルはこんな感じ。
close漏れの心配がなくて、とても良い感じです。

--------------------------------------------------
require 'java'
require 'rubygems'
require 'rubeus'

if ENV_JAVA["java.specification.version"] == "1.6"
require java.lang.System.getenv("JAVA_HOME") + "/db/lib/
derby.jar"
end

class JdbcExample
include Rubeus::Jdbc

def initialize
# Register Driver
Java::OrgApacheDerbyJdbc::EmbeddedDriver.new
end

def test
DriverManager.connect("jdbc:derby:test;create = true",
"", "") do |con|
con.statement do |stmt|
# Drop table TEST if exists
begin
stmt.execute_update("DROP
TABLE TEST")
        rescue
# ignore error if table not
exist
end

# Setup table and data
stmt.execute_update("CREATE TABLE
TEST(id int, data char(10))")
stmt.execute_update("INSERT INTO TEST
VALUES(1, 'first')")
stmt.execute_update("INSERT INTO TEST
VALUES(2, 'second')")

# Query
stmt.query("SELECT * FROM TEST") do |
rs|
rs.each do |rsNext|
print "|",
rsNext.getInt("ID"), "|", rsNext.getString("DATA"), "|\n"
end
end
end
end
end
end

JdbcExample.new.test
--------------------------------------------------

私の環境で実行した結果はこんな感じです。

--------------------------------------------------
taka@taka-desktop:~/rubeus/examples$ jruby jdbc_example.rb
|1|first |
|2|second |
taka@taka-desktop:~/rubeus/examples$
--------------------------------------------------

>秋間さん

このサンプルを動かすのに、いくつかライブラリを修正していますが、
イマイチComponentLoaderの仕組みが分かってないので、
妥当な修正かどうか確認していただけないでしょうか。
(特に、driver_manager.rbは自信ないです。。)

----------------------------------------
taka@taka-desktop:~/rubeus/lib$ svn diff
Index: rubeus/extensions/java/sql/connection.rb
===================================================================
--- rubeus/extensions/java/sql/connection.rb (リビジョン 134)
+++ rubeus/extensions/java/sql/connection.rb (作業コピー)
@@ -1,3 +1,5 @@
+Rubeus::Jdbc.depend_on("Statement")
+
module Rubeus::Extensions::Java::Sql
module Connection
include Rubeus::Jdbc::CloseableResource
Index: rubeus/extensions/java/sql/statement.rb
===================================================================
--- rubeus/extensions/java/sql/statement.rb (リビジョン 134)
+++ rubeus/extensions/java/sql/statement.rb (作業コピー)
@@ -1,3 +1,5 @@
+Rubeus::Jdbc.depend_on("ResultSet")
+
module Rubeus::Extensions::Java::Sql
module Statement
include Rubeus::Jdbc::CloseableResource
Index: rubeus/extensions/java/sql/driver_manager.rb
===================================================================
--- rubeus/extensions/java/sql/driver_manager.rb (リビジョン 134)
+++ rubeus/extensions/java/sql/driver_manager.rb (作業コピー)
@@ -1,9 +1,16 @@
+Rubeus::Jdbc.depend_on("Connection")
+
module Rubeus::Extensions::Java::Sql
module DriverManager
- extend Rubeus::Jdbc::CloseableResource
+ def self.included(base)
+ base.extend ClassMethods
+ base.extend Rubeus::Jdbc::CloseableResource
+ end

- def connect(url, user, password, &block)
- with_close(get_connection(url, user, password), &block)
+ module ClassMethods
+ def connect(url, user, password, &block)
+ with_close(get_connection(url, user, password), &block)
+ end
end
end
end
Index: rubeus/extensions/java/sql/result_set.rb
===================================================================
--- rubeus/extensions/java/sql/result_set.rb (リビジョン 134)
+++ rubeus/extensions/java/sql/result_set.rb (作業コピー)
@@ -1,3 +1,5 @@
+Rubeus::Jdbc.depend_on("ResultSetMetaData")
+
module Rubeus::Extensions::Java::Sql
module ResultSet
include Enumerable
Index: rubeus/extensions/java.rb
===================================================================
--- rubeus/extensions/java.rb (リビジョン 134)
+++ rubeus/extensions/java.rb (作業コピー)
@@ -1,5 +1,6 @@
module Rubeus::Extensions
module Java
autoload :Awt, 'rubeus/extensions/java/awt'
+ autoload :Sql, 'rubeus/extensions/java/sql'
end
end
Index: rubeus/jdbc/column.rb
===================================================================
--- rubeus/jdbc/column.rb (リビジョン 134)
+++ rubeus/jdbc/column.rb (作業コピー)
@@ -9,7 +9,7 @@
:column_label , # String # 印刷や表示に使用する、指定された列の推奨タイトルを取得しま
す。
:column_name , # String # 指定された列の名前を取得します。
:column_type , # int # 指定された列の SQL 型を取得します。
- :column_typeName , # String # 指定された列のデータベース固有の型名を取得します。
+ :column_type_name , # String # 指定された列のデータベース固有の型名を取得します。
:precision , # int # 指定された列の 10 進桁数を取得します。
:scale , # int # 指定された列の小数点以下の桁数を取得します。
:schema_name , # String # 指定された列のテーブルのスキーマを取得します。
Index: rubeus/jdbc.rb
===================================================================
--- rubeus/jdbc.rb (リビジョン 134)
+++ rubeus/jdbc.rb (作業コピー)
@@ -1,6 +1,17 @@
+require "rubeus/component_loader"
+
module Rubeus
- module Jdbc
- autoload :CloseableResource, 'rubeus/jdbc/closeable_resource'
- autoload :Column, 'rubeus/jdbc/column'
+ Jdbc = ComponentLoader.new("java.sql") do
+ class_to_package.update(
+ # $JAVA_HOME/lib/classlistにないものリスト
+ 'Connection' => 'java.sql',
+ 'DriverManager' => 'java.sql',
+ 'ResultSet' => 'java.sql',
+ 'ResultSetMetaData' => 'java.sql',
+ 'Statement' => 'java.sql'
+ )
end
end
+
+require "rubeus/jdbc/closeable_resource"
+require "rubeus/jdbc/column"
Index: rubeus.rb
===================================================================
--- rubeus.rb (リビジョン 132)
+++ rubeus.rb (作業コピー)
@@ -7,7 +7,7 @@
VERSION = "0.0.5"
autoload :Awt, "rubeus/awt"
autoload :Swing, "rubeus/swing"
- # autoload :Jdbc, "rubeus/jdbc"
+ autoload :Jdbc, "rubeus/jdbc"
end

unless File.basename($PROGRAM_NAME) == 'gem' and ARGV.first ==
'build'
taka@taka-desktop:~/rubeus/lib$
----------------------------------------

Takeshi Akima

unread,
Aug 17, 2008, 3:26:55 AM8/17/08
to rub...@googlegroups.com
重元さん

ありがとうございます。秋間です。

ちょっと仕事に追われていて、じっくり試すのは難しいので
パッチを読んだだけで申し訳ないのですが、おそらくOKです!

僕が書いちゃっていた
Rubeus::Extensions::Java::Sql::DriverManager#connectは
間違いですね。クラスメソッドにしなきゃダメじゃん。俺

というわけで、いい感じなのでコミットしてもらえますか?
それで皆さんに使ってもらってましょう!

なんかやってもらってばっかりで申し訳ないですけど
よろしくお願い致します。


taka_2 さんは書きました:

taka_2

unread,
Aug 18, 2008, 10:54:14 AM8/18/08
to rubeus
秋間さん

重元です。

libの修正 + exampleの追加をコミットしました。
動かしてみてもらえると助かります。

よろしくお願いします。

--
たまに投稿エラーとかいうメールが来るのですが、
もしかしたら、ディスカッションの返信じゃなくて、メールの返信しちゃってるような気がしてきました。
ダブって送られてしまってたらすいません。

秋間武志

unread,
Aug 20, 2008, 3:52:02 AM8/20/08
to rub...@googlegroups.com
重元さん

お返事が遅くなってすみません。秋間です。
サンプルの作成ありがとうございます。

examples/jdbc_example.rb を動かしてみました。

Mac OS XではSun製のJDKではなく、Apple製のJDKを
使うため、Java6ではderbyは入っていませんでした。
それにrecomenndedになっているのはまだJava5なので、
derbyのチェックを、クラスパスにjarが入っているかどうかを
確認するように書き換えました。

JdbcExampleのメソッドにしちゃった方がいいかなとも
思いましたが、ひとまず止めておきました。

それから JdbcExample#initializeで行っていたドライバの
インスタンスの生成は 不要なので、インスタンスは生成せずに、
ドライバのクラスを参照してクラスをロードするだけに
しておきました。

すでにコミットしてありますので、おかしな点などあったら
ご連絡ください。

宜しくお願いします


2008/08/18 23:54 taka_2 <Takahiro....@gmail.com>:

taka_2

unread,
Aug 20, 2008, 9:03:32 PM8/20/08
to rubeus
重元です。

サンプルの修正ありがとうございます。
こちらの環境でも問題なく動きました。

> それから JdbcExample#initializeで行っていたドライバの
> インスタンスの生成は 不要なので、インスタンスは生成せずに、
> ドライバのクラスを参照してクラスをロードするだけに
> しておきました。

Class.forName相当の書き方が分からなかったので、
newしてしまったのですが、
参照するだけでよかったのですね。

Jdbcのテストなのですが、
derby前提で書いてしまっても良いですか?
jar一つで動くので何かと便利なのですが、どうでしょうか。
ご検討いただけると助かります。

On 8月20日, 午後4:52, "秋間武志" <akm2...@gmail.com> wrote:
> 重元さん
>
> お返事が遅くなってすみません。秋間です。
> サンプルの作成ありがとうございます。
>
> examples/jdbc_example.rb を動かしてみました。
>
> Mac OS XではSun製のJDKではなく、Apple製のJDKを
> 使うため、Java6ではderbyは入っていませんでした。
> それにrecomenndedになっているのはまだJava5なので、
> derbyのチェックを、クラスパスにjarが入っているかどうかを
> 確認するように書き換えました。
>
> JdbcExampleのメソッドにしちゃった方がいいかなとも
> 思いましたが、ひとまず止めておきました。
>
> それから JdbcExample#initializeで行っていたドライバの
> インスタンスの生成は 不要なので、インスタンスは生成せずに、
> ドライバのクラスを参照してクラスをロードするだけに
> しておきました。
>
> すでにコミットしてありますので、おかしな点などあったら
> ご連絡ください。
>
> 宜しくお願いします
>
> 2008/08/18 23:54 taka_2 <Takahiro.Shigem...@gmail.com>:
> ...
>
> もっと読む ≫

秋間武志

unread,
Aug 25, 2008, 7:15:21 PM8/25/08
to rub...@googlegroups.com
重元さん

お返事が遅くてほんとうすいません。秋間です。

> derby前提で書いてしまっても良いですか?
> jar一つで動くので何かと便利なのですが、どうでしょうか。
> ご検討いただけると助かります。

いろいろ考えたのですが、それで行きましょう。
テストはユーザーが、本当にうまく動くのかを確認できるように
いろいろな環境で試してもらいたいので、できるだけ自動的動くように
していきましょう。できるだけみんなでそういうコードを書きたいと
思っています。

重元さんが書いてくれて本当に助かっているので、
僕もそろそろコードを書きます!

2008/08/21 10:03 taka_2 <Takahiro....@gmail.com>:

taka_2

unread,
Aug 27, 2008, 10:38:31 AM8/27/08
to rubeus
秋間さん

重元です。

derbyのセットアップ部分ですが、
railsっぽく、helperとしてくくり出すというのはいかがでしょうか。
これなら、examplesからも、testからも、
両方使うのに違和感がないような気がします。

helperを使う方は、
1) require 'rubeus/helpers/derby_helper'
2) Rubeus::Helpers::setup_derby
で、例外が出なければ使うことができます。

試しにコード書いてみました。

・ヘルパ
lib/rubeus/helpers/derby_helper.rb
http://gist.github.com/7489

・呼び出し側のサンプル
examples/jdbc_example.rb
http://gist.github.com/7490

# gistって、履歴管理も出来て便利ですね。

On 8月26日, 午前8:15, "秋間武志" <akm2...@gmail.com> wrote:
> 重元さん
>
> お返事が遅くてほんとうすいません。秋間です。
>
> > derby前提で書いてしまっても良いですか?
> > jar一つで動くので何かと便利なのですが、どうでしょうか。
> > ご検討いただけると助かります。
>
> いろいろ考えたのですが、それで行きましょう。
> テストはユーザーが、本当にうまく動くのかを確認できるように
> いろいろな環境で試してもらいたいので、できるだけ自動的動くように
> していきましょう。できるだけみんなでそういうコードを書きたいと
> 思っています。
>
> 重元さんが書いてくれて本当に助かっているので、
> 僕もそろそろコードを書きます!
>
> 2008/08/21 10:03 taka_2 <Takahiro.Shigem...@gmail.com>:
> ...
>
> もっと読む ≫
Reply all
Reply to author
Forward
0 new messages