Ibatis-quick-guide
iBATIS-概要
iBATISは、SQLデータベースとJava、.NET、およびRuby on Railsのオブジェクト間のマッピングを自動化する永続化フレームワークです。 SQLステートメントをXML構成ファイルにパッケージ化することにより、マッピングはアプリケーションロジックから分離されます。
iBATISは、POJO(Plain Old Java Objects)の永続化に適した軽量フレームワークおよび永続化APIです。
iBATISはデータマッパーと呼ばれるものであり、クラスプロパティとデータベーステーブルの列の間のパラメーターと結果のマッピングを処理します。
iBATISとHibernateなどの他の永続化フレームワークの大きな違いは、iBATISがSQLの使用を強調していることです。一方、他のフレームワークは通常、Hibernate Query Language(HQL)やEnterprise JavaBeans Query Language(EJB QL)などのカスタムクエリ言語を使用します。
iBATISの設計哲学
iBATISには、次の設計哲学が付属しています-
- シンプルさ- iBATISは、現在入手可能な最も単純な永続化フレームワークの1つであると広く見なされています。
- 高速開発- iBATISは、超高速開発を促進するためにできる限りのことを行います。
- 移植性- iBATISは、Java、Ruby、C#for Microsoft .NETなど、ほぼすべての言語またはプラットフォームに実装できます。
- 独立したインターフェイス- iBATISは、データベースに依存しないインターフェイスとAPIを提供し、アプリケーションの残りの部分が永続性関連のリソースから独立しているようにします。
- オープンソース- iBATISは無料のオープンソースソフトウェアです。
iBATISの利点
iBATISは次の利点を提供します-
- ストアドプロシージャのサポート- iBATISは、SQLをストアドプロシージャの形式でカプセル化するため、ビジネスロジックがデータベースに保持されず、アプリケーションの展開とテストが容易になり、移植性が向上します。
- *インラインSQLをサポート-*プリコンパイラは不要であり、SQLのすべての機能に完全にアクセスできます。
- 動的SQLのサポート- iBATISは、パラメーターに基づいてSQLクエリを動的に構築する機能を提供します。
- * O/RMをサポート-* iBATISは、遅延読み込み、結合フェッチ、キャッシュ、ランタイムコード生成、継承など、O/RMツールと同じ機能の多くをサポートします。
iBATISは、データベース指向アプリケーションの開発中にJAVAプログラミング言語を使用します。 さらに進む前に、手続き型およびオブジェクト指向プログラミングの基本-制御構造、データ構造と変数、クラス、オブジェクトなどを理解していることを確認してください。
JAVAを詳しく理解するには、リンク:/java/index [JAVAチュートリアル]にアクセスしてください。
iBATIS-環境
実際の開発作業を開始する前に、iBATISに適切な環境をセットアップする必要があります。 この章では、iBATISの作業環境をセットアップする方法について説明します。
iBATISのインストール
LinuxマシンにiBATISをインストールするには、次の簡単な手順を実行します-
- Download iBATISから最新バージョンのiBATISをダウンロードします。
- ダウンロードしたファイルを解凍して、バンドルから.jarファイルを抽出し、適切なlibディレクトリに保存します。
- 抽出された.jarファイルでPATHおよびCLASSPATH変数を適切に設定します。
$ unzip ibatis-2.3.4.726.zip
inflating: META-INF/MANIFEST.MF
creating: doc/
creating: lib/
creating: simple_example/
creating: simple_example/com/
creating: simple_example/com/mydomain/
creating: simple_example/com/mydomain/data/
creating: simple_example/com/mydomain/domain/
creating: src/
inflating: doc/dev-javadoc.zip
inflating: doc/user-javadoc.zip
inflating: jar-dependencies.txt
inflating: lib/ibatis-2.3.4.726.jar
inflating: license.txt
inflating: notice.txt
inflating: release.txt
$pwd
/var/home/ibatis
$set PATH=$PATH:/var/home/ibatis/
$set CLASSPATH=$CLASSPATH:/var/home/ibatis\
/lib/ibatis-2.3.4.726.jar
データベースのセットアップ
次の構文を使用して、MySQLデータベースにEMPLOYEEテーブルを作成します-
mysql> CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
SqlMapConfig.xmlを作成します
以下を考慮してください-
- JDBCを使用して、データベース testdb にアクセスします。
- MySQL用のJDBCドライバーは「com.mysql.jdbc.Driver」です。
- 接続URLは「jdbc:mysql://localhost:3306/testdb」です。
- ユーザー名とパスワードをそれぞれ「ルート」と「ルート」として使用します。
- すべての操作のSQLステートメントマッピングは、「Employee.xml」で説明されます。
上記の前提に基づいて、次の内容の SqlMapConfig.xml という名前のXML構成ファイルを作成する必要があります。 これは、iBatisに必要なすべての構成を提供する必要がある場所です-
ファイルSqlMapConfig.xmlとEmployee.xmlの両方がクラスパスに存在することが重要です。 とりあえず、Employee.xmlファイルを空のままにして、その内容を後続の章で説明します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/testdb"/>
<property name="JDBC.Username" value="root"/>
<property name="JDBC.Password" value="root"/>
</dataSource>
</transactionManager>
<sqlMap resource="Employee.xml"/>
</sqlMapConfig>
SqlMapConfig.xmlファイルを使用して、次のオプションのプロパティも設定できます-
<property name="JDBC.AutoCommit" value="true"/>
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="150000"/>
<property name="Pool.MaximumTimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from Employee"/>
<property name="Pool.PingEnabled" value="false"/>
iBATIS-作成操作
iBATISを使用して作成、読み取り、更新、削除(CRUD)操作を実行するには、テーブルに対応するプレーンオールドJavaオブジェクト(POJO)クラスを作成する必要があります。 このクラスは、データベーステーブルの行を「モデル化」するオブジェクトを記述します。
POJOクラスには、目的の操作を実行するために必要なすべてのメソッドの実装があります。
MySQLに次のEMPLOYEEテーブルがあると仮定します-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
従業員POJOクラス
次のようにEmployee.javaファイルにEmployeeクラスを作成します-
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
}/*End of Employee*/
テーブル内の個々のフィールドを設定するメソッドを定義できます。 次の章では、個々のフィールドの値を取得する方法について説明します。
Employee.xmlファイル
iBATISを使用してSQLマッピングステートメントを定義するには、<挿入>タグを使用し、このタグ定義内で、データベースでSQL INSERTクエリを実行するためにIbatisInsert.javaファイルで使用される「id」を定義します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
insert into EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
</sqlMap>
ここで、* parameterClass-*は、要件に基づいて、string、int、float、double、または任意のクラス_object_として値を取ることができます。 この例では、SqlMapクラスの_insert_メソッドを呼び出すときに、Employeeオブジェクトをパラメーターとして渡します。
データベーステーブルでIDENTITY、AUTO_INCREMENT、またはSERIAL列を使用している場合、またはSEQUENCE/GENERATORを定義している場合、<insert>ステートメントで<selectKey>要素を使用して、そのデータベース生成値を使用または返すことができます。
IbatisInsert.javaファイル
このファイルには、Employeeテーブルにレコードを挿入するアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisInsert{
public static void main(String[] args)throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/*This would insert one record in Employee table.*/
System.out.println("Going to insert record.....");
Employee em = new Employee("Zara", "Ali", 5000);
smc.insert("Employee.insert", em);
System.out.println("Record Inserted Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisInsert.javaを作成してコンパイルします。 *IbatisInsertバイナリを実行してプログラムを実行します。
次の結果が得られ、EMPLOYEEテーブルにレコードが作成されます。
$java IbatisInsert
Going to insert record.....
Record Inserted Successfully
あなたはEMPLOYEE表を確認した場合、それは次の結果を表示する必要があります-
mysql> select* from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
iBATIS-読み取り操作
前の章で、iBATISを使用してテーブルでCREATE操作を実行する方法について説明しました。 この章では、iBATISを使用してテーブルを読み取る方法について説明します。
MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
このテーブルには、次のように1つのレコードのみがあります-
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
従業員POJOクラス
読み取り操作を実行するには、次のようにEmployee.javaのEmployeeクラスを変更します-
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the method definitions*/
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
}/*End of Employee*/
Employee.xmlファイル
iBATISを使用してSQLマッピングステートメントを定義するには、Employee.xmlファイルに<select>タグを追加し、このタグ定義内で、データベースでSQL SELECTクエリを実行するためにIbatisRead.javaファイルで使用される「id」を定義します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
</sqlMap>
ここでは、SQL SELECTステートメントでWHERE句を使用しませんでした。 次の章では、SELECTステートメントでWHERE句を使用する方法と、そのWHERE句に値を渡す方法を示します。
IbatisRead.javaファイル
このファイルには、Employeeテーブルからレコードを読み取るアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisRead{
public static void main(String[] args)throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/*This would read all records from the Employee table.*/
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisRead.javaを作成してコンパイルします。
- IbatisReadバイナリを実行してプログラムを実行します。
次の結果が得られ、レコードは次のようにEMPLOYEEテーブルから読み取られます-
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
iBATIS-更新操作
前の章で、iBATISを使用してテーブルでREAD操作を実行する方法について説明しました。 この章では、iBATISを使用してテーブル内のレコードを更新する方法について説明します。
MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
このテーブルには、次のように1つのレコードのみがあります-
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
従業員POJOクラス
udpate操作を実行するには、次のようにEmployee.javaファイルを変更する必要があります-
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the required method definitions*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}/*End of Employee*/
Employee.xmlファイル
iBATISを使用してSQLマッピングステートメントを定義するには、Employee.xmlに<update>タグを追加し、このタグ定義内で、データベースでSQL UPDATEクエリを実行するためにIbatisUpdate.javaファイルで使用される「id」を定義します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
</sqlMap>
IbatisUpdate.javaファイル
このファイルには、レコードをEmployeeテーブルに更新するアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisUpdate{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/*This would update one record in Employee table.*/
System.out.println("Going to update record.....");
Employee rec = new Employee();
rec.setId(1);
rec.setFirstName( "Roma");
smc.update("Employee.update", rec );
System.out.println("Record updated Successfully ");
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisUpdate.javaを作成してコンパイルします。
- IbatisUpdateバイナリを実行して、プログラムを実行します。
次の結果が得られ、レコードがEMPLOYEEテーブルで更新され、後で同じレコードがEMPLOYEEテーブルから読み取られます。
Going to update record.....
Record updated Successfully
Going to read records.....
1 Roma Ali 5000
Records Read Successfully
iBATIS-削除操作
この章では、iBATISを使用してテーブルからレコードを削除する方法について説明します。
MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
このテーブルには次の2つのレコードがあると仮定します-
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
従業員POJOクラス
削除操作を実行するために、Employee.javaファイルを変更する必要はありません。 最後の章と同じように保管しましょう。
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the required method definitions*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}/*End of Employee*/
Employee.xmlファイル
iBATISを使用してSQLマッピングステートメントを定義するには、Employee.xmlに<delete>タグを追加し、このタグ定義内で、データベースでSQL DELETEクエリを実行するためにIbatisDelete.javaファイルで使用される「id」を定義します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
</sqlMap>
IbatisDelete.javaファイル
このファイルには、従業員テーブルからレコードを削除するアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisDelete{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/*This would delete one record in Employee table.*/
System.out.println("Going to delete record.....");
int id = 1;
smc.delete("Employee.delete", id );
System.out.println("Record deleted Successfully ");
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisDelete.javaを作成してコンパイルします。
- IbatisDeleteバイナリを実行してプログラムを実行します。
次の結果が得られ、ID = 1のレコードがEMPLOYEEテーブルから削除され、残りのレコードが読み取られます。
Going to delete record.....
Record deleted Successfully
Going to read records.....
2 Roma Ali 3000
Records Read Successfully
iBATIS-結果マップ
resultMap要素は、iBATISで最も重要かつ強力な要素です。 iBATIS ResultMapを使用すると、JDBCコーディングを最大90%削減できます。場合によっては、JDBCでさえサポートされていないことを実行できます。
ResultMapsの設計では、単純なステートメントは明示的な結果マッピングをまったく必要とせず、より複雑なステートメントは関係を記述するために絶対に必要なもののみを必要とします。
この章では、iBATIS ResultMapsの簡単な紹介を提供します。
MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
このテーブルには、次の2つのレコードがあります-
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
従業員POJOクラス
iBATIS ResultMapを使用するために、Employee.javaファイルを変更する必要はありません。 最後の章と同じように保管しましょう。
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the required method definitions*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}/*End of Employee*/
Employee.xmlファイル
ここでは、Employee.xmlを変更して<resultMap> </resultMap>タグを導入します。 このタグには、<select>タグのresultMap属性でこのresultMapを実行するために必要なidがあります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<!-- Perform Insert Operation -->
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<!-- Perform Read Operation -->
<select id="getAll" resultClass="Employee">
SELECT *FROM EMPLOYEE
</select>
<!-- Perform Update Operation -->
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<!-- Perform Delete Operation -->
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
<!-- Using ResultMap -->
<resultMap id="result" class="Employee">
<result property="id" column="id"/>
<result property="first_name" column="first_name"/>
<result property="last_name" column="last_name"/>
<result property="salary" column="salary"/>
</resultMap>
<select id="useResultMap" resultMap="result">
SELECT* FROM EMPLOYEE
WHERE id=#id#
</select>
</sqlMap>
IbatisResultMap.javaファイル
このファイルには、ResultMapを使用してEmployeeテーブルからレコードを読み取るアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisResultMap{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
int id = 1;
System.out.println("Going to read record.....");
Employee e = (Employee)smc.queryForObject ("Employee.useResultMap", id);
System.out.println("ID: " + e.getId());
System.out.println("First Name: " + e.getFirstName());
System.out.println("Last Name: " + e.getLastName());
System.out.println("Salary: " + e.getSalary());
System.out.println("Record read Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisResultMap.javaを作成し、コンパイルします。
- IbatisResultMapバイナリを実行して、プログラムを実行します。
EMPLOYEEテーブルに対する読み取り操作である次の結果が得られます。
Going to read record.....
ID: 1
First Name: Zara
Last Name: Ali
Salary: 5000
Record read Successfully
iBATIS-ストアドプロシージャ
iBATIS構成を使用して、ストアドプロシージャを呼び出すことができます。 まず、MySQLでストアドプロシージャを作成する方法を理解しましょう。
MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
MySQLデータベースに次のストアドプロシージャを作成しましょう-
DELIMITER $$
DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$
CREATE PROCEDURE `testdb`.`getEmp`
(IN empid INT)
BEGIN
SELECT *FROM EMPLOYEE
WHERE ID = empid;
END $$
DELIMITER;
EMPLOYEEテーブルには次の2つのレコードがあると考えてみましょう-
mysql> select* from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
従業員POJOクラス
ストアドプロシージャを使用するために、Employee.javaファイルを変更する必要はありません。 最後の章と同じように保管しましょう。
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the required method definitions*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}/*End of Employee*/
Employee.xmlファイル
ここでは、Employee.xmlを変更して、<procedure> </procedure>および<parameterMap> </parameterMap>タグを導入します。 ここで、<procedure> </procedure>タグには、アプリケーションでストアドプロシージャを呼び出すために使用するIDがあります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<!-- Perform Insert Operation -->
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<!-- Perform Read Operation -->
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<!-- Perform Update Operation -->
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<!-- Perform Delete Operation -->
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
<!-- To call stored procedure. -->
<procedure id="getEmpInfo" resultClass="Employee" parameterMap="getEmpInfoCall">
{ call getEmp( #acctID# ) }
</procedure>
<parameterMap id="getEmpInfoCall" class="map">
<parameter property="acctID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
</parameterMap>
</sqlMap>
IbatisSP.javaファイル
このファイルには、ResultMapを使用してEmployeeテーブルから従業員の名前を読み取るアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisSP{
public static void main(String[] args) throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
int id = 1;
System.out.println("Going to read employee name.....");
Employee e = (Employee) smc.queryForObject ("Employee.getEmpInfo", id);
System.out.println("First Name: " + e.getFirstName());
System.out.println("Record name Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisSP.javaを作成し、コンパイルします。
- IbatisSPバイナリを実行してプログラムを実行します。
あなたは次の結果を得るでしょう-
Going to read employee name.....
First Name: Zara
Record name Successfully
iBATIS-ダイナミックSQL
ダイナミックSQLは、iBATISの非常に強力な機能です。 パラメータオブジェクトの状態に基づいてWHERE句の条件を変更する必要がある場合があります。 そのような状況では、iBATISは、SQLの再利用性と柔軟性を強化するために、マップされたステートメント内で使用できる動的SQLタグのセットを提供します。
すべてのロジックは、いくつかの追加タグを使用して.XMLファイルに配置されます。 以下は、SELECTステートメントが2つの方法で機能する例です-
- IDを渡すと、そのIDに対応するすべてのレコードが返されます。 *それ以外の場合、従業員IDがNULLに設定されているすべてのレコードが返されます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<select id="findByID" resultClass="Employee">
SELECT* FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNull property="id">
id IS NULL
</isNull>
<isNotNull property="id">
id = #id#
</isNotNull>
</dynamic>
</select>
</sqlMap>
次のように<isNotEmpty>タグを使用して条件を確認できます。 ここでは、渡されたプロパティが空でない場合にのみ条件が追加されます。
..................
<select id="findByID" resultClass="Employee">
SELECT *FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty property="id">
id = #id#
</isNotEmpty>
</dynamic>
</select>
..................
従業員のIDや名前を選択できるクエリが必要な場合、SELECTステートメントは次のようになります-
..................
<select id="findByID" resultClass="Employee">
SELECT* FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty prepend="AND" property="id">
id = #id#
</isNotEmpty>
<isNotEmpty prepend="OR" property="first_name">
first_name = #first_name#
</isNotEmpty>
</dynamic>
</select>
..................
動的SQLの例
次の例は、動的SQLを使用してSELECTステートメントを作成する方法を示しています。 考慮してください、MySQLには次のEMPLOYEEテーブルがあります-
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
次のように、このテーブルにはレコードが1つだけあるとします-
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
従業員POJOクラス
読み取り操作を実行するには、次のようにEmployee.javaにEmployeeクラスを用意します-
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/*Define constructors for the Employee class.*/
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/*Here are the method definitions*/
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
}/*End of Employee*/
Employee.xmlファイル
iBATISを使用してSQLマッピングステートメントを定義するには、次の変更された<select>タグをEmployee.xmlに追加し、このタグ定義内で、ダイナミックSQL SELECTクエリを実行するためにIbatisReadDy.javaで使用される「id」を定義しますデータベース。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotNull property="id">
id = #id#
</isNotNull>
</dynamic>
</select>
</sqlMap>
上記のSELECT文は2つの方法で動作します-
- IDを渡すと、そのIDに対応するレコードが返されます。それ以外の場合は、すべてのレコードが返されます。
IbatisReadDy.javaファイル
このファイルには、従業員テーブルから条件付きレコードを読み取るためのアプリケーションレベルのロジックがあります-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisReadDy{
public static void main(String[] args) throws IOException,SQLException{
Reader rd=Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc=SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would read all records from the Employee table.*/
System.out.println("Going to read records.....");
Employee rec = new Employee();
rec.setId(1);
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.findByID", rec);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
コンパイルと実行
上記のソフトウェアをコンパイルして実行する手順は次のとおりです。 コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisReadDy.javaを作成してコンパイルします。
- IbatisReadDyバイナリを実行してプログラムを実行します。
次の結果が得られ、EMPLOYEEテーブルからレコードが読み取られます。
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
_smc.queryForList( "Employee.findByID"、null)_として null を渡して上記の例を試してください。
iBATIS OGNL式
iBATISは、強力なOGNLベースの式を提供して、他のほとんどの要素を排除します。
- ifステートメント
- 選択、いつ、それ以外の場合
- whereステートメント *foreachステートメント
ifステートメント
動的SQLで最もよく行うことは、where句の一部を条件付きで含めることです。 たとえば-
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT* FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
</select>
このステートメントは、オプションのテキスト検索タイプの機能を提供します。 タイトルを渡さない場合、すべてのアクティブなブログが返されます。 ただし、タイトルを渡すと、指定された like 条件のタイトルが検索されます。
次のように、複数の if 条件を含めることができます-
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null">
AND author like #{author}
</if>
</select>
選択、タイミング、およびその他のステートメント
iBATISは、Javaのswitchステートメントに似た choose 要素を提供します。 多くのオプションから1つのケースのみを選択するのに役立ちます。
次の例では、タイトルが指定されている場合はタイトルのみで検索し、タイトルが指定されている場合は作成者のみで検索します。 どちらも提供されていない場合は、注目のブログのみが返されます-
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT *FROM BLOG
WHERE state = 'ACTIVE.
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author like #{author}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
whereステートメント
前の例を見て、どの条件も満たされない場合はどうなるかを確認してください。 あなたはこのように見えるSQLで終わるでしょう-
SELECT* FROM BLOG
WHERE
これは失敗しますが、iBATISには1つの簡単な変更で簡単なソリューションがあり、すべてが正常に機能します-
<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null>
AND author like #{author}
</if>
</where>
</select>
*where* 要素は、含むタグがコンテンツを返す場合にのみ_WHERE_を挿入します。 さらに、そのコンテンツが_AND_または_ORで始まる場合、それを削除することを認識しています。
foreachステートメント
foreach要素を使用すると、コレクションを指定し、要素の本体内で使用できるアイテム変数とインデックス変数を宣言できます。
また、開始文字列と終了文字列を指定し、繰り返しの間に配置するセパレータを追加することもできます。 次のように IN 条件を構築できます-
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
iBATIS-デバッグ
iBATISを使用してプログラムをデバッグするのは簡単です。 iBATISにはログのサポートが組み込まれており、次のログライブラリで動作し、この順序でそれらを検索します。
- ジャカルタコモンズロギング(JCL)。
- Log4J
- JDKロギング
iBATISと共に上記のライブラリのいずれかを使用できます。
Log4Jを使用したデバッグ
ロギングにLog4Jを使用すると仮定します。 続行する前に、次の点をクロスチェックする必要があります-
- Log4J JARファイル(log4j-\ {version} .jar)はCLASSPATHにある必要があります。
- CLASSPATHでlog4j.propertiesを使用できます。
次に、log4j.propertiesファイルを示します。 行の一部はコメント化されていることに注意してください。 追加のデバッグ情報が必要な場合は、コメントを解除できます。
# Global logging configuration
log4j.rootLogger = ERROR, stdout
log4j.logger.com.ibatis = DEBUG
# shows SQL of prepared statements
#log4j.logger.java.sql.Connection = DEBUG
# shows parameters inserted into prepared statements
#log4j.logger.java.sql.PreparedStatement = DEBUG
# shows query results
#log4j.logger.java.sql.ResultSet = DEBUG
#log4j.logger.java.sql.Statement = DEBUG
# Console output
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] − %m%n
ApacheサイトからLog4Jの完全なドキュメントを見つけることができます-http://logging.apache.org/log4j/[Log4J Documentation]。
iBATISデバッグの例
次のJavaクラスは、JavaアプリケーションのLog4Jロギングライブラリを初期化してから使用する非常に単純な例です。 CLASSPATHにある上記のプロパティファイルを使用します。
import org.apache.log4j.Logger;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisUpdate{
static Logger log = Logger.getLogger(IbatisUpdate.class.getName());
public static void main(String[] args) throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/*This would insert one record in Employee table.*/
log.info("Going to update record.....");
Employee rec = new Employee();
rec.setId(1);
rec.setFirstName( "Roma");
smc.update("Employee.update", rec );
log.info("Record updated Successfully ");
log.debug("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
log.debug("Records Read Successfully ");
}
}
コンパイルと実行
まず、コンパイルと実行に進む前に、PATHとCLASSPATHが適切に設定されていることを確認してください。
- 上記のようにEmployee.xmlを作成します。
- 上記のようにEmployee.javaを作成し、コンパイルします。
- 上記のようにIbatisUpdate.javaを作成してコンパイルします。
- 上記のようにlog4j.propertiesを作成します。
- IbatisUpdateバイナリを実行して、プログラムを実行します。
次の結果が得られます。 EMPLOYEEテーブルでレコードが更新され、その後、同じレコードがEMPLOYEEテーブルから読み取られます。
DEBUG [main] - Created connection 28405330.
DEBUG [main] - Returned connection 28405330 to pool.
DEBUG [main] - Checked out connection 28405330 from pool.
DEBUG [main] - Returned connection 28405330 to pool.
1 Roma Ali 5000
2 Zara Ali 5000
3 Zara Ali 5000
デバッグ方法
上記の例では、* info()*メソッドのみを使用しましたが、要件に応じて次のいずれかのメソッドを使用できます-
public void trace(Object message);
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
iBATIS-休止状態
iBATISとHibernateには大きな違いがあります。 特定のドメインを考えると、両方のソリューションがうまく機能します。 場合にiBATISが提案されています-
- 独自のSQLを作成したいので、それらを維持してもかまいません。
- 環境は、リレーショナルデータモデルによって駆動されます。
- 既存のスキーマおよび複雑なスキーマで作業する必要があります。
環境がオブジェクトモデルによって駆動され、SQLを自動的に生成する必要がある場合は、Hibernateを使用します。
iBATISとHibernateの違い
HibernateとiBATISはどちらも、業界で利用可能なオープンソースのオブジェクトリレーショナルマッピング(ORM)ツールです。 これらの各ツールの使用は、使用しているコンテキストによって異なります。
次の表は、iBATISとHibernateの違いを強調しています-
iBATIS | Hibernate |
---|---|
iBATIS is simpler. It comes in a much smaller package size. | Hibernate generates SQL for you which means you don’t have to spend time on generating SQL. |
iBATIS is flexible. It offers faster development time. | Hibernate is highly scalable. It provides a much more advanced cache. |
iBATIS uses SQL which could be database dependent. | Hibernate uses HQL which is relatively independent of databases. It is easier to change db in Hibernate. |
iBatis maps the ResultSet from JDBC API to your POJO Objets, so you don’t have to care about table structures. | Hibernate maps your Java POJO objects to the Database tables. |
It is quite easy to use stored procedure in iBATIS. | Use of stored procedures is a little difficult in Hibernate. |
HibernateとiBATISはどちらもSPRINGフレームワークから適切なサポートを受けているため、どちらかを選択しても問題はありません。
iBATOR-はじめに
iBATORはiBATISのコードジェネレーターです。 iBATORは、1つ以上のデータベーステーブルをイントロスペクトし、テーブルにアクセスするために使用できるiBATISアーティファクトを生成します。
後で、要件を満たすためにカスタムSQLコードまたはストアドプロシージャを記述できます。 iBATORは次のアーティファクトを生成します-
- SqlMap XMLファイル
- 主キーとテーブルのフィールドを一致させるJavaクラス
- 上記のオブジェクトを使用するDAOクラス(オプション)
iBATORは、スタンドアロンJARファイル、Antタスク、またはEclipseプラグインとして実行できます。 このチュートリアルでは、コマンドラインからiBATIS構成ファイルを生成する最も簡単な方法について説明します。
ダウンロードiBATOR
Eclipse以外のIDEを使用している場合は、スタンドアロンJARをダウンロードします。 スタンドアロンJARには、iBATORを実行するAntタスクが含まれています。または、JavaコードのコマンドラインからiBATORを実行できます。
- zipファイルは、http://people.apache.org/builds/ibatis/ibator/ibator-1.2.1-681.zip [iBATORのダウンロード]からダウンロードできます。
- オンラインドキュメントを確認できます-http://ibatis.apache.org/docs/tools/ibator/[iBATOR Documentation]。
構成ファイルの生成
iBATORを実行するには、次の手順に従ってください-
ステップ1
構成ファイルibatorConfig.xmlを適切に作成して入力します。 少なくとも、指定する必要があります-
- ターゲットデータベースへの接続方法を指定する <jdbcConnection> 要素。
- 生成されたJavaモデルオブジェクトのターゲットパッケージとターゲットプロジェクトを指定する <javaModelGenerator> 要素。
- 生成されたSQLマップファイルのターゲットパッケージとターゲットプロジェクトを指定する <sqlMapGenerator> 要素。
- 生成されたDAOインターフェイスとクラスのターゲットパッケージとターゲットプロジェクトを指定する <daoGenerator> 要素(DAOを生成しない場合は、<daoGenerator>要素を省略できます)。
- 少なくとも1つのデータベース <table> 要素
注意- iBATOR設定ファイルの例については、リンク:/ibatis/ibator_xmlconfig [XML設定ファイルリファレンス]ページを参照してください。
ステップ2
ファイルを便利な場所(たとえば、\ temp \ ibatorConfig.xml)に保存します。
ステップ3
今、次のようにコマンドラインからiBATORを実行します-
java -jar abator.jar -configfile \temp\abatorConfig.xml -overwrite
設定ファイルを使用して実行するようにiBATORに指示します。 また、既存のJavaファイルを同じ名前で上書きするようにiBATORに指示します。 既存のJavaファイルを保存する場合は、*-overwrite *パラメーターを省略します。
競合がある場合、iBATORは新しく生成されたファイルを一意の名前で保存します。
iBATORを実行した後、標準のiBATIS構成ファイルを作成または変更して、新しく生成されたコードを使用する必要があります。 これについては、次のセクションで説明します。
iBATORを実行した後のタスク
iBATORを実行した後、他のiBATIS構成アーティファクトを作成または変更する必要があります。 主なタスクは次のとおりです-
- SqlMapConfig.xmlファイルを作成または変更します。
- dao.xmlファイルを作成または変更します(iBATIS DAO Frameworkを使用している場合のみ)。
各タスクは以下に詳細に説明されています-
SqlMapConfig.xmlファイルの更新
iBATISは、一般的にSqlMapConfig.xmlという名前のXMLファイルを使用して、iBATISセッションで使用されるデータベース接続、トランザクション管理スキーム、およびSQLマップXMLファイルの情報を指定します。
iBATORは実行環境について何も知らないため、このファイルを作成できません。 ただし、このファイルの一部のアイテムは、iBATORで生成されたアイテムに直接関連しています。
設定ファイル内のiBATOR固有のニーズは次のとおりです-
- ステートメントの名前空間を有効にする必要があります。
- iBATORが生成したSQLマップXMLファイルをリストする必要があります。
たとえば、iBATORがMyTable_SqlMap.xmlというSQLマップXMLファイルを生成し、そのファイルがプロジェクトのtest.xmlパッケージに配置されているとします。 SqlMapConfig.xmlファイルには次のエントリが必要です-
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- Statement namespaces are required for Abator -->
<settings useStatementNamespaces="true"/>
<!-- Setup the transaction manager and data source that are
appropriate for your environment
-->
<transactionManager type="...">
<dataSource type="...">
</dataSource>
</transactionManager>
<!-- SQL Map XML files should be listed here -->
<sqlMap resource="test/xml/MyTable_SqlMap.xml"/>
</sqlMapConfig>
複数のSQL Map XMLファイルがある場合(非常に一般的です)、ファイルは<transactionManager>要素の後に繰り返し<sqlMap>要素を使用して任意の順序でリストできます。
dao.xmlファイルの更新
iBATIS DAOフレームワークは、一般にdao.xmlと呼ばれるxmlファイルによって構成されます。
iBATIS DAOフレームワークは、このファイルを使用して、DAOのデータベース接続情報を制御し、DAO実装クラスとDAOインターフェイスをリストします。
このファイルでは、SqlMapConfig.xmlファイルへのパス、およびiBATORが生成したすべてのDAOインターフェイスと実装クラスを指定する必要があります。
たとえば、iBATORがMyTableDAOというDAOインターフェイスとMyTableDAOImplという実装クラスを生成し、ファイルがプロジェクトのtest.daoパッケージに配置されているとします。
dao.xmlファイルにはこれらのエントリが必要です-
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE daoConfig PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
<context>
<transactionManager type="SQLMAP">
<property name="SqlMapConfigResource" value="test/SqlMapConfig.xml"/>
</transactionManager>
<!-- DAO interfaces and implementations should be listed here -->
<dao interface="test.dao.MyTableDAO" implementation="test.dao.MyTableDAOImpl"/>
</context>
</daoConfig>
- 注-*この手順は、iBATIS DAOフレームワーク用にDAOを生成した場合にのみ必要です。