Symfoware

Symfowareについての考察blog

Firebird 2.5.2にJava1.7からJaybirdで接続する

FreeBSDにFirebirdをインストール。データベースを作成してみました。
FreeBSD 10.0 + Firebird 2.5.2 データベースファイルを作成する

Java1.7からJDBCドライバ経由で接続してみます。


Jaybirdのダウンロード



Firebirdに接続するのには、Jaybirdを使用します。

こちらのサイトから、「Jaybird-2.2.4JDK_1.7.zip」をダウンロードしました。
http://www.firebirdsql.org/en/jdbc-driver/

345_01.png



ダウンロードしたファイルを解凍した中に「jaybird-full-2.2.4.jar」という
ファイルがあると思います。

これを取り出してビルドパスに含めておきます。





接続サンプル



以前JavaからFirebirdに接続した時のサンプルを参考にしました。
FirebirdにJavaで接続し、郵便番号データを登録する


Java1.7らしくアレンジしています。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class FBSample {
  7.     public static void main(String[] args) {
  8.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  9.         String user = "sysdba";
  10.         String password = "masterkey";
  11.         try (Connection con = DriverManager.getConnection(url, user, password);
  12.                 Statement stmt = con.createStatement()) {
  13.             
  14.             // テーブル作成
  15.             stmt.execute("CREATE TABLE java_test (id int, name varchar(100))");
  16.             // データ登録
  17.             stmt.execute("INSERT INTO java_test(id, name) VALUES (1, 'Javaから登録テスト')");
  18.             // 登録したデータを検索
  19.             try (ResultSet rs = stmt.executeQuery("SELECT * FROM java_test")) {
  20.                 while (rs.next()) {
  21.                     System.out.println("id:" + rs.getInt("id"));
  22.                     System.out.println("name:" + rs.getString("name"));
  23.                 }
  24.             }
  25.             // テーブル削除
  26.             stmt.execute("DROP TABLE java_test");
  27.         } catch (Exception e) {
  28.             e.printStackTrace();
  29.         }
  30.     }
  31. }




実行してみると、特に文字化けもなく登録、検索できたようです。


id:1
name:Javaから登録テスト







PreparedStatement



プレースフォルダを使用して、データの登録と検索を行なってみます。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.Statement;
  7. public class FBSample {
  8.     public static void main(String[] args) {
  9.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  10.         String user = "sysdba";
  11.         String password = "masterkey";
  12.         try (Connection con = DriverManager.getConnection(url, user, password);
  13.                 Statement stmt = con.createStatement()) {
  14.             
  15.             // テーブル作成
  16.             stmt.execute("CREATE TABLE java_test (id int, name varchar(100))");
  17.             
  18.             // データ登録
  19.             String sql = "INSERT INTO java_test(id, name) VALUES (?, ?)";
  20.             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
  21.                 pstmt.setInt(1, 1);
  22.                 pstmt.setString(2, "Javaから登録テスト");
  23.                 pstmt.execute();
  24.             }
  25.             
  26.             // 登録したデータの検索
  27.             sql = "SELECT * FROM java_test WHERE id = ?";
  28.             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
  29.                 
  30.                 pstmt.setInt(1, 1);
  31.                 
  32.                 try (ResultSet rs = pstmt.executeQuery()) {
  33.                     while (rs.next()) {
  34.                         System.out.println("id:" + rs.getInt("id"));
  35.                         System.out.println("name:" + rs.getString("name"));
  36.                     }
  37.                 }
  38.             }
  39.             // テーブル削除
  40.             stmt.execute("DROP TABLE java_test");
  41.         } catch (Exception e) {
  42.             e.printStackTrace();
  43.         }
  44.     }
  45. }




実行結果は最初と同じになります。




RowSet



C#でいうDataSetのような機能のRowSetを使って検索してみます。
何気に使ってみるの初めてです。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.Statement;
  6. import javax.sql.rowset.JdbcRowSet;
  7. import com.sun.rowset.JdbcRowSetImpl;
  8. public class FBSample {
  9.     public static void main(String[] args) {
  10.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  11.         String user = "sysdba";
  12.         String password = "masterkey";
  13.         try (Connection con = DriverManager.getConnection(url, user, password);
  14.                 Statement stmt = con.createStatement()) {
  15.             // テーブル作成
  16.             stmt.execute("CREATE TABLE java_test (id int, name varchar(100))");
  17.             
  18.             // データ登録
  19.             String sql = "INSERT INTO java_test(id, name) VALUES (?, ?)";
  20.             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
  21.                 pstmt.setInt(1, 1);
  22.                 pstmt.setString(2, "Javaから登録テスト");
  23.                 pstmt.execute();
  24.             }
  25.             
  26.             // 登録したデータの検索
  27.             try (JdbcRowSet rowSet = new JdbcRowSetImpl(con)) {
  28.                 rowSet.setType(JdbcRowSet.TYPE_FORWARD_ONLY);
  29.                 rowSet.setCommand("SELECT * FROM java_test");
  30.                 rowSet.execute();
  31.                 
  32.                 while (rowSet.next()) {
  33.                     System.out.println("id:" + rowSet.getInt("id"));
  34.                     System.out.println("name:" + rowSet.getString("name"));
  35.                 }
  36.             }
  37.             
  38.             // JdbcRowSetをcloseすると、connectionもcloseされる模様
  39.             // テーブル削除
  40.             //stmt.execute("DROP TABLE java_test");
  41.         } catch (Exception e) {
  42.             e.printStackTrace();
  43.         }
  44.         
  45.         try (Connection con = DriverManager.getConnection(url, user, password);
  46.                 Statement stmt = con.createStatement()) {
  47.             
  48.             // テーブル削除
  49.             stmt.execute("DROP TABLE java_test");
  50.             
  51.         } catch (Exception e) {
  52.             e.printStackTrace();
  53.         }
  54.     }
  55. }




実行結果は同様です。

他の書き方があるのかもしれませんが、
・com.sunなimportが追加されるのがちょっと。
・RowSetをCloseすると、Connectionも合わせてクローズされる?
という感じでした。


これについては、もうちょっと調べてみたいと思います。




トランザクション



コネクションにsetAutoCommit(false)を指定することで、
自動的にトランザクションが開始されます。

明示するのは、「rollback」「commit」だけでOK。


  1. package sample;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.Statement;
  7. public class FBSample {
  8.     public static void main(String[] args) {
  9.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  10.         String user = "sysdba";
  11.         String password = "masterkey";
  12.         try (Connection con = DriverManager.getConnection(url, user, password);
  13.                 Statement stmt = con.createStatement()) {
  14.             
  15.             // トランザクション開始
  16.             con.setAutoCommit(false);
  17.             
  18.             // テーブル作成
  19.             stmt.execute("CREATE TABLE java_test (id int, name varchar(100))");
  20.             con.commit();
  21.             
  22.                         
  23.             // データ登録
  24.             String sql = "INSERT INTO java_test(id, name) VALUES (?, ?)";
  25.             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
  26.                 pstmt.setInt(1, 1);
  27.                 pstmt.setString(2, "Javaから登録テスト");
  28.                 pstmt.execute();
  29.             }
  30.             
  31.             // ここでロールバック
  32.             con.rollback();
  33.             
  34.             
  35.             // 登録したデータの検索
  36.             try(ResultSet rs = stmt.executeQuery("SELECT * FROM java_test")) {
  37.                 System.out.println("ロールバック");
  38.                 int count = 0;
  39.                 while(rs.next()) {
  40.                     System.out.println("id:" + rs.getInt("id"));
  41.                     System.out.println("name:" + rs.getString("name"));
  42.                     count++;
  43.                 }
  44.                 System.out.println("データ件数:" + count);
  45.             }
  46.             
  47.             
  48.             // もう一回登録
  49.             sql = "INSERT INTO java_test(id, name) VALUES (?, ?)";
  50.             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
  51.                 pstmt.setInt(1, 1);
  52.                 pstmt.setString(2, "Javaから登録テスト");
  53.                 pstmt.execute();
  54.             }
  55.             
  56.             
  57.             // ここでコミット
  58.             con.commit();
  59.             
  60.             // 登録したデータの検索
  61.             try(ResultSet rs = stmt.executeQuery("SELECT * FROM java_test")) {
  62.                 System.out.println("コミット");
  63.                 int count = 0;
  64.                 while(rs.next()) {
  65.                     System.out.println("id:" + rs.getInt("id"));
  66.                     System.out.println("name:" + rs.getString("name"));
  67.                     count++;
  68.                 }
  69.                 System.out.println("データ件数:" + count);
  70.             }
  71.             
  72.             
  73.             // テーブル削除
  74.             stmt.execute("DROP TABLE java_test");
  75.             con.commit();
  76.         } catch (Exception e) {
  77.             e.printStackTrace();
  78.         }
  79.         
  80.     }
  81. }




実行するとちゃんとロールバックすると登録がキャンセルされていました。


ロールバック
データ件数:0
コミット
id:1
name:Javaから登録テスト
データ件数:1


関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/03/02(日) 13:42:39|
  2. Firebird
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C#のDataSetみたいなJavaのJdbcRowSet使い方メモ(Jaybird + Java1.7) | ホーム | Firebird 2.5.2にC#から.NET Providerで接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1305-c3aa07ca
この記事にトラックバックする(FC2ブログユーザー)