以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置1は、オブジェクト指向言語で開発されたソフトウェアから、複数の項目が定義された関係データベース(RDB)2のテーブル2aへのアクセスを支援する。具体的には、情報処理装置1は、オブジェクトを用いて入力されたデータを、テーブル2aで扱う項目およびデータ型へ対応付けて(マッピング)、テーブル2aへのアクセスを行う。なお、情報処理装置1は、CPU(Central Processing Unit)などのプロセッサとRAM(Random Access Memory)などのメモリとを備えてもよく、メモリに記憶されたプログラムをプロセッサが実行するコンピュータであってもよい。情報処理装置1は、記憶手段1a、生成手段1bおよびアクセス手段1cを有する。
記憶手段1aは、キーとテーブル2aの項目に応じたデータ型との対応関係をテーブルの項目ごとに定義したマッピング情報3を記憶する。例えば、マッピング情報3には、キー“no”、テーブル2aの項目“NO”およびデータ型“数値”が対応付けられている。また、マッピング情報3には、キー“name”、テーブル2aの項目“NAME”およびデータ型“文字”が対応付けられている。ここで、キーは重複しない。記憶手段1aは、テーブル2aに対するクエリの雛型と当該クエリの雛型の識別情報とを対応付けた情報を記憶してもよい。記憶手段1aは、RAMやHDD(Hard Disk Drive)によって実装されてもよい。
生成手段1bは、テーブル2aへのアクセス要求4を受け付ける。アクセス要求4は、キーM1および値M2の組み合わせ(ペア)を一単位として設定したオブジェクト4aを含む。オブジェクト4aは、キーM1および値M2の集合を一単位として設定したものということもできる。オブジェクト4aには、1またはそれ以上の組み合わせ(あるいは集合)を設定できる。キーM1は、マッピング情報3と値M2とを結びつけるための情報である。例えば、キーM1は“name”であり、値M2は“ABC”である。キーM1および値M2が設定されてメモリ上に配置されたオブジェクト4aをインスタンスと呼ぶことがある。
また、アクセス要求4は、テーブル2aに対するクエリの雛型を示す情報4bを含む。クエリの雛型を示す情報4bは、クエリの雛型5に対応する情報である。クエリの雛型5は、クエリのテンプレートであり、例えば“SELECT NO FROM TABLE WHERE NAME =?name?”というSQLの元となる文字列である。ここで、“TABLE”はテーブル2aのテーブル名である。クエリの雛型5は、キーM1に対応する文字列M3を含む。例えば、文字列M3は“?name?”である。クエリの雛型を示す情報4bは、記憶手段1aに記憶されたクエリの雛型5の識別情報でもよい。この場合、生成手段1bは、当該クエリの雛型を示す情報4bに基づいて、記憶手段1aからクエリの雛型5を取得できる。また、クエリの雛型を示す情報4bは、クエリの雛型5そのものでもよい。
生成手段1bは、アクセス要求4を受け付けると、記憶手段1aに記憶されたマッピング情報3を参照して、文字列M3に対応するキーM1がマッピング情報3に含まれる何れかのキーと一致するか判定する。例えば、キーM1が“name”の場合、マッピング情報3に含まれるキー“name”に一致する。この場合、生成手段1bは、キーM1がマッピング情報3に含まれるキーと一致すると判断する。
生成手段1bは、マッピング情報3に含まれる何れかのキーと一致すると判定すると、オブジェクト4aから当該キーに対応する値を取得する。例えば、キーM1がマッピング情報3に含まれるキーと一致すると判断した場合、生成手段1bは、オブジェクト4aからキーM1に対応する値M2を取得する。生成手段1bは、クエリの雛型5に含まれる文字列M3を当該キーM1に対応するデータ型の値M4に置換したクエリ6を生成する。ここで、値M4は、キーM1に対応するデータ型“文字”で値M2を記述した値である。例えば、クエリ6は、“SELECT NO FROM TABLE WHERE NAME = ’ABC’”というSQLである。
アクセス手段1cは、生成手段1bが生成したクエリ6を用いてテーブル2aにアクセスする。すると、アクセス手段1cは、アクセス結果7を得る。
生成手段1bは、アクセス手段1cからアクセス結果7を取得する。生成手段1bは、オブジェクト4cを用いて要求元のソフトウェア(または装置)に当該アクセス結果7を応答する。当該オブジェクト4cの何れのキー、データ型に対応付けるかはマッピング情報3に基づいて判断できる。ここで、オブジェクト4cは、オブジェクト4aと同一のオブジェクトでもよいし、異なるオブジェクトでもよい。生成手段1bは、何れのオブジェクトで応答を得るかを指定する情報を、要求元のソフトウェアからアクセス要求4に含めて受け付けてもよい。
情報処理装置1によれば、生成手段1bにより、アクセス要求4が受け付けられると、記憶手段1aに記憶されたマッピング情報3が参照されて、文字列M3に対応するキーM1がマッピング情報3に含まれる何れかのキーと一致するか判定される。生成手段1bにより、マッピング情報3に含まれる何れかのキーと一致すると判定されると、オブジェクト4aから当該キーM1に対応する値M2が取得される。生成手段1bにより、クエリの雛型5に含まれる文字列M3を当該キーM1に対応するデータ型の値M4に置換したクエリ6が生成される。アクセス手段1cにより、生成した当該クエリを用いたテーブル2aへのアクセスが行われる。
ここで、ORMツールでは、RDB2へのアクセスを行う際に、テーブルごとに所定のオブジェクトを作成するのが一般的である。このようなオブジェクトでは、当該オブジェクトで利用する情報の単位である属性(テーブルの項目に対応するもの)ごとに属性値を設定するための操作や、属性値を取得するための操作を定義してテーブルへのアクセスに用いる。例えば、属性“no”に対して設定用の操作“setNo(・・・)”や取得用の操作“getNo()”を定義する。また、属性“name”に対して設定用の操作“setName(・・・)”や取得用の操作“getName()”を、定義する。また、他のテーブルがあれば、当該他のテーブルに関しても同様にオブジェクトを定義する。しかし、このようにテーブルごと/テーブルの項目ごとにコーディングが発生すると、テーブルの追加や変更時の作業コストが問題となる。
そこで、情報処理装置1では、キーM1と値M2とをペアで設定可能なオブジェクト4aを用いたアクセス要求4を許容する。マッピングの際には、オブジェクト4aからキーM1に基づき値M2を取得し、クエリ6を生成できる。このため、属性ごとに属性値設定用の操作や属性値取得用の操作を定義する手間が省ける。また、アクセス先のテーブルが異なっても、マッピング情報3にテーブルごとの項目名とデータ型とを定義しておけば、何れのテーブルの定義を使用するかをオブジェクト4aとともに指定することで、複数のテーブルに対してオブジェクト4aを利用できる。このため、テーブルごとに別個のオブジェクトを定義する手間が省ける。
このように、汎用的なオブジェクト4aを定義しておけば、複数のテーブルや複数の項目へのアクセスに利用できる。このため、テーブルの追加や変更時の作業コストを軽減し、RDBへのアクセス支援を効率的に行うことができる。その結果、システム開発の一層の効率化を図れる。
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムを示す図である。第2の実施の形態の情報処理システムは、あるシステムの開発に用いられる。第2の実施の形態の情報処理システムは、ORM提供側サーバ100およびORM利用側サーバ200を有する。ORM提供側サーバ100およびORM利用側サーバ200は、ネットワーク10を介して接続されている。例えば、ネットワーク10はLAN(Local Area Network)である。ネットワーク10は、インターネットなどの広域ネットワークでもよい。
ORM提供側サーバ100は、RDBの利用環境をORM利用側サーバ200に提供するサーバコンピュータである。
ORM利用側サーバ200は、ソフトウェアの開発を行うためのサーバコンピュータである。ユーザは、ORM利用側サーバ200を操作して、システムの機能を実現するためのソフトウェアの開発(プログラムのコーディングやテストなど)を行う。ここで、ソフトウェアの開発は、オブジェクト指向言語を用いて行われるとする。オブジェクト指向言語として、JAVA(登録商標)を想定する。なお、以下の説明において「オブジェクト」という場合、ORM提供側サーバ100やORM利用側サーバ200のメモリ上に配置されたオブジェクトの実体(インスタンス)を含む。ただし、処理内容を明確にするために、オブジェクトのインスタンス化を明示することもある。
図3は、第2の実施の形態のORM提供側サーバのハードウェア例を示す図である。ORM提供側サーバ100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、ディスクドライブ106および通信部107を有する。各ユニットがORM提供側サーバ100のバスに接続されている。ORM利用側サーバ200もORM提供側サーバ100と同様のハードウェアを用いて実装できる。
CPU101は、ORM提供側サーバ100の情報処理を制御するプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部を読み出し、RAM102に展開してプログラムを実行する。なお、ORM提供側サーバ100は、複数のプロセッサを設けて、プログラムを分散して実行してもよい。
RAM102は、CPU101が実行するプログラムや処理に用いるデータを一時的に記憶する揮発性メモリである。なお、ORM提供側サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えていてもよい。
HDD103は、OS(Operating System)プログラムやアプリケーションプログラムなどのプログラムおよびデータを記憶する不揮発性の記憶装置である。HDD103は、CPU101の命令にしたがって、内蔵の磁気ディスクに対してデータの読み書きを行う。なお、ORM提供側サーバ100は、HDD以外の種類の不揮発性の記憶装置(例えば、SSD(Solid State Drive)など)を備えてもよく、複数の記憶装置を備えていてもよい。
画像信号処理部104は、CPU101の命令にしたがって、ORM提供側サーバ100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、例えば、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイを用いることができる。
入力信号処理部105は、ORM提供側サーバ100に接続された入力デバイス12から入力信号を取得し、CPU101に出力する。入力デバイス12としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
ディスクドライブ106は、記録媒体13に記録されたプログラムやデータを読み取る駆動装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。ディスクドライブ106は、例えば、CPU101の命令にしたがって、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信部107は、ネットワーク10を介してORM利用側サーバ200と通信を行う通信インタフェースである。通信部107は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
図4は、第2の実施の形態のソフトウェア例を示す図である。図4に示すユニットの一部または全部は、ORM提供側サーバ100およびORM利用側サーバ200が実行するプログラムのモジュールである。ただし、図4に示すユニットの一部または全部は、FPGA(Field Programmable Gate Array)やASIC(Application Specific Integrated Circuit)などの電子回路であってもよい。
ORM提供側サーバ100は、記憶部110、RDB120、GUI(Graphical User Interface)提供部130、DAO(Data Access Object)処理部140およびORM処理部150を有する。
記憶部110は、マッピング定義ファイルおよびSQL定義ファイルを記憶する。マッピング定義ファイルは、オブジェクト指向言語(ここでは、JAVA)で扱うオブジェクトとRDBのレコードとの対応関係を定義したファイルである。SQL定義ファイルは、RDBに対する操作内容(クエリ)の雛型を定義したファイルである。ここで、第2の実施の形態ではクエリはSQLで記述される。このため、SQLの雛型(SQL雛型)は、クエリの雛型(クエリ雛型)と同義である。また、記憶部110は、GUI提供部130、DAO処理部140およびORM処理部150を実現するためのプログラムを記憶する。記憶部110は、例えばRAM102上やHDD103上の記憶領域に実装される。
RDB120は、ORM利用側サーバ200で開発されるソフトウェアがアクセス対象とするテーブルを記憶する。例えば、RDB120はHDD103上の記憶領域に実装される。RDB120には当該RDB120を制御するDBMS(DB Management System)が含まれる。RDB120は、ORM提供側サーバ100に接続されたストレージ装置に格納されてもよい(この場合、DBMSは例えばORM提供側サーバ100で実行する)。
GUI提供部130は、マッピング定義およびSQL定義を入力するためのGUIをORM利用側サーバ200に提供する。GUI提供部130は、Webサーバ機能を有しており、ORM利用側サーバ200で動作するWebブラウザに当該GUIを提供できる。
DAO処理部140は、ORM利用側サーバ200の要求に応じてRDB120に対するアクセス要求をORM処理部150に出力する。アクセス要求は、RDB120に対する所定の操作を行うための要求である。DAO処理部140は、RDB120に対して主要な操作を行うためのメソッドをORM利用側サーバ200に提供する。主要な操作とは、作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)である(これらをまとめてCRUD操作と呼ぶことがある)。ORM利用側サーバ200では、当該メソッドを利用することで、システム固有のロジックとCRUD操作とを分離して開発できる。ただし、DAO処理部140の機能は、ORM利用側サーバ200で開発されるソフトウェアの機能に含まれてもよい。DAO処理部140は、RDB120へのアクセス結果をORM処理部150から取得し、UP(User Program)処理部230に応答する。
ORM処理部150は、DAO処理部140が出力したアクセス要求、記憶部110に記憶されたマッピング定義ファイルおよびSQL定義ファイルに基づいて、RDB120のテーブルに対する操作内容を記述したSQLを生成する。ORM処理部150は、生成したSQLを用いてRDB120のテーブルにアクセスする。ORM処理部150は、アクセス結果をDAO処理部140に応答する。
ORM利用側サーバ200は、記憶部210、ブラウザ220およびUP処理部230を有する。
記憶部210は、ブラウザ220およびUP処理部230を実現するためのプログラムを記憶する。記憶部210は、例えばORM利用側サーバ200が備えるRAM上やHDD上の記憶領域に実装される。
ブラウザ220は、Webブラウザである。ユーザは、ブラウザ220が表示する画面を操作して、マッピング定義やSQL定義をORM提供側サーバ100に入力できる。
UP処理部230は、ORM利用側サーバ200で開発されるソフトウェアの機能の全部または一部である。UP処理部230は、DAO処理部140が提供するCRUD操作のメソッドを用いてRDB120へのアクセスをORM提供側サーバ100に依頼できる。
図5は、第2の実施の形態のオブジェクトの関連を示す図である。図5では、図4に示した各ユニットを実現するプログラムの関連を示している。
記憶部110には、マッピング定義ファイル111およびSQL定義ファイル112を記憶する。マッピング定義ファイル111のファイル名は、例えば“MappingConfig”の文字列を含む。SQL定義ファイル112のファイル名には、例えば“SQLConfig”の文字列を含む。
DAO処理部140の機能は、DAOオブジェクト141により実現される。DAOオブジェクト141は、CRUD操作を行うためのメソッドを実装する。DAOオブジェクト141の名称を“ProviderDAO”とする。
ORM処理部150の機能は、ORMオブジェクト151により実現される。ORMオブジェクト151は、例えば検索系(レコードの検索)のクエリを実行するためのメソッドおよび更新系(レコードの登録、更新、削除など)のクエリを実行するためのメソッドの2種類のメソッドを実装する。ORMオブジェクト151の名称は“ORMEngine”とする。
UP処理部230の機能は、所定のユーザプログラムをORM利用側サーバ200のCPUが実行することで実現される。UP処理部230のRDB120へのアクセス機能は、ユーザオブジェクト231により実現される。ユーザオブジェクト231では、どのようなマッピングルールで、どのようなSQLを、どのような条件で実行するかを指定する。ユーザオブジェクト231の名称は“ORMUser”とする。
ここで、RDB120に対するアクセスは、UP処理部230が起点となる。このとき、UP処理部230は当該アクセスに係る条件を条件オブジェクトと呼ばれるオブジェクトに設定してDAO処理部140に渡す。条件オブジェクトは、クエリ条件を設定するためのオブジェクトである。条件オブジェクトに設定される情報は、RDB120のテーブルの項目に対する条件である。DAO処理部140は当該条件オブジェクトをアクセス要求330に含めて、ORM処理部150に渡す。ORM処理部150は、条件オブジェクトに設定された内容に基づいてSQLを生成し、RDB120へアクセスする。
また、ORM処理部150はアクセス結果を結果オブジェクトに設定して、結果オブジェクトを含むListオブジェクトなどをDAO処理部140に応答する(アクセス応答340)。
条件オブジェクトおよび結果オブジェクトには、2種類のオブジェクトを用い得る。第1のオブジェクトは、匿名オブジェクト310である。第2のオブジェクトは、個別オブジェクト320である。
匿名オブジェクト310は、キーと値との組み合わせ(ペア)を1単位の属性として保持可能なオブジェクトである。以下では、匿名オブジェクト310の名称を“Anonymous”とする。例えば、キーの設定は当該組み合わせを単位として行われる。値の取得はキーを指定することで行われる。より具体的には、“name”(名前)というキーに対して“YAMADA”という値を設定する場合、設定用の操作内容を定義したメソッド“Anonymous#setValue(“name”,“YAMADA”)”を実行する。ここで、“Anonymous#”は、“setValue()”が匿名オブジェクト310のメソッドであることを示す(以下、同様)。また、例えば、“empNo”(従業員番号)というキーの値を取得したい場合、取得用の操作内容を定義したメソッド“Anonymous#getValue(“empNo”)”を実行する。すると、“empNo”をキーに、匿名オブジェクト310から対応する値を取得できる。
ここで、匿名オブジェクト310では、システム開発に用いる言語でのデータの型(開発言語型ということがある)の取り扱いを考慮して、値のデータ型を意識したメソッドを提供する。
例えば、キー“name”に対して文字列型(String)の値を設定するために、文字列型で値を設定するためのメソッド“Anonymous#setValueAsString(“name”,“YAMADA”)”を実装する。また、キー“empNo”に対して数値型(Integer)の値を取得するために、数値型で値を取得するためのメソッド“Anonymous#getValueAsInteger(“empNo”)”を実装する。このようにすれば、JAVAのようにタイプセーフ(型に厳格)な言語でのシステム開発を円滑に行える。
個別オブジェクト320は、アクセス対象とするテーブルの項目に対応する属性を個々のデータとして保持し、各データに対する属性値の設定・取得に係る操作を個別に提供するオブジェクトである。以下では、個別オブジェクト320の名称を“Employee”とする。個別オブジェクト320を用いるとき、“name”という属性名に対して“YAMADA”という属性値を設定する場合、当該属性への設定用のメソッド“Employee#setName(“YAMADA”)”を実行する。また、例えば、“empNo”という属性名の属性値を取得したい場合、取得用のメソッド“Employee#getEmpNo()”を実行する。
ここで、匿名オブジェクト310で扱うキーは、個別オブジェクト320で扱う属性の属性名に対応付けられる。以下の説明では、匿名オブジェクト310のキーと個別オブジェクト320の属性名とが同一であれば、RDB120のテーブルの同一の項目に対応付けるとする。このため、匿名オブジェクト310に設定する組み合わせのキーに相当する情報を、便宜的に「属性名」と呼ぶこととする。また、匿名オブジェクト310に設定する組み合わせの値に相当する情報を、便宜的に「属性値」と呼ぶこととする。
アクセス要求330は、DAO処理部140からORM処理部150へのデータの引き渡しに利用されるコンテキスト情報である。当該アクセス要求330を実現するオブジェクトの名称を“ORMContext”とする。
アクセス応答340は、ORM処理部150からDAO処理部140へのRDB120へのアクセス結果の応答である。例えば、ORM処理部150が検索系の処理を行った場合、アクセス結果のレコードを結果オブジェクトにマッピングし、当該結果オブジェクトをListオブジェクトなどに格納してDAO処理部140へ応答する。また、例えば、ORM処理部150が更新系の処理を行った場合、処理件数を示す情報をDAO処理部140へ応答する。
なお、以上で説明した、DAOオブジェクト141、ORMオブジェクト151、匿名オブジェクト310、個別オブジェクト320、アクセス要求330およびアクセス応答340は、ORM提供側サーバ100上のJAVAの実行環境で実現される。また、ユーザオブジェクト231、匿名オブジェクト310および個別オブジェクト320は、ORM利用側サーバ200上のJAVAの実行環境で実現される。
図6は、第2の実施の形態のEMPテーブルの例を示す図である。EMPテーブル121は、RDB120に格納される。EMPテーブル121は、EMPNO、NAME、SEX、HIREDATEおよびSALARYの項目を含む。
EMPNOの項目には、従業員番号が登録される。NAMEの項目には、従業員の名前が登録される。SEXの項目には、性別が設定される。HIREDATEの項目には、就業日が設定される。SALARYの項目には、月当たりの給料が設定される。
例えば、1人の従業員に対して、EMPNOが“1”、NAMEが“YAMADA”、SEXが“Male”、HIREDATEが“19980401”、SALARYが“350000”が登録されている。
図7は、第2の実施の形態のマッピング定義ファイルの例を示す図である。マッピング定義ファイル111は、記憶部110に記憶される。マッピング定義ファイル111のファイル名は、例えば、“MappingConfig.xml”である。拡張子“.xml”は、マッピング定義ファイル111がXML(Extensible Markup Language)形式で記述されていることを示す。以下、マッピング定義ファイル111の各行の左側に付した番号(行番号)を用いて、各行の記述を指し示す(図8以降に説明する各ファイルも同様)。
マッピング定義ファイル111では、ユーザが登録したマッピング定義を要素<entry>と子要素<item>とで表現している。以下では、オブジェクトで用いる属性の用語と区別するため、XMLの記述においてタグ内に定義される属性をタグ属性と呼ぶこととする。
要素<entry>は、次のタグ属性を持つ。
(1)id:マッピング定義を識別するためのマッピングID(IDentifier)。
(2)table:アクセス対象のテーブルの名称。
(3)class:テーブルへのアクセスに用いるオブジェクトを指定する情報。
要素の定義は、3行目に対応している。マッピング定義ファイル111の例では、3行目〜12行目がマッピングID“MAPPING001”に対応する1つのマッピング定義を示す。
子要素<item>は、次のタグ属性を持つ。
(1)attribute:属性名。
(2)type:開発言語型。
(3)column:テーブルの項目(カラム)名。
(4)dbtype:DBMSデータ型。DBMSで扱うためのデータ型である。
(5)size:データサイズ(桁)。
子要素の定義は、4行目〜11行目に対応している。
ここで、9行目〜11行目には、EMPテーブル121に存在しない項目に対する属性が定義されている。具体的には、“wsalary”、“selectItems”および“addCondition”の属性名の属性である。これらは、マッピング以外の用途に用いる属性であり、これらを「任意属性」と呼ぶこととする。すなわち、マッピング定義においてcolumnに“*”や“@”が設定されている属性が任意属性である。columnに“*”が設定された任意属性はバインド属性であり、後述するSQL雛型に含まれ得るバインド変数に対応している。columnに“@”が設定された任意属性は単純置換属性であり、後述するSQL雛型に含まれ得る単純置換変数に対応している。なお、バインド変数は、SQL実行時に具体的な値を設定することを示す変数である。単純置換変数は、単に文字列に置換可能な変数である。単純置換変数に代入する値は文字列型である。バインド属性と単純置換属性とは、用途に応じて使い分けることができる。使い分けの詳細は後述する。また、任意属性以外の通常のバインド属性(EMPテーブル121の項目名が対応付けられたもの)を「通常属性」と呼ぶこととする。通常属性もSQL雛型に含まれ得るバインド変数に対応するものである。
図8は、第2の実施の形態のSQL定義ファイルの例を示す図である。SQL定義ファイル112は、記憶部110に記憶される。SQL定義ファイル112のファイル名は、例えば、“SQLConfig.xml”である。SQL定義ファイル112では、ユーザが登録したSQL雛型を要素<entry>で表現している。
要素<entry>は、次のタグ属性を持つ。
(1)id:SQL雛型を識別するためのクエリID。
(2)class:テーブルへのアクセスに用いるオブジェクトを指定する情報。
また、要素の内容(<entry>および</entry>で囲われた部分)がSQL雛型を示す。なお、SQL定義ファイル112では、“<”記号は文字列“<”に、“>”は文字列“>”にエスケープしている。
SQL雛型には、マッピング定義ファイル111で定義される属性名に対応する文字列(属性名の最初と最後に“?”を付加したもの)が含まれる。この文字列は変数を示す。
例えば、クエリID“SELECT001”のSQL雛型(4行目)は、属性名“empNo”に対応する文字列“?empNo?”を含む。マッピング定義ファイル111によれば“empNo”は通常属性である。これに対する文字列“?empNo?”はバインド変数である。
また、クエリID“SELECT003”のSQL雛型(10行目)は、属性名“selectItems”に対応する文字列“?selectItems?”を含む。マッピング定義ファイル111によれば“selectItems”は単純置換属性である。これに対する文字列“?selectItems?”は単純置換変数である。また、当該SQL雛型は、属性名“addCondition”に対応する文字列“?addCondition?”を含む。マッピング定義ファイル111によれば“addCondition”は単純置換属性である。これに対する文字列“?addCondition?”は単純置換変数である。
更に、クエリID“UPDATE002”のSQL雛型(16行目)は、属性名“wsalary”に対応する文字列“?wsalary?”を含む。マッピング定義ファイル111によれば“wsalary”は任意属性のバインド属性である。これに対する文字列“?wsalary?”はバインド変数である。
図9は、第2の実施の形態のマッピング定義画面の例を示す図である。マッピング定義画面410は、ブラウザ220によりORM利用側サーバ200に接続されたディスプレイに表示される。ブラウザ220は、GUI提供部130が提供する所定のWebページを示すURL(Uniform Resource Locator)にアクセスすることで、ORM提供側サーバ100からマッピング定義画面410の情報を取得できる。ユーザは、マッピング定義画面410を操作して、アクセス対象のテーブル(EMPテーブル121)のマッピング定義をORM提供側サーバ100に入力できる。
マッピング定義画面410には、マッピング定義入力領域411、作成ボタン412およびダウンロードボタン413が含まれる。ユーザは、ORM利用側サーバ200に接続されたポインティングデバイスを操作することで、ポインタP1を操作して、何れかの入力領域およびボタンに対する選択操作やボタン押下操作を行える(図10以降に示す画面の説明でも同様である)。
マッピング定義入力領域411は、マッピング定義を入力するための領域である。マッピング定義入力領域411の入力内容は、マッピング定義ファイル111のマッピングID“MAPPING001”のマッピング定義に対応している。マッピング定義入力領域411には、入力ボックスC1,C2,C3および入力ボックス群C4が設けられている。
入力ボックスC1は、マッピングIDを入力するための領域である。入力ボックスC1には、GUI提供部130がマッピングIDを自動採番してもよい。例えば、GUI提供部130は、記憶部110に記憶されたマッピング定義ファイル111を参照して、使用済のマッピングIDの最大値を取得し、当該最大値よりも大きな値を、新たなマッピング定義に採番することが考えられる。
入力ボックスC2は、RDB120へのアクセスに用いるオブジェクト(条件/結果オブジェクトとして使用するオブジェクト)の名称を入力するための領域である。個別オブジェクトを使用する場合、入力ボックスC2に“Employee”などの名称を入力する。匿名オブジェクトを使用する場合、入力ボックスC2を未入力(“−”)とする。または、入力ボックスC2に“Anonymous”を入力してもよい。
入力ボックスC3は、アクセス対象テーブルの名称を入力するための領域である。EMPテーブル121の名称は“EMP”である。
入力ボックス群C4は、ORM利用側サーバ200のソフトウェアで扱うデータの日本語名称および型の日本語名称、入力ボックスC2で指定されたオブジェクトで扱うデータの属性名およびデータの型(開発言語型)、入力ボックスC3で指定されたテーブル上でのデータの項目名とデータの型(DBMS型)とサイズ(桁)との対応関係を入力するための領域である。開発言語型は、ここでは属性値をJAVAで扱うためのデータ型である。なお、アクセス対象テーブルのDBMS型およびサイズ(桁)の設定は任意である。
作成ボタン412は、マッピング定義入力領域411に入力された情報に基づいて、マッピング定義ファイル111に対するマッピング定義(ここではマッピングID“MAPPING001”)の登録と個別オブジェクト320の生成を、GUI提供部130に実行させるためのボタンである。ブラウザ220は、作成ボタン412の押下を受け付けると、マッピング定義入力領域411に入力された情報をGUI提供部130に送信する。GUI提供部130は、ブラウザ220から取得した情報に基づいて、マッピング定義ファイル111にマッピング定義を追加する。入力ボックスC2に個別オブジェクトのオブジェクト名が入力された場合、マッピング定義の“class”のタグ属性に、当該個別オブジェクトを指定する情報を登録すると共にオブジェクト(クラスファイル)を自動生成(例えば、属性の設定[取得]メソッド名を「set[get]+属性名の先頭を大文字にしたもの」とルール化することで実現可能である)して記憶部110に配置する。入力ボックスC2にオブジェクト名が入力されなかった場合(または、匿名オブジェクトの名称“Anonymous”が入力された場合)、マッピング定義の“class”のタグ属性に、匿名オブジェクト310を指定する情報を登録する。
ダウンロードボタン413は、ORM提供側サーバ100から個別オブジェクト320をダウンロードするためのボタンである。GUI提供部130は、ダウンロードボタン413の押下に応じた要求に対して、自動生成した個別オブジェクト320をORM利用側サーバ200に提供する。ダウンロードした個別オブジェクト320は記憶部210に配置し、ORM利用側サーバ200上のプログラム(UP処理部230)から利用できるようにしておく。尚、匿名オブジェクト310は、予め記憶部110と記憶部210に配置しておき、ORM利用側サーバ200で実行されるプログラム(UP処理部230)およびORM提供側サーバ100で実行されるプログラム(DAO処理部140、ORM処理部150)から利用できるようにしておく。
図10は、第2の実施の形態のSQL定義画面の例を示す図である。SQL定義画面420は、ブラウザ220によりORM利用側サーバ200に接続されたディスプレイに表示される。ブラウザ220は、GUI提供部130が提供する所定のWebページを示すURLにアクセスすることで、ORM提供側サーバ100からSQL定義画面420の情報を取得できる。ユーザは、SQL定義画面420を操作して、アクセス対象のテーブル(ここではEMPテーブル121)に対するSQL雛型をORM利用側サーバ200に入力できる。SQL定義画面420には、SQL定義入力領域421および作成ボタン422が含まれる。
SQL定義入力領域421は、SQL雛型に関する情報を入力するための領域である。SQL定義入力領域421の入力内容は、SQL定義ファイル112のクエリID“SELECT003”のSQL雛型に対応している。SQL定義入力領域421には、入力ボックスC5,C6,C7が設けられている。
入力ボックスC5は、クエリIDを入力するための領域である。クエリIDは、GUI提供部130が自動採番してもよい。例えば、GUI提供部130は、記憶部110に記憶されたSQL定義ファイル112を参照して、使用済のクエリIDの最大値を取得し、当該最大値よりも大きな値を、新たなSQL雛型に採番することが考えられる。
入力ボックスC6は、RDB120へのアクセスに用いるオブジェクトの名称を入力するための領域である。個別オブジェクトを使用する場合、入力ボックスC6に“Employee”などの名称を入力する。匿名オブジェクト310を使用する場合、入力ボックスC6を未入力(“−”)とする。または、入力ボックスC6に“Anonymous”を入力してもよい。
入力ボックスC7は、SQL雛型の文字列を入力するための領域である。
作成ボタン422は、SQL定義入力領域421に入力された情報に基づいて、SQL定義ファイル112に対するSQL定義の登録を、GUI提供部130に実行させるためのボタンである。ブラウザ220は、作成ボタン422の押下を受け付けると、SQL定義入力領域421に入力された情報をGUI提供部130に送信する。GUI提供部130は、ブラウザ220から取得した情報に基づいて、SQL定義ファイル112にSQL雛型を追加する。なお、入力ボックスC6に個別オブジェクトのオブジェクト名が入力された場合、SQL雛型の“class”のタグ属性には、当該個別オブジェクトを指定する情報が登録される。また、入力ボックスC6にオブジェクト名が入力されていない場合(または、匿名オブジェクトの名称“Anonymous”が入力された場合)、SQL雛型の“class”のタグ属性には、匿名オブジェクトを指定する情報が登録される。
図11は、第2の実施の形態の匿名オブジェクトの記述例を示す図である。匿名オブジェクト310のオブジェクトファイルは、記憶部110,210に記憶される。図11では匿名オブジェクト310のソースプログラム“Anonymous.java”(一部)を例示している。
匿名オブジェクト310では、属性名(キー)と属性値(値)とを組み合わせて扱うためにMapを用いる(9行目)。ただし、同様のキーと値との組み合わせを扱えるMap以外の他のオブジェクトを用いてもよい。
匿名オブジェクト310の新たなインスタンスを作成する(11行目〜13行目)。
更に、指定された属性名に対応する属性値を所定の型で設定するための次のようなメソッドが実装される。
15行目〜19行目に記述されたメソッド“setValueAsString(String name,String value)”は、属性名に対応する属性値を文字列型で設定するためのメソッドである。このような属性値の設定用のメソッドは、Setterメソッドと呼ばれることもある。
27行目〜31行目に記述されたメソッド“setValueAsInteger(String name,Integer value)”は、属性名に対応する属性値を数値型で設定するためのメソッドである。
39行目に記述されたメソッド“setValueAsDate(String name,Date value)”は、属性名に対応する属性値を日付型で設定するためのメソッドである。
42行目に記述されたメソッド“setValue(String name,Object value)”は、属性名に対応する属性値を任意の型として設定するためのメソッドである。なお、39行目および42行目のメソッドに関しては、15行目〜19行目および27行目〜31行目のメソッドと記述形式が同様であるため、図示を省略している。
また、指定された属性名に対応する属性値を所定の型で取得するための次のようなメソッドが実装される。
21行目〜25行目に記述されたメソッド“getValueAsString(String name)”は、属性名に対応する属性値を文字列型で取得するためのメソッドである。このような属性値の取得用のメソッドは、Getterメソッドと呼ばれることもある。
33行目〜37行目に記述されたメソッド“getValueAsInteger(String name)”は、属性名に対応する属性値を数値型で取得するためのメソッドである。
40行目に記述されたメソッド“getValueAsDate(String name)”は、属性名に対応する属性値を日付型で取得するためのメソッドである。
43行目に記述されたメソッド“getValue(String name)”は、属性名に対応する属性値を任意の型で取得するためのメソッドである。なお、40行目および43行目のメソッドに関しては、21行目〜25行目および33行目〜37行目のメソッドと記述形式が同様であるため、図示を省略している。
なお、例えばMapへの非同期アクセスを防いでデータ整合性を確保するために、属性値の設定・取得前に同期処理“synchronized(attrSet)”を行う。
次に、個別オブジェクト320のプログラムの記述例を説明する。
図12は、第2の実施の形態の個別オブジェクトの記述例を示す図である。個別オブジェクト320のオブジェクトファイルは、記憶部110,210に記憶される。図12では個別オブジェクト320のソースプログラム“Employee.java”(一部)を例示している。
個別オブジェクト320では、属性名とデータ型とを定義する(5行目〜12行目)。個別オブジェクト320の新たなインスタンスを作成する(14行目〜15行目)。
更に、各属性に値を設定するための次のようなメソッドが実装される。例えば、メソッド“setEmpNo(Integer empNo)”(17行目〜19行目)は、属性“empNo”への属性値(数値型)を設定するためのメソッドである。また、例えば、メソッド“setName(String name)”(25行目〜27行目)は、属性“name”への属性値(文字列型)を設定するためのメソッドである。“setSex(String sex)”(33行目)、“setHireDate(Date hireDate)”(36行目)および“setSalary(Integer salary)”(39行目)の各メソッドも同様である。
また、各属性から値を取得するための次のようなメソッドが実装される。例えば、メソッド“getEmpNo()”(21行目〜23行目)は、属性“empNo”から属性値(数値型)を取得するためのメソッドである。また、例えば、メソッド“getName()”(29行目〜31行目)は、属性“name”から属性値(文字列型)を取得するためのメソッドである。“getSex()”(34行目)、“getHireDate()”(37行目)および“getSalary()”(40行目)の各メソッドも同様である。
図13は、第2の実施の形態の個別オブジェクトの記述例(続き)を示す図である。個別オブジェクト320には、任意属性に対する属性値の設定用のメソッドも実装される。例えば、メソッド“setWsalary(Integer wsalary)”(43行目〜45行目)は、属性“wsalary”への属性値(数値型)を設定するためのメソッドである。また、メソッド“setSelectItems(String selectItems)”(51行目〜53行目)は、属性“selectItems”への属性値(文字列型)を設定するためのメソッドである。また、メソッド“setAddCondition(String addCondition)”(59行目〜61行目)は、属性“addCondition”への属性値(文字列型)を設定するためのメソッドである。
更に、個別オブジェクト320には、任意属性に対する属性値の取得用のメソッドを実装する。例えば、メソッド“getWsalary()”(47行目〜49行目)は、属性“wsalary”からの属性値(数値型)を取得するためのメソッドである。また、メソッド“getSelectItems()”(55行目〜57行目)は、属性“selectItems”からの属性値(文字列型)を取得するためのメソッドである。また、メソッド“getAddCondition()”(63行目〜65行目)は、属性“addCondition”からの属性値(文字列型)を取得するためのメソッドである。このようにして、個別オブジェクト320でも任意属性を扱えるようにする。
以上のように、個別オブジェクト320では属性ごと(テーブルの項目ごと)に操作用のメソッドを定義するのに対し、匿名オブジェクト310では属性名と属性値とのペアに対して属性値のデータ型ごとの操作を行うメソッドを定義する点が異なる。
図14は、第2の実施の形態のユーザオブジェクトの記述例を示す図である。ユーザオブジェクト231のオブジェクトファイルは、記憶部210に記憶される。図14ではユーザオブジェクト231のソースプログラム“ORMUser.java”(一部)を例示している。ユーザオブジェクト231は、EMPテーブル121に対して、SQL定義ファイル112で定義されたクエリID“SELECT003”を用いたアクセス(検索)を依頼するものである。当該依頼を行うメソッド“select003UsingAnonymous(dao);”(6行目)は、9行目〜16行目に記述されている。“dao”はDAOオブジェクト141のインスタンスである。ユーザオブジェクト231は、所定のリモートコールにより、DAOオブジェクト141を利用できる。
メソッド“select003UsingAnonymous(ProviderDAO dao)”では、匿名オブジェクト310をインスタンス化(インスタンス名“condition”)して条件オブジェクトとする(10行目)。匿名オブジェクト310に対して、属性名“empNo”と数値型の属性値“1”とのペアを設定する(11行目)。また、属性名“sex”と文字列型の属性値“Male”とのペアを設定する(12行目)。更に、属性名“selectItems”と文字列型の属性値“EMPNO,NAME”とのペアを設定する(13行目)。
そして、マッピングID“MAPPING001”、クエリID“SELECT003”、上記3種類のペアを設定した匿名オブジェクト310を指定して、検索用のfindメソッドの実行をDAOオブジェクト141に依頼する。Listオブジェクトでアクセス結果を取得する(14行目)。アクセス結果を示すメッセージ(ログ)を標準出力する(15行目)。
なお、findメソッドに渡す4つ目の引数は結果オブジェクトの情報(“Anonymous.class”)を示している。当該情報は省略してもよい。第2の実施の形態では、当該結果オブジェクトの情報に関わらず、条件オブジェクトと同一種類の結果オブジェクトでアクセス応答を返すためである。例えば、条件オブジェクトが匿名オブジェクト310であれば、結果オブジェクトも匿名オブジェクト310とする。
次に、個別オブジェクト320を用いてRDB120へのアクセスをORM提供側サーバ100に依頼するユーザオブジェクトの他の記述例を説明する。
図15は、第2の実施の形態のユーザオブジェクトの他の記述例を示す図である。ユーザオブジェクト231aのオブジェクトファイルは、記憶部210に記憶される。図15ではユーザオブジェクト231aのソースプログラム“ORMUser2.java”(一部)を例示している。ユーザオブジェクト231aは、EMPテーブル121に対して、SQL定義ファイル112で定義されたクエリID“SELECT003”を用いたアクセス(検索)を依頼するものである。当該依頼を行うメソッド“select003UsingEmployee(dao)”(6行目)は、9行目〜16行目に記述されている。
メソッド“select003UsingEmployee(dao)”では、個別オブジェクト320をインスタンス化(インスタンス名“condition”)して条件オブジェクトとする(10行目)。個別オブジェクト320に対して、属性“empNo”に数値型の属性値“1”を設定する(11行目)。個別オブジェクト320に対して、属性“sex”に文字列型の属性値“Male”を設定する(12行目)。個別オブジェクト320に対して、属性“selectItems”に文字列型の属性値“EMPNO,NAME”を設定する(13行目)。
そして、マッピングID“MAPPING001”、クエリID“SELECT003”、上記3つの属性に対する属性値を設定した個別オブジェクト320を指定して、検索用のfindメソッドの実行をDAOオブジェクト141に依頼する。Listオブジェクトでアクセス結果を取得する(14行目)。アクセス結果を示すメッセージ(ログ)を標準出力する(15行目)。
なお、findメソッドに対して渡されている4つ目の引数(結果オブジェクトの情報)は、匿名オブジェクト310の場合と同様に省略してもよい。
次に、以上の構成の情報処理システムの処理手順を説明する。まず、UP処理部230とDAO処理部140との間の処理手順を説明する。RDB120へアクセスするユーザオブジェクトとして、図14,図15で説明したユーザオブジェクト231,231aを想定する。
図16は、第2の実施の形態のDBアクセス要求を示すフローチャートである。以下、図16に示す処理をステップ番号に沿って説明する。
(ステップS11)UP処理部230は、ユーザオブジェクト231(または、ユーザオブジェクト231a)で指定された条件オブジェクトが個別オブジェクト320であるか否かを判定する。個別オブジェクト320である場合、処理をステップS12に進める。個別オブジェクト320でない場合、処理をステップS14に進める。例えば、ユーザオブジェクト231aの場合、“Employee”(“Anonymous”以外のオブジェクト名)が条件オブジェクトに用いられている。この場合、条件オブジェクトは個別オブジェクト320である。また、ユーザオブジェクト231の場合、匿名オブジェクト310として予め定義された“Anonymous”が条件オブジェクトに用いられている。この場合、条件オブジェクトは匿名オブジェクト310である。
(ステップS12)UP処理部230は、個別オブジェクト320(“Employee”)をインスタンス化する。
(ステップS13)UP処理部230は、ユーザオブジェクト231aで指定された属性値を個別オブジェクト320の各属性に設定する。UP処理部230は、ユーザオブジェクト231aで指定されたマッピングID、クエリIDおよび属性値を設定した個別オブジェクト320をDAO処理部140に送信する。このとき、UP処理部230は、ユーザオブジェクト231aで指定されるメソッド(ここでは、findメソッド)の実行をDAO処理部140に依頼する。そして、処理をステップS16に進める。
(ステップS14)UP処理部230は、匿名オブジェクト310(“Anonymous”)をインスタンス化する。
(ステップS15)UP処理部230は、ユーザオブジェクト231で指定された属性名と属性値とのペアを匿名オブジェクト310に設定する。UP処理部230は、ユーザオブジェクト231で指定されたマッピングID、クエリIDおよび属性名/属性値のペアを設定した匿名オブジェクト310をDAO処理部140に送信する。このとき、UP処理部230は、ユーザオブジェクト231で指定されるメソッド(ここでは、findメソッド)の実行をDAO処理部140に依頼する。
(ステップS16)DAO処理部140は、UP処理部230から依頼された処理内容(ここでは、検索系のfind)に応じてRDB120へのアクセス要求330を生成し、ORM処理部150に出力する。このとき、DAO処理部140は、依頼された処理内容に応じたORM処理部150のメソッド(例えば、検索系のSQLを実行するためのメソッド)を呼び出す。アクセス要求330は、UP処理部230から依頼されたマッピングID、クエリIDおよび条件オブジェクトを含む。
(ステップS17)ORM処理部150は、アクセス要求330に基づいて、条件オブジェクトのSQL雛型へのマッピングを行い、生成したSQLを用いてRDB120へアクセスする。ORM処理部150は、Listなどを用いて生成したアクセス応答340(アクセス結果を含むもの)をDAO処理部140に返す。
(ステップS18)DAO処理部140は、ORM処理部150から取得したアクセス結果をUP処理部230に応答する。UP処理部230は、アクセス結果を示すメッセージを標準出力する。
このようにして、ORM利用側サーバ200からORM提供側サーバ100のRDB120へのアクセスが行われる。次に、上記ステップS17のDBアクセス処理の手順を説明する。
図17は、第2の実施の形態のDBアクセスを示すフローチャートである。以下、図17に示す処理をステップ番号に沿って説明する。
(ステップS21)ORM処理部150は、記憶部110に記憶されたマッピング定義ファイル111に基づいて、アクセス要求330に設定されたマッピングIDに対応するマッピング定義を取得する。ユーザオブジェクト231の例でいえば、マッピングIDは“MAPPING001”である。この場合、ORM処理部150は、マッピング定義ファイル111の要素<entry>の“id”のタグ属性が“MAPPING001”に一致するマッピング定義を取得する。
(ステップS22)ORM処理部150は、記憶部110に記憶されたSQL定義ファイル112に基づいて、アクセス要求330に設定されたクエリIDに対応するSQL雛型を取得する。ユーザオブジェクト231の例でいえば、クエリIDは“SELECT003”である。この場合、ORM処理部150は、SQL定義ファイル112の要素<entry>の“id”のタグ属性が“SELECT003”に一致するSQL雛型を取得する。
(ステップS23)ORM処理部150は、SQL雛型および条件オブジェクトに設定された単純置換属性を用いてプリペアドステートメントを生成する。プリペアドステートメントとは、RDB120のDBMSに事前にキャッシュさせる命令文である。
(ステップS24)ORM処理部150は、プリペアドステートメント、条件オブジェクトに設定された任意属性のバインド属性および通常属性を用いてSQLを完成させる。
(ステップS25)ORM処理部150は、生成したSQLを用いてRDB120へのアクセスを実行する。ORM処理部150は、アクセス内容に応じたアクセス結果を得る。例えば、検索(find)であれば検索結果を示すレコードを得る。また、登録(insertやcreate)であれば登録完了件数を得る。また、更新(update)であれば更新完了件数を得る。更に、削除(delete)であれば削除完了件数を得る。
(ステップS26)ORM処理部150は、結果オブジェクトを用いてアクセス結果をDAO処理部140に応答するかを判定する。結果オブジェクトを用いる場合、処理をステップS27に進める。結果オブジェクトを用いない場合、処理をステップS29に進める。結果オブジェクトを用いる場合とは、例えばアクセス結果として検索結果のレコードを得る場合である。結果オブジェクトを用いない場合とは、例えばアクセス結果として処理件数(登録完了件数、更新完了件数および削除完了件数の何れか)を得る場合である。
(ステップS27)ORM処理部150は、条件オブジェクトと同一のオブジェクトを結果オブジェクトとする。ORM処理部150は、結果オブジェクトをインスタンス化する。ORM処理部150は、検索結果のレコードを結果オブジェクトにマッピングする。結果オブジェクトに対するマッピングの具体例は図22で説明する。ORM処理部150は、結果オブジェクトをListオブジェクトに設定する。
(ステップS28)ORM処理部150は、ListオブジェクトをDAO処理部140に応答する(アクセス応答340に対応する)。そして、処理を終了する。
(ステップS29)ORM処理部150は、処理件数をDAO処理部140に応答する(アクセス応答340に対応する)。そして、処理を終了する。
このようにして、ORM処理部150は、アクセス要求330に対するアクセス応答340を行う。ここで、ORM処理部150は、上記ステップS23,S24で示したようにSQLの生成を2段階で行う。すなわち、まず、プリペアドステートメントによりSQLの文法を予め定義する。次に、当該プリペアドステートメントに値をセットして実行する。これにより、DBMSによるSQL文の解析処理の負担を軽減でき、RDB120へのアクセスにつきスループットの向上を図れる。次に、このようなSQL生成の手順を説明する。まず、上記ステップS23のSQL生成の前処理の手順を説明する。
図18は、第2の実施の形態のSQL生成前処理を示すフローチャートである。以下、図18に示す処理をステップ番号に沿って説明する。
(ステップS31)ORM処理部150は、ステップS22で取得したSQL雛型に単純置換変数が含まれているか否かを判定する。単純置換変数が含まれている場合、処理をステップS32に進める。単純置換変数が含まれていない場合、処理をステップS36に進める。例えば、クエリID“SELECT003”の例でいえば、文字列“?selectItems?”や“?addCondition?”は単純置換変数である。この場合、ORM処理部150は、SQL雛型に単純置換変数が含まれていると判断する。
(ステップS32)ORM処理部150は、条件オブジェクトとして個別オブジェクト320が指定されているか否かを判定する。個別オブジェクト320が指定されている場合、処理をステップS33に進める。個別オブジェクト320が指定されていない場合、処理をステップS34に進める。ステップS11と同様に、ORM処理部150は、条件オブジェクトの名称に基づいて、当該条件オブジェクトが個別オブジェクト320であるか否かを判断できる。
(ステップS33)ORM処理部150は、個別オブジェクト320から単純置換変数の属性値を取得する。例えば、“selectItems”であれば、“getSelectItems()”メソッドを実行して当該属性値を取得できる。また、“addCondition”はユーザオブジェクト231aで値がセットされていないため、“getAddCondition()”メソッドを実行しても値は取得されない。そして、処理をステップS35に進める。
(ステップS34)ORM処理部150は、匿名オブジェクト310から単純置換変数の属性値を取得する。例えば、“selectItems”であれば、“getValueAsString(“selectItems”)”メソッドを実行して当該属性値を取得できる。
(ステップS35)ORM処理部150は、SQL雛型の単純置換変数をステップS33またはステップS34で取得した文字列型の属性値に置換する。単純置換変数に対応する属性値を取得していない場合には、当該単純置換変数の箇所は空欄となる。
(ステップS36)ORM処理部150は、SQL雛型にバインド変数があるか否かを判定する。バインド変数がある場合、処理をステップS37に進める。バインド変数がない場合、SQL雛型をRDB120のDBMSに出力し、処理を終了する。
(ステップS37)ORM処理部150は、SQL雛型に含まれるバインド変数をプレースホルダに変換する。ここで、プレースホルダは、DBMSで事後的に値をセットする箇所を示す文字として許容される文字であり、例えばSQLでは“?”の文字が用いられる。これにより、SQL雛型に基づくプリペアドステートメントが完成する。ORM処理部150が生成したプリペアドステートメントはRDB120のDBMSでキャッシュされる。
このようにして、ORM処理部150はプリペアドステートメントを生成する。
なお、ステップS36において、SQL雛型にバインド属性がないと判定された場合、RDB120のDBMSに出力されるSQLの情報は、SQLの完成形である。
図19は、第2の実施の形態のプリペアドステートメントの例を示す図である。SQL雛型501は、クエリID“SELECT003”に対応するSQL雛型の内容を示したものである。SQL雛型501は、図17のステップS22でORM処理部150により取得される。プリペアドステートメント502は、図18のステップS36の処理後の状態であり、SQL雛型501に基づいてORM処理部150により生成されたプリペアドステートメントである。
例えば、匿名オブジェクト310を用いる場合、ORM処理部150は、次のようにしてプリペアドステートメント502を生成する。
ORM処理部150は、単純置換属性“selectItems”および“addCondition”をSQL雛型501から抽出する。単純置換属性の属性名は、単純置換変数から両側の文字“?”を除外した文字列である。ORM処理部150は、匿名オブジェクト310が提供するメソッドにより、単純置換属性の各属性名をキーに、匿名オブジェクト310から属性値を取得する。ユーザオブジェクト231による匿名オブジェクト310への設定内容によれば、メソッド“getValueAsString(“selectItems”)”により“selectItems”に対し“EMPNO,NAME”を得る。また、メソッド“getValueAsString(“addCondition”)”により“addCondition”に対する属性値は得られない。よって、ORM処理部150は、単純置換変数“?selectItems?”を文字列型の“EMPNO,NAME”に置換する。また、単純置換変数“?addCondition?”を設定なし(空欄)とする。
更に、ORM処理部150は、バインド変数“?empNo?”および“?sex?”をプレースホルダ“?”に置換する。このようにして、プリペアドステートメント502を生成する。
なお、個別オブジェクト320を用いる場合、個別オブジェクト320から属性値を取得するために用いるメソッドが異なる。例えば、属性“selectItems”であれば“getSelectItems()”を用いる。属性“addCondition”であれば“getAddCondition()”を用いる。
なお、ORM処理部150は、何れのプレースホルダが、何れの属性名に対応するかを保持する。例えば、プリペアドステートメント502の最初の(紙面の左側から数えて1つ目の)プレースホルダ“?”は、属性名“empNo”に対応する。また、2番目の(紙面の左側から数えて2つ目の)プレースホルダ“?”は、属性名“sex”に対応する。
このように、単純置換変数を用いて、プリペアドステートメント502で代入しておくべき文字列(ここでは、“EMPNO,NAME”の部分)を容易に指定可能となる。当該単純置換変数の部分にプレースホルダなどが含まれると、プリペアドステートメントが不完全となり、DBMSの文法チェックでエラーとなることがある。単純置換変数によって、当該単純置換変数の部分を適切に文字列型の条件に置換することで、このようなエラーを回避できる。
次に、プリペアドステートメントに基づいてSQLを完成させる処理を説明する。
図20は、第2の実施の形態のSQL生成を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。
(ステップS41)ORM処理部150は、プリペアドステートメントにプレースホルダがあるか否かを判定する。プレースホルダがある場合、処理をステップS42に進める。プレースホルダがない場合、処理を終了する。なお、図18のステップS36でSQLの完成形が得られている場合には、当該SQL生成に係る以降の処理をスキップして処理を終了する。
(ステップS42)ORM処理部150は、プレースホルダに対応する属性名がマッピング定義で定義されているか否かを判定する。定義されている場合、処理をステップS43に進める。定義されていない場合、処理をステップS48に進める。複数のプレースホルダがある場合、全てのプレースホルダに対応する属性名がマッピング定義で定義されている場合に、処理をステップS43に進める。何れかのプレースホルダに対応する属性名がマッピング定義に定義されていない場合は、処理をステップS48に進める。
(ステップS43)ORM処理部150は、ステップS42で判定した各属性名に対応する開発言語型(マッピング定義の“type”のタグ属性の設定)を取得する。
(ステップS44)ORM処理部150は、条件オブジェクトとして個別オブジェクト320が指定されているか否かを判定する。個別オブジェクト320が指定されている場合、処理をステップS45に進める。個別オブジェクト320が指定されていない場合、処理をステップS46に進める。ステップS11と同様に、ORM処理部150は、条件オブジェクトの名称に基づいて、当該条件オブジェクトが個別オブジェクト320であるか否かを判断できる。
(ステップS45)ORM処理部150は、個別オブジェクト320からステップS42で判定した各属性の属性値を取得する。例えば、“empNo”であれば、“getEmpNo()”メソッドを実行して当該属性値“1”を取得できる。そして、処理をステップS47に進める。
(ステップS46)ORM処理部150は、匿名オブジェクト310からステップS42で判定した各属性名に対応する属性値を取得する。例えば、“empNo”であれば、getValueAsInteger(“empNo”)”メソッドを実行して当該属性値“1”を取得できる。なお、数値型用や文字列型用など何れのメソッドを用いるかは、ステップS43で取得した開発言語型による。例えば、属性名“empNo”に対応する開発言語型(“type”のタグ属性)は“Integer”なので、“getValueAsInteger(“empNo”)”を用いる。
(ステップS47)ORM処理部150は、プリペアドステートメントのプレースホルダをステップS45またはステップS46で取得した属性値で置換する。このとき、ステップS43で取得されたデータ型で当該属性値を挿入する。プリペアドステートメント502の例でいえば、最初のプレースホルダ“?”は属性名“empNo”に対応している。よって、最初のプレースホルダ“?”を数値型の“1”に置換する。また、2番目のプレースホルダ“?”は属性名“sex”に対応している。よって、2番目のプレースホルダ“?”を文字列型の“Male”に置換する。これにより、SQLが完成する。
(ステップS48)ORM処理部150は、SQL生成エラーをDAO処理部140に応答する。DAO処理部140は、当該エラーをUP処理部230に通知する。そして、処理を終了する。
このようにして、ORM処理部150はSQLを生成する。
なお、ステップS43では、開発言語型(マッピング定義の“type”のタグ属性)を取得するものとした。これは、RDB120のDBMSが提供するドライバプログラム(Javaの場合、JDBCドライバ)が、開発言語型で入力された値をDBMSデータ型に自動的に変換してSQLを実行するためである。
図21は、第2の実施の形態のSQLの例を示す図である。SQL503は、プリペアドステートメント502に基づいて生成されたSQLである。SQL503は、ステップS47の処理後の状態である。
匿名オブジェクト310および個別オブジェクト320を用いる場合の何れも、プリペアドステートメント502を生成したときと同様にして、プレースホルダ“?”に代入する属性値を取得できる。例えば、プリペアドステートメント502の最初のプレースホルダ“?”は、属性名“empNo”に対応する。よって、匿名オブジェクト310を用いる場合は、“getValueAsInteger(empNo)”メソッドを実行すればよい。各プレースホルダは、マッピング定義ファイル111で定義された、(各プレースホルダに対応する属性名の)開発言語型の属性値に置換される。
このように、SQL生成を2段階で行うことで、上述したようにRDB120へのアクセスのスループット向上を図れる。特に、同様のアクセス処理を何度も実行する場合に有効である。
また、通常属性に係るバインド変数に加えて任意属性に係るバインド変数を利用できる。このため、EMPテーブル121の同一項目に対して2つ以上の条件を与えたい場合にも1つのインスタンスで対応できる。例えば、SQL定義ファイル112ではクエリID“UPDATE002”のSQL雛型が定義されている。当該SQL雛型では、“SALARY”の項目につき“?salary?”および“?wsalary?”の2種類の属性値を設定することができる。これらは、匿名オブジェクト310または個別オブジェクト320の1つのインスタンスで設定可能である。一方、任意属性に係るバインド変数が利用できない場合は、例えば、更新値用(“?salary?”に相当)のインスタンスと、検索条件用(“?wsalary?”に相当)のインスタンスと、を別個に作成することが考えられる。しかし、複数のインスタンスを作成することになり、メモリ使用量が増大し得る。これに対し、任意属性のバインド変数を利用可能とすることで、作成するインスタンス数を軽減でき、メモリ使用量を低減できる。
ORM処理部150は、検索処理を行った場合、アクセス結果として得たレコードを結果オブジェクトにマッピングして、DAO処理部140に応答する。DAO処理部140は、当該結果オブジェクトをUP処理部230に応答する。
図22は、第2の実施の形態の結果オブジェクトの例を示す図である。図22では、EMPテーブル121に対してSQL503を実行したときのアクセス結果を例示している。図22(A)はORM処理部150によって得られた検索結果レコード群121aを示す。
図22(B)は結果オブジェクトに匿名オブジェクト310を用いる場合を示している。この場合、SQL503では項目“EMPNO”および“NAME”の設定値を取得するものとしている。ORM処理部150は、マッピング定義ファイル111(マッピングID“MAPPING001”のマッピング定義)に基づき、検索結果レコード群121aの各レコードの項目“EMPNO”および“NAME”の設定値を匿名オブジェクト310にマッピングする。
具体的には、当該マッピング定義によれば、項目名“EMPNO”に対応する属性名は“empNo”であり、開発言語型は“Integer”である。また、項目名“NAME”に対応する属性名は“name”であり、開発言語型は“String”である。この情報を基に1つ目の検索結果レコードにつき、結果オブジェクトとして匿名オブジェクト311を生成する。匿名オブジェクト311には、属性名“empNo”と数値型の属性値“3”とのペアおよび属性名“name”と文字列型の属性値“SUZUKI”とのペアを設定する。設定のために実行するメソッドは、“setValueAsInteger(“empNo”,3)”および“setValueAsString(“name”,“SUZUKI”)”である。
また、2つ目の検索結果レコードにつき、結果オブジェクトとして匿名オブジェクト312を生成する。匿名オブジェクト312には、属性名“empNo”と数値型の属性値“4”とのペアおよび属性名“name”と文字列型の属性値“INABA”とのペアを設定する。設定のために実行するメソッドは、“setValueAsInteger(“empNo”,4)”および“setValueAsString(“name”,“INABA”)”である。
図22(C)は結果オブジェクトに個別オブジェクト320を用いる場合を示している。ORM処理部150は、マッピング定義ファイル111(マッピングID“MAPPING001”のマッピング定義)に基づき、検索結果レコード群121aの各レコードの項目“EMPNO”および“NAME”の設定値を個別オブジェクト320にマッピングする。
具体的には、1つ目の検索結果レコードにつき、結果オブジェクトとして個別オブジェクト321を生成する。個別オブジェクト321には、属性名“empNo”の属性に数値型の属性値“3”を、属性名“name”の属性に文字列型の属性値“SUZUKI”を設定する。実行するメソッドは、“setEmpNo(3)”および“setName(“SUZUKI”)”である。
また、2つ目の検索結果レコードにつき、結果オブジェクトとして個別オブジェクト322を生成する。個別オブジェクト322には、属性名“empNo”の属性に数値型の属性値“4”を、属性名“name”の属性に文字列型の属性値“INABA”を設定する。実行するメソッドは、“setEmpNo(4)”および“setName(“INABA”)”である。
個別オブジェクト321,322の他の属性の設定値は、設定なし(“−”)となる。
なお、結果オブジェクトに属性値を設定する際に、EMPテーブル121から実際に取得したDBMSデータ型と、マッピング定義ファイル111に定義されたDBMSデータ型と、が整合しているかをチェックしてもよい。例えば、実際に取得した“EMPNO”のDBMSデータ型が“VARCHAR”であり、マッピング定義の“empNo”のDBMSデータ型(“dbtype”のタグ属性)が“INTEGER”であれば、両者のデータ型の不整合を検出する。不整合の場合にエラーを発するようにすれば、意図しないマッピングを未然に防ぐことができ、定義などの見直しをユーザに促すことができる。
RDB120へのアクセスを行うにあたっては、アクセス対象とするテーブル毎に個別オブジェクト320を作成しても構わない。しかし、テーブルが増えればオブジェクトの管理に係るコストやテーブル追加・変更時の作業コストが問題になる。匿名オブジェクト310を提供することにより、こうしたコストを軽減し、RDB120へのアクセス支援を効率的に行うことができる。その結果、システム開発の一層の効率化が図れる。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態との相違点を主に説明し、同様の事項の説明を省略する。
第2の実施の形態では、条件オブジェクトと同じオブジェクトを結果オブジェクトとして用いるものとした。一方、EMPテーブル121に対する個別オブジェクト320を作成した場合に、匿名オブジェクト310と使い分け可能としてもよい。例えば、条件オブジェクトに匿名オブジェクト310を利用し、結果オブジェクトに個別オブジェクト320を利用してもよい。また、例えば、条件オブジェクトに個別オブジェクト320を利用し、結果オブジェクトに匿名オブジェクト310を利用してもよい。匿名オブジェクト310および個別オブジェクト320の何れを結果オブジェクトに用いるかユーザが選択できれば、システム開発をより柔軟化できる。そこで、第3の実施の形態では、匿名オブジェクト310および個別オブジェクト320を使い分け可能とする機能を提供する。
ここで、第3の実施の形態の情報処理システム、ORM提供側サーバおよびORM利用側サーバのハードウェア/ソフトウェアの構成は、図2〜図4で説明した第2の実施の形態の情報処理システム、ORM提供側サーバ100およびORM利用側サーバ200の構成と同様である。第3の実施の形態では、第2の実施の形態と同一の符号・名称を用いて、同一の構成を指し示すものとする。
図23は、第3の実施の形態のマッピング定義ファイルの例を示す図である。マッピング定義ファイル111aは、記憶部110に記憶される。マッピング定義ファイル111aは、第2の実施の形態で説明したマッピング定義ファイル111に対応する(マッピング定義ファイル111に代えて利用される)。第3の実施の形態では、EMPテーブル121に対する個別オブジェクト320を作成している。このため、要素<entry>の“class”のタグ属性の設定がマッピング定義ファイル111と異なる。マッピング定義ファイル111aでは、“class”のタグ属性に個別オブジェクト320を示す情報が設定される。
図24は、第3の実施の形態のSQL定義ファイルの例を示す図である。SQL定義ファイル112aは、記憶部110に記憶される。SQL定義ファイル112aは、第2の実施の形態で説明したSQL定義ファイル112に対応する(SQL定義ファイル112に代えて利用される)。マッピング定義ファイル111aと同様に、SQL定義ファイル112aでは、要素<entry>の“class”のタグ属性に個別オブジェクト320を示す情報が設定される。この点がSQL定義ファイル112と異なる。
図25は、第3の実施の形態のマッピング定義画面の例を示す図である。マッピング定義画面410aは、ブラウザ220によりORM利用側サーバ200に接続されたディスプレイに表示される。マッピング定義画面410aは、第2の実施の形態で説明したマッピング定義画面410と同様の画面構成である。
マッピング定義画面410aでは、入力ボックスC2に個別オブジェクト320のオブジェクト名“Employee”が入力されている点が、マッピング定義画面410と異なる。ユーザは、当初、入力ボックスC2にオブジェクト名を入力せずにマッピング定義を作成したとしても、事後的にオブジェクト名を入力することもできる。
具体的には、入力ボックスC1にマッピングIDを入力して当該マッピングIDに対応するマッピング定義をマッピング定義入力領域411に表示させる。そして、オブジェクト名(当該表示時は“Anonymous”)の設定を個別オブジェクト320のオブジェクト名に変更して、作成ボタン412を押下操作する。すると、マッピング定義ファイル111aで示したように、“class”のタグ属性が個別オブジェクト320のオブジェクト名に書き換わる。マッピング定義の“class”のタグ属性は、デフォルトの結果オブジェクトを指定する情報として利用される。
また、SQL定義画面についても同様の操作により、“class”のタグ属性を個別オブジェクト320のオブジェクト名に設定することができる。
ここで、匿名オブジェクト310および個別オブジェクト320の何れを結果オブジェクトに用いるかは、ユーザオブジェクト231,231aで指定可能とする。具体的には、図14で示したユーザオブジェクト231で、DAO処理部140のfindメソッドを呼び出す際(14行目)、当該findメソッドに入力する4つ目の引数で結果オブジェクトを指定する。当該引数に、“Employee.class”を指定すれば、個別オブジェクト320を指定できる。この場合、当該14行目の記述を、“List<Object> resultList = dao.find(“MAPPING001”,“SELECT003”,condition,Employee.class)”と書き換えればよい。図15で示したユーザオブジェクト231aの場合も同様にして、匿名オブジェクト310を指定することができる。DAO処理部140は、アクセス要求330に当該結果オブジェクトを指定する情報を含める。
次に、第3の実施の形態の情報処理システムの処理手順を説明する。ここで、第3の実施の形態では、図17で説明したステップS26とステップS27との間に、結果オブジェクトの選択処理を実行する点が第2の実施の形態と異なる。
図26は、第3の実施の形態の結果オブジェクト選択を示すフローチャートである。以下、図26に示す処理をステップ番号に沿って説明する。
(ステップS51)ORM処理部150は、アクセス要求330に結果オブジェクトを指定する情報があるか否かを判定する。結果オブジェクトを指定する情報がある場合、処理をステップS53に進める。結果オブジェクトを指定する情報がない場合、処理をステップS52に進める。
(ステップS52)ORM処理部150は、アクセス要求330で指定されたマッピング定義にデフォルトの結果オブジェクトの指定があるか否かを判定する。デフォルトの結果オブジェクトの指定がある場合、処理をステップS53に進める。デフォルトの結果オブジェクトの指定がない場合、処理をステップS54に進める。
(ステップS53)ORM処理部150は、指定されたオブジェクトを結果オブジェクトとして選択する。そして、処理を終了する。
(ステップS54)ORM処理部150は、匿名オブジェクト310を結果オブジェクトとして選択する。そして、処理を終了する。
このようにして、ORM処理部150は、匿名オブジェクト310と個別オブジェクト320のうちの何れを結果オブジェクトに用いるかを選択する。図17で説明したステップS27では、選択された方のオブジェクトを結果オブジェクトとして用いて、それ以降の処理を実行する。
このように、結果オブジェクトを選択可能とすることで、ユーザのシステム開発を一層効率的に支援可能となる。例えば、ORM利用側サーバ200で開発するソフトウェアによっては、条件オブジェクトを匿名オブジェクト310とし、結果オブジェクトを個別オブジェクト320として、アクセス結果を取得したい場合も考えられる。また、条件オブジェクトを個別オブジェクト320として、結果オブジェクトを匿名オブジェクト310として、アクセス結果を取得したい場合も考えられる。第3の実施の形態によれば、ユーザのこのようなニーズにも柔軟に対応することができる。
[第4の実施の形態]
以下、第4の実施の形態を説明する。前述の第2,第3の実施の形態との相違点を主に説明し、同様の事項の説明を省略する。
第2,第3の実施の形態では、ORM提供側サーバ100は、クエリIDを指定したアクセスの依頼をORM利用側サーバ200から受け付ける場合を想定した。一方、クエリIDの指定がなくても、定型的なアクセスであれば、ORM提供側サーバ100でSQLを自動生成してRDB120へのアクセスを行うことが考えられる。そこで、第4の実施の形態では、SQLを自動生成してRDB120へアクセスする機能を提供する。
ここで、第4の実施の形態の情報処理システム、ORM提供側サーバおよびORM利用側サーバのハードウェア/ソフトウェアの構成は、図2〜図4で説明した第2の実施の形態の情報処理システム、ORM提供側サーバ100およびORM利用側サーバ200の構成と同様である。第4の実施の形態では、第2の実施の形態と同一の符号・名称を用いて、同一の構成を指し示すものとする。
図27は、第4の実施の形態のユーザオブジェクトの例を示す図である。図27(A)はユーザオブジェクト231bのソースプログラム“ORMUser3.java”(一部)を例示している。ユーザオブジェクト231bは、EMPテーブル121の全てのレコードを取得するための処理“selectAll(ProviderDAO dao)”をDAO処理部140に依頼する。この処理では、マッピングID“MAPPING001”、クエリID“null”、条件オブジェクト“null”、結果オブジェクト“Anonymous.class”を引数としてfindメソッドを呼び出している(3行目)。
図27(B)はユーザオブジェクト231cのソースプログラム“ORMUser4.java”(一部)を例示している。ユーザオブジェクト231cは、EMPテーブル121に1つのレコードを登録するための処理“insertUsingAnonymous(ProviderDAO dao)”をDAO処理部140に依頼する。この処理では、条件オブジェクトに匿名オブジェクト310を用いている(3行目〜8行目)。ここで、“ORMUtil.createSqlDate()”メソッド(7行目)は、引数として入力された日付(例えば、YYMMDD形式)をSQLで利用可能な形式に変換するためのメソッドである。
また、マッピングID“MAPPING001”、クエリID“null”、条件オブジェクト“condition”(匿名オブジェクト310のインスタンス名)を引数としてcreateメソッドを呼び出している(9行目)。ここで、createメソッドはDAO処理部140が提供するメソッドであり、指定されたテーブルにレコードを追加するためのメソッドである。また、アクセス結果として、登録完了件数を取得する。すなわち、ORM処理部150はアクセス結果のレコードを結果オブジェクトにマッピングして応答しないため、結果オブジェクトを指定する情報は引数に含まれていない。
図27(C)はユーザオブジェクト231dのソースプログラム“ORMUser5.java”(一部)を例示している。ユーザオブジェクト231dは、EMPテーブル121の全てのレコードを削除するための処理“deleteAll(ProviderDAO dao)”をDAO処理部140に依頼する。この処理では、マッピングID“MAPPING001”、クエリID“null”、条件オブジェクト“null”を引数として、removeメソッドを呼び出している(3行目)。ここで、removeメソッドはDAO処理部140が提供するメソッドであり、指定されたテーブルの全レコードを削除するためのメソッドである。また、アクセス結果として、削除完了件数を取得する。すなわち、ORM処理部150はアクセス結果のレコードを結果オブジェクトにマッピングして応答しないため、結果オブジェクトを指定する情報は引数に含まれていない。
次に、第4の実施の形態の情報処理システムの処理手順を説明する。以下では、ユーザオブジェクト231b,231c,231dで例示したように、DAO処理部140への処理依頼時に、クエリIDが指定されない場合を説明する。この場合、図16で説明したDBアクセス要求の処理手順が第2,第3の実施の形態と異なる。
図28は、第4の実施の形態のDBアクセス要求を示すフローチャートである。以下、図28に示す処理をステップ番号に沿って説明する。
(ステップS61)UP処理部230は、RDB120へのアクセス依頼に伴い、条件オブジェクトを利用するか否かを判定する。利用する場合、処理をステップS62に進める。利用しない場合、処理をステップS67に進める。例えば、ユーザオブジェクト231cは、条件オブジェクトを利用する(匿名オブジェクト310が利用されている)。一方、ユーザオブジェクト231b,231dは、条件オブジェクトを利用しない。
(ステップS62)UP処理部230は、条件オブジェクトとして個別オブジェクト320が指定されているか否かを判定する。個別オブジェクト320が指定されている場合、処理をステップS63に進める。個別オブジェクト320が指定されていない場合、処理をステップS65に進める。なお、ステップS11と同様に、UP処理部230は、条件オブジェクトの名称に基づいて、当該条件オブジェクトが個別オブジェクト320であるか否かを判断できる。
(ステップS63)UP処理部230は、指定された個別オブジェクト320をインスタンス化する。
(ステップS64)UP処理部230は、指定された属性値を個別オブジェクト320の各属性に設定する。UP処理部230は、ユーザオブジェクトで指定されたマッピングIDおよび属性値を設定した個別オブジェクト320をDAO処理部140に送信する(クエリIDは指定されない)。UP処理部230は、ユーザオブジェクトで指定されるメソッド(例えば、ユーザオブジェクト231bの例ではfindメソッド)の実行をDAO処理部140に依頼する。そして、処理をステップS67に進める。
(ステップS65)UP処理部230は、匿名オブジェクト310をインスタンス化する。
(ステップS66)UP処理部230は、ユーザオブジェクトで指定された属性名と属性値とのペアを匿名オブジェクト310に設定する。UP処理部230は、ユーザオブジェクトで指定されたマッピングIDおよび属性名/属性値のペアを設定した匿名オブジェクト310をDAO処理部140に送信する(クエリIDは指定されない)。このとき、UP処理部230は、ユーザオブジェクトで指定されるメソッド(例えば、ユーザオブジェクト231cの例ではcreateメソッド)の実行をDAO処理部140に依頼する。
(ステップS67)DAO処理部140は、メソッドに対する引数にクエリIDが含まれていないことを検知する。すると、DAO処理部140は、UP処理部230から取得したマッピングIDおよび記憶部110に記憶されたマッピング定義ファイル111に基づいて、アクセス対象のテーブル名を取得する。例えば、マッピングID“MAPPING001”であれば、テーブル名(table属性の設定)は“EMP”である。なお、本ステップS67でメソッドに対する引数にクエリIDが含まれている場合は、図16のステップS16以降の処理を行う。
(ステップS68)DAO処理部140は、UP処理部230から依頼されたメソッドを実行して、ステップS67で取得したテーブル名を指定したSQL雛型を生成する。図27で示したfind、createおよびremoveの各メソッドが自動生成するSQL雛型の例は、図29で説明する。
(ステップS69)DAO処理部140は、UP処理部230から依頼された処理内容に応じてRDB120へのアクセス要求330を生成し、ORM処理部150に出力する。アクセス要求330は、ステップS68でDAO処理部140が生成したSQL雛型を含む。
(ステップS70)ORM処理部150は、DAO処理部140から取得したSQL雛型に基づいてSQLを生成し、当該SQLを用いてRDB120へアクセスする。ORM処理部150は、アクセス結果を含むアクセス応答340をDAO処理部140に出力する。ORM処理部150による当該アクセス処理の手順は、図17で説明した手順と同様である。ただし、ステップS22〜S24では、DAO処理部140から取得したSQL雛型に基づいてSQLの生成を行う点が異なる。
(ステップS71)DAO処理部140は、ORM処理部150から取得したアクセス結果をUP処理部230に応答する。UP処理部230は、アクセス結果を示すメッセージを標準出力する。
このように、DAO処理部140はクエリIDの指定がない場合には、依頼されたメソッドに応じたSQL雛型を自動生成する。なお、DAO処理部140の代わりにORM処理部150がSQL雛型を自動生成してもよい。例えば、ORM処理部150は、アクセス要求330にクエリIDが含まれていない場合に、SQL雛型を自動生成することが考えられる。
図29は、第4の実施の形態の自動生成されるSQL雛型の例を示す図である。図29(A)はDAO処理部140に実装されるfindメソッドが生成するSQL雛型511を例示している。図29(B)はDAO処理部140に実装されるcreateメソッドが生成するSQL雛型512を例示している。図29(C)はDAO処理部140に実装されるremoveメソッドが生成するSQL雛型513を例示している。
なお、SQL雛型511,513は、“?”で囲まれた文字列を含んでいない。したがって、ORM処理部150がSQL雛型511,513に基づいて生成するSQLの内容はSQL雛型511,513と同一となる。
このように、DAO処理部140は、クエリIDの指定を受けない場合には、SQL雛型を自動生成してORM処理部150に渡す。このため、RDB120に対する定型的な処理の依頼を容易に行える。その結果、システム開発を一層効率化できる。
[第5の実施の形態]
以下、第5の実施の形態を説明する。前述の第2〜第4の実施の形態との相違点を主に説明し、同様の事項の説明を省略する。
第2〜第4の実施の形態で説明した匿名オブジェクト310は、テーブルの結合(join)を行って結果を取得する場合にも利用できる。第5の実施の形態では、結合を行う場合の匿名オブジェクト310の利用方法を例示する。
ここで、第5の実施の形態の情報処理システム、ORM提供側サーバおよびORM利用側サーバのハードウェア/ソフトウェアの構成は、図2〜図4で説明した第2の実施の形態の情報処理システム、ORM提供側サーバ100およびORM利用側サーバ200の構成と同様である。第5の実施の形態では、第2の実施の形態と同一の符号・名称を用いて、同一の構成を指し示すものとする。
図30は、第5の実施の形態のEMPテーブルの例を示す図である。EMPテーブル121bは、記憶部120に記憶される。EMPテーブル121bは、第2の実施の形態で説明したEMPテーブル121に対応する。EMPテーブル121bは、EMPNO、NAME、SEX、HIREDATE、SALARYおよびDEPTNOの項目を含む。
ここで、EMPNO、NAME、SEX、HIREDATEおよびSALARYの項目は、EMPテーブル121で説明した同名の項目と同じ内容が設定される。DEPTNOの項目には、所属する部門の部門番号(例えば、“10”など)が設定される。
図31は、第5の実施の形態のDEPTテーブルの例を示す図である。DEPTテーブル122は、記憶部120に記憶される。DEPTテーブル122は、部門のマスタ情報である。DEPTテーブル122は、DEPTNOおよびDNAMEの項目を含む。
DEPTNOの項目には、部門番号が設定される。DNAMEの項目には、部門の名称が設定される。例えば、DEPTテーブル122には、DEPTNOが“10”、DNAMEが“DEVELOP”という情報が設定されている。
図32は、第5の実施の形態のマッピング定義ファイルの例を示す図である。マッピング定義ファイル111bは、記憶部110に記憶される。マッピング定義ファイル111bは、第2の実施の形態で説明したマッピング定義ファイル111に、EMPテーブル121bとDEPTテーブル122との結合用のマッピング定義を追加したものである。マッピング定義ファイル111bの4行目〜9行目が追加部分である(マッピングID“MAPPING002”の定義)。ここで、結合の場合、複数のテーブルを扱い、テーブルを1つに特定できないため、“table”のタグ属性には任意のテーブルを示す“*”を設定する。なお、マッピング定義ファイル111bでは、結合で利用する属性名や項目名のみを定義している。
図33は、第5の実施の形態のSQL定義ファイルの例を示す図である。SQL定義ファイル112bは、記憶部110に記憶される。SQL定義ファイル112bは、第2の実施の形態で説明したSQL定義ファイル112に、EMPテーブル121bとDEPTテーブル122とを結合してレコードを抽出するためのSQL雛型を追加したものである。SQL定義ファイル112bの4行目〜6行目が追加部分である(クエリID“SELECT004”の定義)。
図34は、第5の実施の形態のマッピング定義画面の例を示す図である。マッピング定義画面410bは、ブラウザ220によりORM利用側サーバ200に接続されたディスプレイに表示される。マッピング定義画面410bは、第2の実施の形態で説明したマッピング定義画面410に対応する。
また、マッピング定義画面410bの入力内容は、マッピング定義ファイル111bの記述に対応する。マッピング定義画面410bでは、入力ボックスC1に“MAPPING002”が入力される。入力ボックスC2に“Anonymous”が入力される。入力ボックスC3に“*”が入力される。また、入力ボックス群C4に結合で利用するデータの名称/型、オブジェクトで扱う属性名/開発言語型、テーブルで扱う項目名/DBMS型/サイズ(桁)を定義する。
このように、結合の場合も第2〜第4の実施の形態で説明した匿名オブジェクト310と同様に定義できる。また、SQL定義ファイル112bで示したSQL雛型の登録は、SQL定義画面420を用いて行える。
ここで、個別オブジェクトを用いて結合を扱う場合、個別オブジェクト間(ここでは、EMPテーブル121bに関する個別オブジェクトとDEPTテーブル122に関する個別オブジェクト)の関連を定義することが考えられる。例えば、SQL定義ファイル112bのクエリID“SELECT004”で示したような結合の場合、マッピング定義に多対1の関連(一方の個別オブジェクトの属性として他方の個別オブジェクトを持つ構造)を定義する。1対多の関連の場合も、同様に当該関連を意識したマッピング定義を行う。
これに対し、匿名オブジェクト310を用いれば、SQL雛型に結合条件を記述して、条件となる項目や取得する項目をマッピング定義に記述しさえすれば、テーブルの結合を容易に扱える。すなわち、個別オブジェクト間の多対1や1対多の関連といった複雑な考え方を意識せずにマッピング定義を行える。このように匿名オブジェクト310を用いれば、結合に係るマッピング定義も容易化でき、ユーザの負担を軽減して効率的なアクセス支援を行える。その結果、システム開発を一層効率化できる。
以上、第2〜第5の実施の形態で説明したように、匿名オブジェクトを利用することで、個別オブジェクトの作成が不要となり、アクセス対象テーブルの変化に影響を受けず、マッピング定義やSQL定義のみでORMを利用することができる。
例えば、個別オブジェクトを用いるとすると、アクセス対象テーブルの数が増えた場合に個別オブジェクトを新たに作成したり、テーブル構造が更新された場合に個別オブジェクトを修正したりする作業コストが生じてしまう。これに対して、匿名オブジェクトを予め用意しておけば、当該匿名オブジェクトを用いて容易に追加されたテーブルや更新後のテーブルへアクセスできる。したがって、個別オブジェクトを作成したり修正したりするユーザの負担を軽減できる。
また、従来のORMではオブジェクトで扱う属性をレコードとマッピングすることに重点をおいており、それ以外の文字列置換など汎用的に利用することができなかった。これに対して、任意属性を追加することで、当該マッピングに限定されずに条件オブジェクトを利用可能となる。
このような仕組みにより、ORMツールの導入やシステム開発に係る工数を削減するとともに、データの変更や機能仕様の変更に柔軟に対応できる変化に強いシステム開発に貢献することができる。
なお、ORM提供側サーバ100の機能はコンピュータに所定のプログラムを実行させることで実現できる。当該プログラムは、コンピュータ読み取り可能な可搬型の記録媒体13に記録しておくことができる。当該プログラムを流通させるには、例えば、そのプログラムが記録された記録媒体13を配布する。または、そのプログラムをサーバコンピュータに格納しておき、ネットワーク10経由でORM提供側サーバ100に転送する。ORM提供側サーバ100は、例えば、記録媒体13に記録されたプログラムまたはネットワーク10から取得したプログラムを、自装置の不揮発性の記憶媒体(例えば、HDD103)に格納する。そして、当該不揮発性の記憶媒体からプログラムを読み取り実行する。ただし、ORM提供側サーバ100は、取得したプログラムを、不揮発性の記憶媒体に格納せずに逐次、RAM102に展開して実行することも可能である。