blanco Framework 画像(小) 2009/04

blancoDb チュートリアル

[igapyon,blancoDb,tutorial] このページは blancoDbのチュートリアルを提供します。blancoDbは O-Rマッピングツールの中では 設定などが極めて少ないもののひとつとなります。基本的に、このページに記載のある手順を踏むことにより O-Rマッピングを実現する 独立性の高いソースコード自動生成することができます。基本的に Excel形式のブック(マクロ無し)に対して設定を行っていきます。

広告: イマドキのIDE事情: Eclipseベースの統合翻訳環境「Benten」を使ってみよう 09/27
たげぞうさんの手による Benten 紹介記事!
インディックスページへ戻る
blanco Framework 一覧 ドキュメント Download (ダウンロード) SourceForge.jp
AntTask BatchProcess Cg CharacterGroup Commons Constants
Csv Db EclipseDistribution FixedLength JSF Log Mail Message NLpack
PDF Report ResourceBundle Service SOAP SQL StringConverter
StringGroup Struts SvnConf ValueObject
概要 詳細 .NET版 PHP版 チュートリアル ダウンロード 開発プラン
blancoDb チュートリアル

このページでは blancoDbのチュートリアルを示します。blancoDbは Excelブック形式で メタ情報を定義していきます。

サンプルデータベース

Microsoft SQL Server 2005ベースによるサンプルデータベースです。

※このテーブルスキーマおよびサンプルデータは、「やさしく学ぶ 基礎からのJDBC」ISBN4-8399-1393-5 ( amazon.co.jp: 4839913935) に載っているものを、著作者の判断により加工・引用したものです。

AUTHOR表
CREATE TABLE AUTHOR (
        AUTHOR_CODE INTEGER NOT NULL
        ,AUTHOR_NAME VARCHAR (12)
        ,AUTHOR_NAME_KANA VARCHAR(24)
        ,DATE_OF_BIRTH DATETIME
        ,GENDER_CODE INTEGER
        ,PRIMARY KEY (AUTHOR_CODE)
);
BOOK表
CREATE TABLE BOOK (
        AUTHOR_CODE INTEGER NOT NULL
        ,TITLE VARCHAR(20)
        , PRIMARY KEY (AUTHOR_CODE, TITLE)
        ,FOREIGN KEY (AUTHOR_CODE) REFERENCES AUTHOR(AUTHOR_CODE)
);

サンプルデータ

AUTHOR表
INSERT INTO AUTHOR VALUES(1,'芥川 竜之介','あくたがわ りゅうのすけ','1892-03-01',1);
INSERT INTO AUTHOR VALUES(2,'太宰 治','だざい おさむ','1909-06-19',1);
INSERT INTO AUTHOR VALUES(3,'夏目 漱石','なつめ そうせき','1867-02-09',1);
INSERT INTO AUTHOR VALUES(4,'新見 南吉','にいみ なんきち','1913-07-30',1);
INSERT INTO AUTHOR VALUES(5,'樋口 一葉','ひぐち いちよう','1872-05-02',2);
INSERT INTO AUTHOR VALUES(6,'平塚 雷鳥','ひらつか らいちょう','1886-02-10',2);
INSERT INTO AUTHOR VALUES(7,'二葉亭 四迷','ふたばてい しめい','1864-02-28',1);
INSERT INTO AUTHOR VALUES(8,'正岡 子規','まさおか しき','1867-09-17',1);
INSERT INTO AUTHOR VALUES(9,'宮沢 賢治','みやざわ けんじ','1896-08-27',1);
INSERT INTO AUTHOR VALUES(10,'与謝野 晶子','よさの あきこ','1878-12-07',2);
BOOK表
INSERT INTO BOOK VALUES(1,'蜘蛛の糸');
INSERT INTO BOOK VALUES(1,'羅生門');
INSERT INTO BOOK VALUES(2,'斜陽');
INSERT INTO BOOK VALUES(3,'我輩は猫である');
INSERT INTO BOOK VALUES(3,'坊ちゃん');
INSERT INTO BOOK VALUES(3,'こころ');
INSERT INTO BOOK VALUES(3,'それから');
INSERT INTO BOOK VALUES(4,'ごん狐');
INSERT INTO BOOK VALUES(5,'だけくらべ');
INSERT INTO BOOK VALUES(6,'青鞜');
INSERT INTO BOOK VALUES(7,'浮雲');
INSERT INTO BOOK VALUES(8,'歌よみに与うる書');
INSERT INTO BOOK VALUES(9,'セロ弾きのゴーシュ');
INSERT INTO BOOK VALUES(9,'銀河鉄道の夜');
INSERT INTO BOOK VALUES(10,'みだれ髪');
blancoDbのメタファイルの記述 (.NET Framework版)
生成後のソースコードの利用例
InsertAuthorConsole
using myapp.db.exception;
using myapp.db.query;

                static void Main(string[] args)
                {
                        // データベース接続を開始します。
                        System.Data.SqlClient.SqlConnection conn = 
                                new System.Data.SqlClient.SqlConnection(
                                "server=localhost;database=master;UID=blancodb;PWD=blancodb");
                        conn.Open();

                        System.Data.SqlClient.SqlTransaction tran = null;

                        try
                        {
                                // トランザクションを開始します。
                                tran = conn.BeginTransaction();

                                InsertAuthorInvoker invoker = new InsertAuthorInvoker(conn, tran);
                                try 
                                {
                                        // 入力パラメータをセットします。
                                        invoker.SetInputParameter(12, "山田太郎", "ヤマダタロウ", DateTime.Now, 1);

                                        try
                                        {
                                                invoker.ExecuteSingleUpdate();

                                                tran.Commit();
                                                tran = null;
                                                Console.WriteLine("追加が成功しました。");
                                        }
                                        catch(NotSingleRowException ex)
                                        {
                                                Console.WriteLine("期待する一件が更新できませんでした。" + ex.ToString());
                                        }
                                        catch(IntegrityConstraintException ex)
                                        {
                                                Console.WriteLine("一意制約に違反しました。" + ex.ToString());
                                        }
                                }
                                finally
                                {
                                        invoker.Close();
                                }
                        }
                        finally
                        {
                                try
                                {
                                        if(tran != null)
                                        {
                                                // トランザクションオブジェクトがあり、かつ未コミットの場合にのみロールバックをかけます。
                                                Console.WriteLine("ロールバックをかけました。");
                                                tran.Rollback();
                                        }
                                }
                                finally
                                {
                                        if(conn != null)
                                        {
                                                // データベース接続を終了します。
                                                conn.Close();
                                                conn.Dispose();
                                        }
                                }
                        }
                }


UpdateAuthorConsole
using myapp.db.exception;
using myapp.db.query;

                static void Main(string[] args)
                {
                        // データベース接続を開始します。
                        System.Data.SqlClient.SqlConnection conn = 
                                new System.Data.SqlClient.SqlConnection(
                                "server=localhost;database=master;UID=blancodb;PWD=blancodb");
                        conn.Open();

                        System.Data.SqlClient.SqlTransaction tran = null;

                        try
                        {
                                // トランザクションを開始します。
                                tran = conn.BeginTransaction();

                                UpdateAuthorInvoker invoker = new UpdateAuthorInvoker(conn, tran);
                                try 
                                {
                                        // 入力パラメータをセットします。
                                        invoker.SetInputParameter(10, "山田太郎", "ヤマダタロウ", DateTime.Now, 1);

                                        try
                                        {
                                                invoker.ExecuteSingleUpdate();

                                                tran.Commit();
                                                tran = null;
                                                Console.WriteLine("更新が成功しました。");
                                        }
                                        catch(NotSingleRowException ex)
                                        {
                                                Console.WriteLine("期待する一件が更新できませんでした。" + ex.ToString());
                                        }
                                }
                                finally
                                {
                                        invoker.Close();
                                }
                        }
                        finally
                        {
                                try
                                {
                                        if(tran != null)
                                        {
                                                // トランザクションオブジェクトがあり、かつ未コミットの場合にのみロールバックをかけます。
                                                Console.WriteLine("ロールバックをかけました。");
                                                tran.Rollback();
                                        }
                                }
                                finally
                                {
                                        if(conn != null)
                                        {
                                                // データベース接続を終了します。
                                                conn.Close();
                                                conn.Dispose();
                                        }
                                }
                        }
                }


SelectManyConsole
using myapp.db.query;
using myapp.db.row;

                static void Main(string[] args)
                {
                        // データベース接続を開始します。
                        System.Data.SqlClient.SqlConnection conn = 
                                new System.Data.SqlClient.SqlConnection(
                                "server=localhost;database=master;UID=blancodb;PWD=blancodb");
                        conn.Open();

                        System.Data.SqlClient.SqlTransaction tran = null;

                        try
                        {
                                // トランザクションを開始します。
                                tran = conn.BeginTransaction();

                                SelectManyIterator iterator = new SelectManyIterator(conn, tran);
                                try 
                                {
                                        // 入力パラメータをセットします。
                                        iterator.SetInputParameter(2);
                                        iterator.ExecuteQuery();

                                        // 結果セットの全件を処理します。
                                        for(; iterator.Next();)
                                        {
                                                SelectManyRow row = iterator.GetRow();
                                                Console.WriteLine(row.GetAuthorCode());
                                                Console.WriteLine("  " + row.GetAuthorName());
                                        }
                                }
                                finally
                                {
                                        iterator.Close();
                                }

                                tran.Commit();
                                tran = null;
                        }
                        finally
                        {
                                try
                                {
                                        if(tran != null)
                                        {
                                                // トランザクションオブジェクトがあり、かつ未コミットの場合にのみロールバックをかけます。
                                                tran.Rollback();
                                        }
                                }
                                finally
                                {
                                        if(conn != null)
                                        {
                                                // データベース接続を終了します。
                                                conn.Close();
                                                conn.Dispose();
                                        }
                                }
                        }
                }


SelectOneConsole
using myapp.db.exception;
using myapp.db.query;
using myapp.db.row;

                static void Main(string[] args)
                {
                        // データベース接続を開始します。
                        System.Data.SqlClient.SqlConnection conn = 
                                new System.Data.SqlClient.SqlConnection(
                                "server=localhost;database=master;UID=blancodb;PWD=blancodb");
                        conn.Open();

                        System.Data.SqlClient.SqlTransaction tran = null;

                        try
                        {
                                // トランザクションを開始します。
                                tran = conn.BeginTransaction();

                                SelectOneIterator iterator = new SelectOneIterator(conn, tran);
                                try 
                                {
                                        // 入力パラメータをセットします。
                                        iterator.SetInputParameter(4);
                                        iterator.ExecuteQuery();

                                        try
                                        {
                                                // 結果セットの1件を処理します。
                                                SelectOneRow row = iterator.GetSingleRow();
                                                Console.WriteLine(row.GetAuthorCode());
                                                Console.WriteLine("  " + row.GetAuthorName());
                                        }
                                        catch(NotSingleRowException ex)
                                        {
                                                Console.WriteLine("期待する一件が検索できませんでした。" + ex.ToString());
                                        }
                                }
                                finally
                                {
                                        iterator.Close();
                                }

                                tran.Commit();
                                tran = null;
                        }
                        finally
                        {
                                try
                                {
                                        if(tran != null)
                                        {
                                                // トランザクションオブジェクトがあり、かつ未コミットの場合にのみロールバックをかけます。
                                                tran.Rollback();
                                        }
                                }
                                finally
                                {
                                        if(conn != null)
                                        {
                                                // データベース接続を終了します。
                                                conn.Close();
                                                conn.Dispose();
                                        }
                                }
                        }
                }


blancoDbの実行に必要なライブラリ (プラグインの場合)

blancoDb Enterprise Editionの最も簡単な導入は Eclipse プラグイン形式で配布されている BlancoDb Enterprise Edition Plug-inを利用してチュートリアルを実施することです。プラグインをダウンロードすれば必要なライブラリは JDBCドライバ以外は既に揃っています。

blancoDbの実行に必要なライブラリ (Antタスクの場合)

Antタスクとして blancoDbの実行 (ソースコード生成) をおこなうためには、下記のblancoDb用の jar ファイルが必要になります。

※blancoDbTutorial (blancoDbチュートリアル) をダウンロードすると、解凍後イメージに これらjarファイルが含まれています。(ただし、junit.jarは Eclipseに同梱されたものを利用するようにしてください)

また、blancoDbは実行に際して JDBCドライバを必要とします。対象となるリレーショナルデータベース用の JDBCドライバをクラスパスに含めてから blancoDbの実行を行ってください。

blancoDb のためのメタ情報の設定

下記のように、Excelファイル形式でblancoDb SQL定義設定を実施します。

ポイント


R/Oマッピング・ソースコードの利用方法

R/Oマッピング自動生成を行うと、完全に自動生成されるクラスとExcelに定義した内容から生成されるクラスの2種類が作成されます。

Iteratorは下記の要領で利用します。

  1. ite = new XXXXXIterator(java.sql.Connection)
  2. ite.prepareStatement()
  3. ite.setInputParameter()
    ※SQL入力パラメータの指定が必要な場合にのみ実行
  4. ite.executeQuery()
  5. ite.next()
  6. ite.getAsObject()
  7. ite.close()

Invokerは下記の要領で利用します。

  1. inv = new XXXXXInvoker(java.sql.Connection)
  2. inv.prepareStatement()
  3. inv.setInputParameter()
    ※SQL入力パラメータの指定が必要な場合にのみ実行
  4. inv.execute()
  5. inv.close()
/*
 * blancoDbTutorial: blancoDbチュートリアル・サンプル
 * 
 * Copyright (C) 2005 tosiki.iga@nifty.ne.jp
 */

package sql2k;

import igapyon.query.iterator.CustomersAllIterator;
import igapyon.query.iterator.SimpleCategoriesSelectAllIterator;
import igapyon.query.iterator.SimpleCustomersSelectAllIterator;
import igapyon.row.CustomersAllRow;
import igapyon.row.SimpleCategoriesSelectAllRow;
import igapyon.row.SimpleCustomersSelectAllRow;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * 注意: このクラスをコンパイルするためには、それまでの手順で自動生成したblancoDbソースコードが必要になります。
 */
public class BlancoDbTutorial11Sql2k {
        /**
         * JDBCドライバ名を指定します。
         */
        public static final String JDBC_DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

        /**
         * JDBC接続時の文字列を指定します。 <br>
         * ポイント: SelectMethod=cursor の指定は必須です。
         */
        public static final String JDBC_URL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind;SelectMethod=cursor";

        /**
         * JDBC接続時のユーザ名を指定します。
         */
        public static final String JDBC_USERNAME = "sa";

        /**
         * JDBC接続時のパスワードを指定します。
         */
        public static final String JDBC_PASSWORD = "password";

        public static void main(String[] args) {
                try {
                        new BlancoDbTutorial11Sql2k().process();
                } catch (ClassNotFoundException e) {
                        System.out.println("クラスのロードに失敗しました。" + e.toString());
                        e.printStackTrace();
                } catch (SQLException e) {
                        System.out.println("SQL例外が発生しました:" + e.toString());
                        e.printStackTrace();
                }
        }

        public void process() throws ClassNotFoundException, SQLException {
                Class.forName(JDBC_DRIVER);
                Connection conn = null;
                try {
                        conn = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME,
                                        JDBC_PASSWORD);
                        conn.setAutoCommit(false);
                        // SQL Server 2000 デフォルトのトランザクション分離レベルは
                        // Connection.TRANSACTION_READ_COMMITTED"
                        //conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

                        processCategories(conn);
                        processCustomers(conn);

                        processCustomersAll(conn);

                        System.out.println("更新処理が終了しました。待機します。");
                        try {
                                Thread.sleep(10000);
                        } catch (InterruptedException e) {
                                System.out.println("予期せぬ例外:" + e.toString());
                                e.printStackTrace();
                        }

                        conn.commit();
                        System.out.println("全ての処理終了しました.");
                } finally {
                        conn.rollback();
                        conn.close();
                        conn = null;
                }
        }

        public void processCategories(Connection conn) throws SQLException {
                SimpleCategoriesSelectAllIterator iterator = new SimpleCategoriesSelectAllIterator(
                                conn);
                try {
                        iterator.prepareStatement();
                        iterator.executeQuery();
                        List listAll = iterator.getList();
                        for (int index = 0; index < listAll.size(); index++) {
                                SimpleCategoriesSelectAllRow row = (SimpleCategoriesSelectAllRow) listAll
                                                .get(index);
                                System.out.println("Categories: [" + row.getCategoryID() + "]");
                                System.out.println("    [" + row.getCategoryName() + "]");
                                System.out.println("    [" + row.getDescription() + "]");
                        }
                } finally {
                        iterator.close();
                }
        }

        public void processCustomers(Connection conn) throws SQLException {
                SimpleCustomersSelectAllIterator iterator = new SimpleCustomersSelectAllIterator(
                                conn);
                try {
                        //iterator.prepareStatement();
                        iterator.executeQuery();
                        List listAll = iterator.getList();
                        for (int index = 0; index < listAll.size(); index++) {
                                SimpleCustomersSelectAllRow row = (SimpleCustomersSelectAllRow) listAll
                                                .get(index);
                                System.out.println("Customers: [" + row.getCustomerID() + "]");
                                System.out.println("    [" + row.getAddress() + "]");
                                System.out.println("    [" + row.getPhone() + "]");
                        }
                } finally {
                        iterator.close();
                }
        }

        /**
         * 更新カーソルによる行ロック
         * 
         * @param conn
         * @throws SQLException
         */
        public void processCustomersAll(Connection conn) throws SQLException {
                CustomersAllIterator dbIterator = new CustomersAllIterator(conn);
                try {
                        System.out.println("CustomersAllIteratorを利用.");
                        dbIterator.prepareStatement(dbIterator.getQuery(),
                                        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
                        System.out.println(dbIterator.getQuery());
                        dbIterator.executeQuery();
                        for (int counter = 0; dbIterator.next(); counter++) {
                                CustomersAllRow customersall = dbIterator.getRow();
                                System.out.println("Customers: ["
                                                + customersall.getCustomerID() + "]");
                                System.out.println("  [" + customersall.getAddress() + "]");
                                System.out.println("  [" + customersall.getPhone() + "]");
                                System.out.println("  [" + customersall.getCity() + "]");

                                // ここから更新処理
                                dbIterator.updateCity("abc:" + counter + ":2");
                                dbIterator.updateRow();
                        }
                } catch (SQLException ex) {
                        System.out.println(ex.getSQLState());
                        System.out.println(ex.getErrorCode());
                        System.out.println(ex.toString());
                        ex.printStackTrace();
                } finally {
                        dbIterator.close();
                }
        }
}
更新可能カーソル

更新可能カーソルについてはリレーショナルデータベース毎に対応するための方法が一部 異なります。

各リレーショナルデータベース共通

Microsoft SQL Server 2000

FAQ

SourceForge.jp


いがぴょんについて
Last modified: $Date: 2010/09/27 20:42:52 $