iBATIS - Panduan Cepat
iBATIS adalah kerangka kerja ketekunan yang mengotomatiskan pemetaan antara database SQL dan objek di Java, .NET, dan Ruby on Rails. Pemetaan dipisahkan dari logika aplikasi dengan mengemas pernyataan SQL dalam file konfigurasi XML.
iBATIS adalah kerangka kerja ringan dan API persistensi yang baik untuk POJO yang bertahan (Objek Java Lama Biasa).
iBATIS adalah apa yang dikenal sebagai pemeta data dan menangani pemetaan parameter dan hasil antara properti kelas dan kolom dari tabel database.
Perbedaan yang signifikan antara iBATIS dan kerangka kerja persistensi lainnya seperti Hibernate adalah bahwa iBATIS menekankan penggunaan SQL, sementara kerangka kerja lain biasanya menggunakan bahasa kueri khusus seperti Hibernate Query Language (HQL) atau Enterprise JavaBeans Query Language (EJB QL).
Filosofi Desain iBATIS
iBATIS hadir dengan filosofi desain berikut -
Simplicity − iBATIS secara luas dianggap sebagai salah satu kerangka kerja persistensi paling sederhana yang tersedia saat ini.
Fast Development − iBATIS melakukan semua yang bisa untuk memfasilitasi perkembangan yang sangat cepat.
Portability − iBATIS dapat diimplementasikan untuk hampir semua bahasa atau platform seperti Java, Ruby, dan C # untuk Microsoft .NET.
Independent Interfaces − iBATIS menyediakan antarmuka dan API independen basis data yang membantu aplikasi lainnya tetap independen dari sumber daya yang terkait dengan persistensi.
Open source − iBATIS adalah perangkat lunak gratis dan sumber terbuka.
Keuntungan iBATIS
iBATIS menawarkan keuntungan berikut -
Supports stored procedures − iBATIS merangkum SQL dalam bentuk prosedur yang tersimpan sehingga logika bisnis dijauhkan dari database, dan aplikasi lebih mudah untuk digunakan dan diuji, dan lebih portabel.
Supports inline SQL − Tidak diperlukan precompiler, dan Anda memiliki akses penuh ke semua fitur SQL.
Supports dynamic SQL − iBATIS menyediakan fitur untuk membuat kueri SQL secara dinamis berdasarkan parameter.
Supports O/RM − iBATIS mendukung banyak fitur yang sama dengan alat O / RM, seperti lazy loading, join fetching, caching, pembuatan kode runtime, dan inheritance
iBATIS memanfaatkan bahasa pemrograman JAVA sambil mengembangkan aplikasi berorientasi database. Sebelum melangkah lebih jauh, pastikan Anda memahami dasar-dasar pemrograman prosedural dan berorientasi objek - struktur kontrol, struktur dan variabel data, kelas, objek, dll.
Untuk memahami JAVA secara detail, Anda bisa melalui Tutorial JAVA kami .
Anda harus menyiapkan lingkungan yang tepat untuk iBATIS sebelum memulai dengan pekerjaan pengembangan yang sebenarnya. Bab ini menjelaskan cara mengatur lingkungan kerja untuk iBATIS.
Instalasi iBATIS
Lakukan langkah-langkah sederhana berikut untuk menginstal iBATIS di mesin Linux Anda -
Unduh versi terbaru iBATIS dari Unduh iBATIS .
Buka zip file yang diunduh untuk mengekstrak file .jar dari bundel dan simpan di direktori lib yang sesuai.
Setel variabel PATH dan CLASSPATH pada file .jar yang diekstrak dengan benar.
$ 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
Pengaturan Database
Buat tabel EMPLOYEE di database MySQL mana pun menggunakan sintaks berikut -
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)
);
Buat SqlMapConfig.xml
Pertimbangkan hal berikut -
Kami akan menggunakan JDBC untuk mengakses database testdb.
Driver JDBC untuk MySQL adalah "com.mysql.jdbc.Driver".
URL koneksi adalah "jdbc: mysql: // localhost: 3306 / testdb".
Kami akan menggunakan username dan password sebagai "root" dan "root".
Pemetaan pernyataan sql kami untuk semua operasi akan dijelaskan di "Employee.xml".
Berdasarkan asumsi di atas, kita harus membuat file konfigurasi XML dengan nama SqlMapConfig.xmldengan konten berikut. Di sinilah Anda perlu menyediakan semua konfigurasi yang diperlukan untuk iBatis -
Penting bahwa file SqlMapConfig.xml dan Employee.xml harus ada di jalur kelas. Untuk saat ini, kami akan membiarkan file Employee.xml kosong dan kami akan membahas isinya di bab-bab berikutnya.
<?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>
Anda dapat mengatur properti opsional berikut juga menggunakan file 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"/>
Untuk melakukan operasi Buat, Baca, Perbarui, dan Hapus (CRUD) menggunakan iBATIS, Anda perlu membuat kelas Objek Java Lama (POJO) yang sesuai dengan tabel. Kelas ini menjelaskan objek yang akan "memodelkan" baris tabel database.
Kelas POJO akan memiliki implementasi untuk semua metode yang diperlukan untuk melakukan operasi yang diinginkan.
Mari kita asumsikan kita memiliki tabel EMPLOYEE berikut di 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)
);
Kelas POJO Karyawan
Kami akan membuat kelas Karyawan di file Employee.java sebagai berikut -
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 */
Anda dapat menentukan metode untuk mengatur setiap bidang dalam tabel. Bab selanjutnya menjelaskan cara mendapatkan nilai setiap bidang.
File Employee.xml
Untuk mendefinisikan pernyataan pemetaan SQL menggunakan iBATIS, kita akan menggunakan tag <insert> dan di dalam definisi tag ini, kita akan mendefinisikan sebuah "id" yang akan digunakan dalam file IbatisInsert.java untuk mengeksekusi query SQL INSERT pada database.
<?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>
Sini parameterClass −dapat mengambil nilai sebagai string, int, float, double , atau objek kelas apa pun berdasarkan kebutuhan. Dalam contoh ini, kita akan mengirimkan objek Employee sebagai parameter saat memanggil metode insert dari kelas SqlMap.
Jika tabel database Anda menggunakan kolom IDENTITAS, AUTO_INCREMENT, atau SERIAL atau Anda telah menentukan SEQUENCE / GENERATOR, Anda bisa menggunakan elemen <selectKey> dalam pernyataan <insert> untuk menggunakan atau mengembalikan nilai yang dihasilkan database.
File IbatisInsert.java
File ini akan memiliki logika level aplikasi untuk memasukkan record ke dalam tabel 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 ");
}
}
Kompilasi dan Jalankan
Berikut adalah langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisInsert.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisInsert untuk menjalankan program.
Anda akan mendapatkan hasil berikut, dan record akan dibuat di tabel EMPLOYEE.
$java IbatisInsert
Going to insert record.....
Record Inserted Successfully
Jika Anda memeriksa tabel EMPLOYEE, itu akan menampilkan hasil berikut -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Kita telah membahas, di bab terakhir, bagaimana melakukan operasi CREATE pada tabel menggunakan iBATIS. Bab ini menjelaskan cara membaca tabel menggunakan iBATIS.
Kami memiliki tabel EMPLOYEE berikut di 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)
);
Tabel ini hanya memiliki satu catatan sebagai berikut -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Kelas POJO Karyawan
Untuk melakukan operasi baca, kami akan memodifikasi kelas Karyawan di Employee.java sebagai berikut -
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 */
File Employee.xml
Untuk mendefinisikan pernyataan pemetaan SQL menggunakan iBATIS, kita akan menambahkan tag <select> pada file Employee.xml dan di dalam definisi tag ini, kita akan mendefinisikan sebuah "id" yang akan digunakan dalam file IbatisRead.java untuk mengeksekusi query SQL SELECT pada database.
<?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>
Di sini kami tidak menggunakan klausa WHERE dengan pernyataan SQL SELECT. Kami akan mendemonstrasikan, di bab berikutnya, bagaimana Anda bisa menggunakan klausa WHERE dengan pernyataan SELECT dan bagaimana Anda bisa meneruskan nilai ke klausa WHERE itu.
Berkas IbatisRead.java
File ini memiliki logika tingkat aplikasi untuk membaca catatan dari tabel Karyawan -
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 ");
}
}
Kompilasi dan Jalankan
Berikut adalah langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisRead.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisRead untuk menjalankan program.
Anda akan mendapatkan hasil berikut, dan record akan dibaca dari tabel EMPLOYEE sebagai berikut -
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
Kita telah membahas, di bab terakhir, bagaimana melakukan operasi READ di atas meja menggunakan iBATIS. Bab ini menjelaskan bagaimana Anda dapat memperbarui record dalam tabel menggunakan iBATIS.
Kami memiliki tabel EMPLOYEE berikut di 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)
);
Tabel ini hanya memiliki satu catatan sebagai berikut -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Kelas POJO Karyawan
Untuk melakukan operasi udpate, Anda perlu mengubah file Employee.java sebagai berikut -
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 */
File Employee.xml
Untuk mendefinisikan pernyataan pemetaan SQL menggunakan iBATIS, kita akan menambahkan tag <update> di Employee.xml dan di dalam definisi tag ini, kita akan mendefinisikan "id" yang akan digunakan dalam file IbatisUpdate.java untuk menjalankan query SQL UPDATE pada database.
<?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>
Berkas IbatisUpdate.java
File ini memiliki logika tingkat aplikasi untuk memperbarui catatan ke dalam tabel Karyawan -
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 ");
}
}
Kompilasi dan Jalankan
Berikut langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisUpdate.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisUpdate untuk menjalankan program.
Anda akan mendapatkan hasil berikut, dan catatan akan diperbarui dalam tabel EMPLOYEE dan kemudian, catatan yang sama akan dibaca dari tabel EMPLOYEE.
Going to update record.....
Record updated Successfully
Going to read records.....
1 Roma Ali 5000
Records Read Successfully
Bab ini menjelaskan cara menghapus record dari tabel menggunakan iBATIS.
Kami memiliki tabel EMPLOYEE berikut di 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)
);
Asumsikan tabel ini memiliki dua catatan sebagai berikut -
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)
Kelas POJO Karyawan
Untuk melakukan operasi delete, Anda tidak perlu mengubah file Employee.java. Mari kita pertahankan seperti di bab sebelumnya.
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 */
File Employee.xml
Untuk mendefinisikan pernyataan pemetaan SQL menggunakan iBATIS, kita akan menambahkan tag <delete> di Employee.xml dan di dalam definisi tag ini, kita akan mendefinisikan "id" yang akan digunakan dalam file IbatisDelete.java untuk mengeksekusi query SQL DELETE pada database.
<?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>
Berkas IbatisDelete.java
File ini memiliki logika tingkat aplikasi untuk menghapus catatan dari tabel Karyawan -
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 ");
}
}
Kompilasi dan Jalankan
Berikut langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisDelete.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisDelete untuk menjalankan program.
Anda akan mendapatkan hasil berikut, dan record dengan ID = 1 akan dihapus dari tabel EMPLOYEE dan record lainnya akan dibaca.
Going to delete record.....
Record deleted Successfully
Going to read records.....
2 Roma Ali 3000
Records Read Successfully
Elemen resultMap adalah elemen paling penting dan kuat dalam iBATIS. Anda dapat mengurangi hingga 90% pengkodean JDBC menggunakan iBATIS ResultMap dan dalam beberapa kasus, ini memungkinkan Anda untuk melakukan hal-hal yang bahkan tidak didukung oleh JDBC.
Desain ResultMaps sedemikian rupa sehingga pernyataan sederhana sama sekali tidak memerlukan pemetaan hasil yang eksplisit, dan pernyataan yang lebih kompleks memerlukan tidak lebih dari yang mutlak diperlukan untuk mendeskripsikan hubungan.
Bab ini memberikan pengenalan sederhana tentang iBATIS ResultMaps.
Kami memiliki tabel EMPLOYEE berikut di 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)
);
Tabel ini memiliki dua catatan sebagai berikut -
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)
Kelas POJO Karyawan
Untuk menggunakan iBATIS ResultMap, Anda tidak perlu mengubah file Employee.java. Mari kita pertahankan seperti di bab sebelumnya.
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 */
File Employee.xml
Di sini kita akan memodifikasi Employee.xml untuk memperkenalkan tag <resultMap> </resultMap>. Tag ini akan memiliki id yang diperlukan untuk menjalankan resultMap ini di atribut resultMap tag <select> kami.
<?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>
Berkas IbatisResultMap.java
File ini memiliki logika tingkat aplikasi untuk membaca catatan dari tabel Karyawan menggunakan ResultMap -
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 ");
}
}
Kompilasi dan Jalankan
Berikut langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisResultMap.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisResultMap untuk menjalankan program.
Anda akan mendapatkan hasil berikut yang merupakan operasi baca pada tabel EMPLOYEE.
Going to read record.....
ID: 1
First Name: Zara
Last Name: Ali
Salary: 5000
Record read Successfully
Anda dapat memanggil prosedur tersimpan menggunakan konfigurasi iBATIS. Pertama-tama, mari kita pahami cara membuat prosedur tersimpan di MySQL.
Kami memiliki tabel EMPLOYEE berikut di 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)
);
Mari kita buat prosedur tersimpan berikut di database MySQL -
DELIMITER $$
DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$ CREATE PROCEDURE `testdb`.`getEmp` (IN empid INT) BEGIN SELECT * FROM EMPLOYEE WHERE ID = empid; END $$
DELIMITER;
Mari kita pertimbangkan tabel EMPLOYEE memiliki dua record sebagai berikut -
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)
Kelas POJO Karyawan
Untuk menggunakan prosedur tersimpan, Anda tidak perlu mengubah file Employee.java. Mari kita pertahankan seperti di bab sebelumnya.
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 */
File Employee.xml
Di sini kita akan memodifikasi Employee.xml untuk memperkenalkan tag <procedure> </procedure> dan <parameterMap> </parameterMap>. Di sini tag <procedure> </procedure> akan memiliki id yang akan kita gunakan dalam aplikasi kita untuk memanggil prosedur yang tersimpan.
<?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>
File IbatisSP.java
File ini memiliki logika tingkat aplikasi untuk membaca nama-nama karyawan dari tabel Karyawan menggunakan ResultMap -
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 ");
}
}
Kompilasi dan Jalankan
Berikut langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisSP.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisSP untuk menjalankan program.
Anda akan mendapatkan hasil sebagai berikut:
Going to read employee name.....
First Name: Zara
Record name Successfully
SQL dinamis adalah fitur iBATIS yang sangat kuat. Terkadang Anda harus mengubah kriteria klausa WHERE berdasarkan status objek parameter Anda. Dalam situasi seperti itu, iBATIS menyediakan satu set tag SQL dinamis yang dapat digunakan dalam pernyataan yang dipetakan untuk meningkatkan kegunaan kembali dan fleksibilitas SQL.
Semua logika dimasukkan ke dalam file .XML menggunakan beberapa tag tambahan. Berikut adalah contoh di mana pernyataan SELECT akan bekerja dalam dua cara -
Jika Anda meneruskan ID, maka itu akan mengembalikan semua catatan yang sesuai dengan ID itu.
Jika tidak, itu akan mengembalikan semua catatan di mana ID karyawan diatur ke 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>
Anda dapat memeriksa kondisi menggunakan tag <isNotEmpty> sebagai berikut. Di sini kondisi hanya akan ditambahkan jika properti yang diteruskan tidak kosong.
..................
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty property="id">
id = #id#
</isNotEmpty>
</dynamic>
</select>
..................
Jika Anda menginginkan kueri tempat kami dapat memilih id dan / atau nama depan Karyawan, pernyataan SELECT Anda adalah sebagai berikut -
..................
<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>
..................
Contoh SQL Dinamis
Contoh berikut menunjukkan bagaimana Anda dapat menulis pernyataan SELECT dengan SQL dinamis. Pertimbangkan, kami memiliki tabel EMPLOYEE berikut di 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)
);
Mari asumsikan tabel ini hanya memiliki satu record sebagai berikut -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Kelas POJO Karyawan
Untuk melakukan operasi baca, mari kita memiliki kelas Karyawan di Employee.java sebagai berikut -
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 */
File Employee.xml
Untuk mendefinisikan pernyataan pemetaan SQL menggunakan iBATIS, kami akan menambahkan tag <select> yang dimodifikasi berikut di Employee.xml dan di dalam definisi tag ini, kami akan menentukan "id" yang akan digunakan di IbatisReadDy.java untuk menjalankan kueri Dynamic SQL SELECT pada database.
<?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>
Pernyataan SELECT di atas akan bekerja dalam dua cara -
Jika Anda meneruskan ID, maka itu mengembalikan catatan yang sesuai dengan ID itu Jika tidak, itu mengembalikan semua catatan.
Berkas IbatisReadDy.java
File ini memiliki logika tingkat aplikasi untuk membaca catatan bersyarat dari tabel Karyawan -
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 ");
}
}
Kompilasi dan Jalankan
Berikut adalah langkah-langkah untuk mengkompilasi dan menjalankan perangkat lunak yang disebutkan di atas. Pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisReadDy.java seperti yang ditunjukkan di atas dan kompilasi.
- Jalankan biner IbatisReadDy untuk menjalankan program.
Anda akan mendapatkan hasil berikut, dan record akan dibaca dari tabel EMPLOYEE.
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
Coba contoh di atas dengan melewatkan nullsebagai smc.queryForList ("Employee.findByID", null) .
Ekspresi iBATIS OGNL
iBATIS menyediakan ekspresi berbasis OGNL yang kuat untuk menghilangkan sebagian besar elemen lainnya.
- jika Pernyataan
- pilih, kapan, sebaliknya Pernyataan
- dimana Pernyataan
- Pernyataan foreach
Pernyataan if
Hal yang paling umum dilakukan dalam SQL dinamis adalah menyertakan bagian klausa where. Misalnya -
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
</select>
Pernyataan ini menyediakan jenis fungsionalitas pencarian teks opsional. Jika Anda tidak memasukkan judul, maka semua Blog aktif akan dikembalikan. Tetapi jika Anda memberikan judul, itu akan mencari judul dengan yang diberikanlike kondisi.
Anda dapat menyertakan beberapa if kondisi sebagai berikut -
<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>
Pilih, kapan, dan sebaliknya Pernyataan
iBATIS menawarkan a chooseelemen yang mirip dengan pernyataan switch Java. Ini membantu memilih hanya satu kasus di antara banyak opsi.
Contoh berikut akan mencari hanya menurut judul jika ada, lalu hanya menurut penulis jika ada. Jika tidak ada yang disediakan, ia hanya mengembalikan blog unggulan -
<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>
Pernyataan dimana
Lihat contoh kami sebelumnya untuk melihat apa yang terjadi jika tidak ada ketentuan yang terpenuhi. Anda akan mendapatkan SQL yang terlihat seperti ini -
SELECT * FROM BLOG
WHERE
Ini akan gagal, tetapi iBATIS memiliki solusi sederhana dengan satu perubahan sederhana, semuanya berfungsi dengan baik -
<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>
Itu whereelemen menyisipkan WHERE hanya ketika tag yang mengandung mengembalikan konten apa pun. Selain itu, jika konten itu dimulai dengan DAN atau ATAU, ia tahu untuk menghapusnya.
Pernyataan foreach
Elemen foreach memungkinkan Anda untuk menentukan koleksi dan mendeklarasikan variabel item dan indeks yang dapat digunakan di dalam tubuh elemen.
Ini juga memungkinkan Anda untuk menentukan string pembuka dan penutup, dan menambahkan pemisah untuk ditempatkan di antara iterasi. Anda bisa membangun fileIN kondisi sebagai berikut -
<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>
Sangat mudah untuk men-debug program Anda saat bekerja dengan iBATIS. iBATIS memiliki dukungan logging bawaan dan bekerja dengan perpustakaan logging berikut dan mencarinya dalam urutan ini.
- Jakarta Commons Logging (JCL).
- Log4J
- JDK logging
Anda dapat menggunakan salah satu pustaka yang tercantum di atas bersama dengan iBATIS.
Debugging dengan Log4J
Dengan asumsi Anda akan menggunakan Log4J untuk logging. Sebelum melanjutkan, Anda perlu memeriksa ulang poin-poin berikut -
- File JAR Log4J (log4j- {version} .jar) harus ada di CLASSPATH.
- Anda memiliki log4j.properties yang tersedia di CLASSPATH.
Berikut ini adalah file log4j.properties. Perhatikan bahwa beberapa baris diberi komentar. Anda dapat menghapus komentar mereka jika Anda membutuhkan informasi debugging tambahan.
# 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
Anda dapat menemukan dokumentasi lengkap untuk Log4J dari situs Apaches - Dokumentasi Log4J .
Contoh Debugging iBATIS
Kelas Java berikut adalah contoh yang sangat sederhana yang menginisialisasi dan kemudian menggunakan perpustakaan logging Log4J untuk aplikasi Java. Kami akan menggunakan file properti yang disebutkan di atas yang terletak di 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 ");
}
}
Kompilasi dan Jalankan
Pertama-tama, pastikan Anda telah mengatur PATH dan CLASSPATH dengan benar sebelum melanjutkan untuk kompilasi dan eksekusi.
- Buat Employee.xml seperti yang ditunjukkan di atas.
- Buat Employee.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat IbatisUpdate.java seperti yang ditunjukkan di atas dan kompilasi.
- Buat log4j.properties seperti yang ditunjukkan di atas.
- Jalankan biner IbatisUpdate untuk menjalankan program.
Anda akan mendapatkan hasil sebagai berikut. Data A akan diperbarui di tabel EMPLOYEE dan nanti, data yang sama akan dibaca dari tabel 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
Metode Debug
Dalam contoh di atas, kami hanya menggunakan info() metode, namun Anda dapat menggunakan salah satu metode berikut sesuai kebutuhan Anda -
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);
Ada perbedaan utama antara iBATIS dan Hibernate. Kedua solusi tersebut bekerja dengan baik, mengingat domain spesifiknya. iBATIS disarankan jika -
- Anda ingin membuat SQL Anda sendiri dan ingin memeliharanya.
- Lingkungan Anda didorong oleh model data relasional.
- Anda harus mengerjakan skema yang ada dan kompleks.
Gunakan Hibernate jika lingkungan didorong oleh model objek dan perlu menghasilkan SQL secara otomatis.
Perbedaan antara iBATIS dan Hibernate
Baik Hibernate dan iBATIS adalah alat Pemetaan Relasional Objek (ORM) sumber terbuka yang tersedia di industri. Penggunaan masing-masing alat ini bergantung pada konteks Anda menggunakannya.
Tabel berikut menyoroti perbedaan antara iBATIS dan Hibernate -
iBATIS | Hibernasi |
---|---|
iBATIS lebih sederhana. Itu datang dalam ukuran paket yang jauh lebih kecil. | Hibernate menghasilkan SQL untuk Anda yang berarti Anda tidak perlu menghabiskan waktu untuk membuat SQL. |
iBATIS fleksibel. Ini menawarkan waktu pengembangan yang lebih cepat. | Hibernasi sangat skalabel. Ini menyediakan cache yang jauh lebih canggih. |
iBATIS menggunakan SQL yang bergantung pada database. | Hibernate menggunakan HQL yang relatif tidak bergantung pada database. Lebih mudah mengubah db dalam mode Hibernasi. |
iBatis memetakan ResultSet dari JDBC API ke POJO Objets Anda, jadi Anda tidak perlu peduli tentang struktur tabel. | Hibernate memetakan objek Java POJO Anda ke tabel Database. |
Sangat mudah untuk menggunakan prosedur tersimpan di iBATIS. | Penggunaan prosedur tersimpan agak sulit dalam Hibernate. |
Baik Hibernate dan iBATIS menerima dukungan yang baik dari framework SPRING, jadi tidak ada masalah untuk memilih salah satunya.
iBATOR adalah generator kode untuk iBATIS. iBATOR melakukan introspeksi terhadap satu atau lebih tabel database dan menghasilkan artefak iBATIS yang dapat digunakan untuk mengakses tabel.
Nanti Anda dapat menulis kode SQL kustom atau prosedur tersimpan untuk memenuhi kebutuhan Anda. iBATOR menghasilkan artefak berikut -
- File XML SqlMap
- Kelas Java untuk mencocokkan kunci utama dan bidang dari tabel
- Kelas DAO yang menggunakan objek di atas (opsional)
iBATOR dapat dijalankan sebagai file JAR mandiri, atau sebagai tugas Ant, atau sebagai plugin Eclipse. Tutorial ini menjelaskan cara paling sederhana untuk menghasilkan file konfigurasi iBATIS dari baris perintah.
Unduh iBATOR
Unduh JAR mandiri jika Anda menggunakan IDE selain Eclipse. JAR mandiri menyertakan tugas Ant untuk menjalankan iBATOR, atau Anda dapat menjalankan iBATOR dari baris perintah kode Java.
Anda dapat mengunduh file zip dari Download iBATOR .
Anda dapat memeriksa dokumentasi online - Dokumentasi iBATOR .
Membuat File Konfigurasi
Untuk menjalankan iBATOR, ikuti langkah-langkah berikut -
Langkah 1
Buat dan isi file konfigurasi ibatorConfig.xml dengan benar. Setidaknya, Anda harus menentukan -
SEBUAH <jdbcConnection> elemen untuk menentukan cara menghubungkan ke database target.
SEBUAH <javaModelGenerator> elemen untuk menentukan paket target dan proyek target untuk objek model Java yang dihasilkan.
SEBUAH <sqlMapGenerator> elemen untuk menentukan paket target dan proyek target untuk file peta SQL yang dihasilkan.
SEBUAH <daoGenerator> elemen untuk menentukan paket target dan proyek target untuk antarmuka dan kelas DAO yang dihasilkan (Anda dapat menghilangkan elemen <daoGenerator> jika Anda tidak ingin membuat DAO).
Setidaknya satu database <table> elemen
NOTE −Lihat halaman Referensi File Konfigurasi XML untuk contoh file konfigurasi iBATOR.
Langkah 2
Simpan file di lokasi yang nyaman, misalnya, di: \ temp \ ibatorConfig.xml.
LANGKAH 3
Sekarang jalankan iBATOR dari baris perintah sebagai berikut -
java -jar abator.jar -configfile \temp\abatorConfig.xml -overwrite
Ini akan memberi tahu iBATOR untuk dijalankan menggunakan file konfigurasi Anda. Ini juga akan memberi tahu iBATOR untuk menimpa file Java yang ada dengan nama yang sama. Jika Anda ingin menyimpan file Java yang ada, hilangkan−overwrite parameter.
Jika ada konflik, iBATOR menyimpan file yang baru dibuat dengan nama unik.
Setelah menjalankan iBATOR, Anda perlu membuat atau memodifikasi file konfigurasi iBATIS standar untuk menggunakan kode yang baru Anda buat. Ini dijelaskan di bagian selanjutnya.
Tugas Setelah Menjalankan iBATOR
Setelah Anda menjalankan iBATOR, Anda perlu membuat atau memodifikasi artefak konfigurasi iBATIS lainnya. Tugas utamanya adalah sebagai berikut -
- Buat atau modifikasi file SqlMapConfig.xml.
- Buat atau modifikasi file dao.xml (hanya jika Anda menggunakan Framework iBATIS DAO).
Setiap tugas dijelaskan secara rinci di bawah -
Memperbarui File SqlMapConfig.xml
iBATIS menggunakan file XML, umumnya bernama SqlMapConfig.xml, untuk menentukan informasi untuk koneksi database, skema manajemen transaksi, dan file XML peta SQL yang digunakan dalam sesi iBATIS.
iBATOR tidak dapat membuat file ini untuk Anda karena tidak tahu apa-apa tentang lingkungan eksekusi Anda. Namun, beberapa item dalam file ini berhubungan langsung dengan item yang dibuat oleh iBATOR.
Kebutuhan khusus iBATOR dalam file konfigurasi adalah sebagai berikut -
- Ruang nama pernyataan harus diaktifkan.
- File XML Peta SQL yang dihasilkan iBATOR harus dicantumkan.
Misalnya, iBATOR telah membuat file XML Peta SQL yang disebut MyTable_SqlMap.xml, dan file tersebut telah ditempatkan dalam paket test.xml proyek Anda. File SqlMapConfig.xml harus memiliki entri ini -
<?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>
Jika ada lebih dari satu file XML Peta SQL (seperti yang cukup umum), maka file tersebut dapat dicantumkan dalam urutan apa pun dengan elemen <sqlMap> yang diulang setelah elemen <transactionManager>.
Memperbarui File dao.xml
Kerangka iBATIS DAO dikonfigurasi oleh file xml yang biasa disebut dao.xml.
Kerangka kerja iBATIS DAO menggunakan file ini untuk mengontrol informasi koneksi database untuk DAO, dan juga untuk membuat daftar kelas implementasi DAO dan antarmuka DAO.
Dalam file ini, Anda harus menentukan jalur ke file SqlMapConfig.xml Anda, dan semua antarmuka DAO yang dihasilkan iBATOR dan kelas implementasi.
Misalnya, iBATOR telah membuat antarmuka DAO yang disebut MyTableDAO dan kelas implementasi yang disebut MyTableDAOImpl, dan bahwa file telah ditempatkan dalam paket test.dao proyek Anda.
File dao.xml harus memiliki entri ini -
<?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>
NOTE − Langkah ini diperlukan hanya jika Anda membuat DAO untuk framework iBATIS DAO.