taka_2
unread,Aug 17, 2008, 3:10:46 AM8/17/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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$
----------------------------------------