広告: イマドキのIDE事情: Eclipseベースの統合翻訳環境「Benten」を使ってみよう 09/27 たげぞうさんの手による Benten 紹介記事! |
blanco Framework | 一覧 | ドキュメント | Download (ダウンロード) | SourceForge.jp |
AntTask | BatchProcess | Cg | CharacterGroup | Commons | Constants |
Csv | Db | EclipseDistribution | FixedLength | JSF | Log | Message | NLpack |
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は下記の要領で利用します。
Invokerは下記の要領で利用します。
/* * 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 |