iBATIS - Hướng dẫn nhanh
iBATIS là một khung công tác bền bỉ tự động hóa ánh xạ giữa cơ sở dữ liệu SQL và các đối tượng trong Java, .NET và Ruby on Rails. Các ánh xạ được tách khỏi logic ứng dụng bằng cách đóng gói các câu lệnh SQL trong các tệp cấu hình XML.
iBATIS là một khung công tác nhẹ và API bền bỉ tốt cho các POJO (Đối tượng Java cũ thuần túy).
iBATIS được biết đến như một trình ánh xạ dữ liệu và đảm nhiệm việc ánh xạ các tham số và kết quả giữa các thuộc tính của lớp và các cột của bảng cơ sở dữ liệu.
Một sự khác biệt đáng kể giữa iBATIS và các khuôn khổ bền bỉ khác như Hibernate là iBATIS nhấn mạnh việc sử dụng SQL, trong khi các khuôn khổ khác thường sử dụng ngôn ngữ truy vấn tùy chỉnh như Ngôn ngữ truy vấn Hibernate (HQL) hoặc Ngôn ngữ truy vấn JavaBeans Doanh nghiệp (EJB QL).
Triết lý thiết kế iBATIS
iBATIS đi kèm với các triết lý thiết kế sau:
Simplicity − iBATIS được nhiều người coi là một trong những khung công tác bền bỉ đơn giản nhất hiện nay.
Fast Development − iBATIS làm tất cả những gì có thể để tạo điều kiện phát triển siêu nhanh.
Portability − iBATIS có thể được triển khai cho hầu hết mọi ngôn ngữ hoặc nền tảng như Java, Ruby và C # cho Microsoft .NET.
Independent Interfaces − iBATIS cung cấp các giao diện và API độc lập với cơ sở dữ liệu giúp phần còn lại của ứng dụng vẫn độc lập với bất kỳ tài nguyên nào liên quan đến tính ổn định.
Open source − iBATIS miễn phí và là một phần mềm mã nguồn mở.
Ưu điểm của iBATIS
iBATIS cung cấp những ưu điểm sau:
Supports stored procedures − iBATIS đóng gói SQL dưới dạng các thủ tục được lưu trữ để logic nghiệp vụ được giữ bên ngoài cơ sở dữ liệu và ứng dụng dễ triển khai và kiểm tra hơn, đồng thời có tính di động cao hơn.
Supports inline SQL − Không cần trình biên dịch trước và bạn có toàn quyền truy cập vào tất cả các tính năng của SQL.
Supports dynamic SQL − iBATIS cung cấp các tính năng để xây dựng động các truy vấn SQL dựa trên các tham số.
Supports O/RM − iBATIS hỗ trợ nhiều tính năng tương tự như công cụ O / RM, chẳng hạn như tải chậm, tìm nạp tham gia, bộ nhớ đệm, tạo mã thời gian chạy và kế thừa
iBATIS sử dụng ngôn ngữ lập trình JAVA trong khi phát triển ứng dụng hướng cơ sở dữ liệu. Trước khi tiếp tục, hãy đảm bảo rằng bạn hiểu những kiến thức cơ bản về lập trình hướng đối tượng và thủ tục - cấu trúc điều khiển, cấu trúc dữ liệu và biến, lớp, đối tượng, v.v.
Để hiểu chi tiết về JAVA, bạn có thể xem qua Hướng dẫn JAVA của chúng tôi .
Bạn sẽ phải thiết lập một môi trường thích hợp cho iBATIS trước khi bắt đầu với công việc phát triển thực tế. Chương này giải thích cách thiết lập môi trường làm việc cho iBATIS.
Cài đặt iBATIS
Thực hiện các bước đơn giản sau để cài đặt iBATIS trên máy Linux của bạn -
Tải xuống phiên bản mới nhất của iBATIS từ Tải xuống iBATIS .
Giải nén tệp đã tải xuống để giải nén tệp .jar từ gói và giữ chúng trong thư mục lib thích hợp.
Đặt các biến PATH và CLASSPATH tại (các) tệp .jar được trích xuất một cách thích hợp.
$ 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
Thiết lập cơ sở dữ liệu
Tạo bảng EMPLOYEE trong bất kỳ cơ sở dữ liệu MySQL nào bằng cú pháp sau:
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)
);
Tạo SqlMapConfig.xml
Hãy xem xét những điều sau -
Chúng tôi sẽ sử dụng JDBC để truy cập cơ sở dữ liệu testdb.
Trình điều khiển JDBC cho MySQL là "com.mysql.jdbc.Driver".
URL kết nối là "jdbc: mysql: // localhost: 3306 / testdb".
Chúng tôi sẽ sử dụng tên người dùng và mật khẩu lần lượt là "root" và "root".
Ánh xạ câu lệnh sql của chúng tôi cho tất cả các hoạt động sẽ được mô tả trong "Employee.xml".
Dựa trên các giả định trên, chúng ta phải tạo một tệp cấu hình XML với tên SqlMapConfig.xmlvới nội dung sau. Đây là nơi bạn cần cung cấp tất cả các cấu hình cần thiết cho iBatis -
Điều quan trọng là cả hai tệp SqlMapConfig.xml và Employee.xml phải có trong đường dẫn lớp. Hiện tại, chúng tôi sẽ giữ cho tệp Employee.xml trống và chúng tôi sẽ trình bày nội dung của nó trong các chương tiếp theo.
<?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>
Bạn cũng có thể đặt các thuộc tính tùy chọn sau bằng cách sử dụng tệp 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"/>
Để thực hiện bất kỳ thao tác Tạo, Đọc, Cập nhật và Xóa (CRUD) nào bằng iBATIS, bạn cần tạo một lớp Đối tượng Java Cũ (POJO) tương ứng với bảng. Lớp này mô tả các đối tượng sẽ "mô hình hóa" các hàng của bảng cơ sở dữ liệu.
Lớp POJO sẽ có triển khai cho tất cả các phương thức cần thiết để thực hiện các hoạt động mong muốn.
Giả sử chúng ta có bảng NHÂN VIÊN sau trong 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)
);
Lớp POJO nhân viên
Chúng tôi sẽ tạo một lớp Employee trong tệp Employee.java như sau:
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 */
Bạn có thể xác định các phương pháp để đặt các trường riêng lẻ trong bảng. Chương tiếp theo giải thích cách lấy giá trị của các trường riêng lẻ.
Tệp Employee.xml
Để xác định câu lệnh ánh xạ SQL bằng iBATIS, chúng tôi sẽ sử dụng thẻ <insert> và bên trong định nghĩa thẻ này, chúng tôi sẽ xác định một "id" sẽ được sử dụng trong tệp IbatisInsert.java để thực hiện truy vấn SQL INSERT trên cơ sở dữ liệu.
<?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>
Đây parameterClass −có thể nhận một giá trị dưới dạng chuỗi, int, float, double hoặc bất kỳ đối tượng lớp nào dựa trên yêu cầu. Trong ví dụ này, chúng ta sẽ truyền đối tượng Employee như một tham số trong khi gọi phương thức insert của lớp SqlMap.
Nếu bảng cơ sở dữ liệu của bạn sử dụng cột IDENTITY, AUTO_INCREMENT hoặc SERIAL hoặc bạn đã xác định SEQUENCE / GENERATOR, bạn có thể sử dụng phần tử <selectKey> trong câu lệnh <insert> để sử dụng hoặc trả về giá trị do cơ sở dữ liệu tạo ra.
Tệp IbatisInsert.java
Tệp này sẽ có logic mức ứng dụng để chèn các bản ghi trong bảng Nhân viên -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisInsert.java như hình trên và biên dịch nó.
- Thực thi IbatisInsert nhị phân để chạy chương trình.
Bạn sẽ nhận được kết quả sau và một bản ghi sẽ được tạo trong bảng NHÂN VIÊN.
$java IbatisInsert
Going to insert record.....
Record Inserted Successfully
Nếu bạn kiểm tra bảng EMPLOYEE, nó sẽ hiển thị kết quả sau:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Trong chương trước, chúng ta đã thảo luận về cách thực hiện thao tác CREATE trên bảng bằng iBATIS. Chương này giải thích cách đọc bảng bằng iBATIS.
Chúng tôi có bảng EMPLOYEE sau trong 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)
);
Bảng này chỉ có một bản ghi như sau:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Lớp POJO nhân viên
Để thực hiện thao tác đọc, chúng tôi sẽ sửa đổi lớp Nhân viên trong Employee.java như sau:
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 */
Tệp Employee.xml
Để xác định câu lệnh ánh xạ SQL bằng iBATIS, chúng tôi sẽ thêm thẻ <select> trong tệp Employee.xml và bên trong định nghĩa thẻ này, chúng tôi sẽ xác định một "id" sẽ được sử dụng trong tệp IbatisRead.java để thực hiện truy vấn SQL SELECT trên cơ sở dữ liệu.
<?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>
Ở đây chúng tôi không sử dụng mệnh đề WHERE với câu lệnh SQL SELECT. Trong chương tiếp theo, chúng tôi sẽ trình bày cách bạn có thể sử dụng mệnh đề WHERE với câu lệnh SELECT và cách bạn có thể chuyển các giá trị cho mệnh đề WHERE đó.
Tệp IbatisRead.java
Tệp này có logic mức ứng dụng để đọc các bản ghi từ bảng Nhân viên -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisRead.java như hình trên và biên dịch nó.
- Thực thi IbatisRead nhị phân để chạy chương trình.
Bạn sẽ nhận được kết quả sau và một bản ghi sẽ được đọc từ bảng EMPLOYEE như sau:
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
Chúng ta đã thảo luận, trong chương trước, cách thực hiện thao tác ĐỌC trên bảng bằng iBATIS. Chương này giải thích cách bạn có thể cập nhật bản ghi trong bảng bằng iBATIS.
Chúng tôi có bảng EMPLOYEE sau trong 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)
);
Bảng này chỉ có một bản ghi như sau:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Lớp POJO nhân viên
Để thực hiện thao tác udpate, bạn cần sửa đổi tệp Employee.java như sau:
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 */
Tệp Employee.xml
Để xác định câu lệnh ánh xạ SQL bằng iBATIS, chúng tôi sẽ thêm thẻ <update> trong Employee.xml và bên trong định nghĩa thẻ này, chúng tôi sẽ xác định một "id" sẽ được sử dụng trong tệp IbatisUpdate.java để thực hiện truy vấn SQL UPDATE trên cơ sở dữ liệu.
<?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>
Tệp IbatisUpdate.java
Tệp này có logic mức ứng dụng để cập nhật bản ghi vào bảng Nhân viên -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisUpdate.java như hình trên và biên dịch nó.
- Thực thi nhị phân IbatisUpdate để chạy chương trình.
Bạn sẽ nhận được kết quả sau và một bản ghi sẽ được cập nhật trong bảng EMPLOYEE và sau đó, bản ghi tương tự sẽ được đọc từ bảng EMPLOYEE.
Going to update record.....
Record updated Successfully
Going to read records.....
1 Roma Ali 5000
Records Read Successfully
Chương này mô tả cách xóa bản ghi khỏi bảng bằng iBATIS.
Chúng tôi có bảng EMPLOYEE sau trong 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)
);
Giả sử bảng này có hai bản ghi như sau:
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)
Lớp POJO nhân viên
Để thực hiện thao tác xóa, bạn không cần phải sửa đổi tệp Employee.java. Hãy để chúng tôi giữ nó như nó đã được trong chương trước.
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 */
Tệp Employee.xml
Để xác định câu lệnh ánh xạ SQL bằng iBATIS, chúng tôi sẽ thêm thẻ <delete> trong Employee.xml và bên trong định nghĩa thẻ này, chúng tôi sẽ xác định một "id" sẽ được sử dụng trong tệp IbatisDelete.java để thực hiện truy vấn SQL DELETE trên cơ sở dữ liệu.
<?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>
Tệp IbatisDelete.java
Tệp này có logic mức ứng dụng để xóa các bản ghi khỏi bảng Nhân viên -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisDelete.java như hình trên và biên dịch nó.
- Thực thi IbatisDelete binary để chạy chương trình.
Bạn sẽ nhận được kết quả sau và một bản ghi có ID = 1 sẽ bị xóa khỏi bảng EMPLOYEE và phần còn lại của các bản ghi sẽ được đọc.
Going to delete record.....
Record deleted Successfully
Going to read records.....
2 Roma Ali 3000
Records Read Successfully
Phần tử resultMap là phần tử quan trọng và mạnh mẽ nhất trong iBATIS. Bạn có thể giảm tới 90% mã hóa JDBC bằng cách sử dụng iBATIS ResultMap và trong một số trường hợp, nó cho phép bạn thực hiện những điều mà JDBC thậm chí không hỗ trợ.
Thiết kế của Bản đồ kết quả sao cho các câu lệnh đơn giản hoàn toàn không yêu cầu ánh xạ kết quả rõ ràng và các câu lệnh phức tạp hơn không yêu cầu nhiều hơn mức cần thiết để mô tả các mối quan hệ.
Chương này chỉ cung cấp một giới thiệu đơn giản về Sơ đồ kết quả iBATIS.
Chúng tôi có bảng EMPLOYEE sau trong 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)
);
Bảng này có hai bản ghi như sau:
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)
Lớp POJO nhân viên
Để sử dụng iBATIS ResultMap, bạn không cần phải sửa đổi tệp Employee.java. Hãy để chúng tôi giữ nó như nó đã được trong chương trước.
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 */
Tệp Employee.xml
Ở đây, chúng tôi sẽ sửa đổi Employee.xml để giới thiệu thẻ <resultMap> </resultMap>. Thẻ này sẽ có một id được yêu cầu để chạy Bản đồ kết quả này trong thuộc tính Bản đồ kết quả của thẻ <select> của chúng tôi.
<?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>
Tệp IbatisResultMap.java
Tệp này có logic mức ứng dụng để đọc bản ghi từ bảng Nhân viên bằng Bản đồ kết quả -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisResultMap.java như hình trên và biên dịch nó.
- Thực thi nhị phân IbatisResultMap để chạy chương trình.
Bạn sẽ nhận được kết quả sau đây là một thao tác đọc trên bảng EMPLOYEE.
Going to read record.....
ID: 1
First Name: Zara
Last Name: Ali
Salary: 5000
Record read Successfully
Bạn có thể gọi một thủ tục được lưu trữ bằng cách sử dụng cấu hình iBATIS. Trước hết, chúng ta hãy hiểu cách tạo một thủ tục được lưu trữ trong MySQL.
Chúng tôi có bảng EMPLOYEE sau trong 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)
);
Hãy để chúng tôi tạo quy trình được lưu trữ sau trong cơ sở dữ liệu MySQL:
DELIMITER $$
DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$ CREATE PROCEDURE `testdb`.`getEmp` (IN empid INT) BEGIN SELECT * FROM EMPLOYEE WHERE ID = empid; END $$
DELIMITER;
Hãy xem bảng EMPLOYEE có hai bản ghi như sau:
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)
Lớp POJO nhân viên
Để sử dụng thủ tục được lưu trữ, bạn không cần phải sửa đổi tệp Employee.java. Hãy để chúng tôi giữ nó như nó đã được trong chương trước.
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 */
Tệp Employee.xml
Ở đây, chúng tôi sẽ sửa đổi Employee.xml để giới thiệu các thẻ <procedure> </procedure> và <parameterMap> </parameterMap>. Ở đây thẻ <procedure> </procedure> sẽ có một id mà chúng tôi sẽ sử dụng trong ứng dụng của mình để gọi thủ tục được lưu trữ.
<?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>
Tệp IbatisSP.java
Tệp này có logic mức ứng dụng để đọc tên của các nhân viên từ bảng Nhân viên bằng cách sử dụng Bản đồ kết quả -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisSP.java như hình trên và biên dịch nó.
- Thực thi nhị phân IbatisSP để chạy chương trình.
Bạn sẽ nhận được kết quả sau:
Going to read employee name.....
First Name: Zara
Record name Successfully
SQL động là một tính năng rất mạnh của iBATIS. Đôi khi bạn phải thay đổi tiêu chí mệnh đề WHERE dựa trên trạng thái của đối tượng tham số của bạn. Trong những tình huống như vậy, iBATIS cung cấp một tập hợp các thẻ SQL động có thể được sử dụng trong các câu lệnh được ánh xạ để nâng cao khả năng tái sử dụng và tính linh hoạt của SQL.
Tất cả logic được đưa vào tệp .XML bằng cách sử dụng một số thẻ bổ sung. Sau đây là một ví dụ trong đó câu lệnh SELECT sẽ hoạt động theo hai cách:
Nếu bạn chuyển một ID, thì nó sẽ trả về tất cả các bản ghi tương ứng với ID đó.
Nếu không, nó sẽ trả về tất cả các bản ghi nơi ID nhân viên được đặt thành 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>
Bạn có thể kiểm tra điều kiện bằng thẻ <isNotEmpty> như sau. Ở đây, một điều kiện sẽ chỉ được thêm vào khi một thuộc tính được truyền không trống.
..................
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty property="id">
id = #id#
</isNotEmpty>
</dynamic>
</select>
..................
Nếu bạn muốn một truy vấn trong đó chúng tôi có thể chọn một id và / hoặc tên của một Nhân viên, câu lệnh SELECT của bạn sẽ như sau:
..................
<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>
..................
Ví dụ về SQL động
Ví dụ sau đây cho thấy cách bạn có thể viết câu lệnh SELECT với SQL động. Hãy xem xét, chúng ta có bảng EMPLOYEE sau trong 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)
);
Giả sử bảng này chỉ có một bản ghi như sau:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
Lớp POJO nhân viên
Để thực hiện thao tác đọc, hãy để chúng ta có một lớp Employee trong Employee.java như sau:
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 */
Tệp Employee.xml
Để xác định câu lệnh ánh xạ SQL bằng iBATIS, chúng tôi sẽ thêm thẻ <select> đã sửa đổi sau đây vào Employee.xml và bên trong định nghĩa thẻ này, chúng tôi sẽ xác định một "id" sẽ được sử dụng trong IbatisReadDy.java để thực hiện truy vấn CHỌN SQL động trên cơ sở dữ liệu.
<?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>
Câu lệnh SELECT ở trên sẽ hoạt động theo hai cách:
Nếu bạn chuyển một ID, thì nó trả về các bản ghi tương ứng với ID đó. Ngược lại, nó trả về tất cả các bản ghi.
Tệp IbatisReadDy.java
Tệp này có logic mức ứng dụng để đọc các bản ghi có điều kiện từ bảng Nhân viên -
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 ");
}
}
Biên dịch và Chạy
Dưới đây là các bước để biên dịch và chạy phần mềm nói trên. Đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisReadDy.java như hình trên và biên dịch nó.
- Thực thi nhị phân IbatisReadDy để chạy chương trình.
Bạn sẽ nhận được kết quả sau và một bản ghi sẽ được đọc từ bảng EMPLOYEE.
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
Hãy thử ví dụ trên bằng cách chuyển nulldưới dạng smc.queryForList ("Employee.findByID", null) .
iBATIS OGNL Biểu thức
iBATIS cung cấp các biểu thức dựa trên OGNL mạnh mẽ để loại bỏ hầu hết các yếu tố khác.
- nếu Tuyên bố
- chọn, khi nào, nếu không thì Tuyên bố
- Tuyên bố ở đâu
- Tuyên bố foreach
Câu lệnh if
Điều phổ biến nhất cần làm trong SQL động là bao gồm có điều kiện một phần của mệnh đề where. Ví dụ -
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
</select>
Câu lệnh này cung cấp một loại chức năng tìm kiếm văn bản tùy chọn. Nếu bạn vượt qua không có tiêu đề, thì tất cả các Blog đang hoạt động sẽ được trả lại. Nhưng nếu bạn vượt qua một tiêu đề, nó sẽ tìm kiếm một tiêu đề vớilike tình trạng.
Bạn có thể bao gồm nhiều if điều kiện như sau -
<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>
Các câu lệnh chọn, khi nào và nếu không
iBATIS cung cấp một choosephần tử tương tự như câu lệnh switch của Java. Nó giúp chỉ chọn một trường hợp trong số nhiều lựa chọn.
Ví dụ sau sẽ chỉ tìm kiếm theo tiêu đề nếu được cung cấp, sau đó chỉ theo tác giả nếu được cung cấp. Nếu cả hai đều không được cung cấp, nó chỉ trả về các blog nổi bật -
<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>
Tuyên bố về nơi
Hãy xem các ví dụ trước của chúng tôi để xem điều gì sẽ xảy ra nếu không có điều kiện nào được đáp ứng. Bạn sẽ kết thúc với một SQL trông như thế này -
SELECT * FROM BLOG
WHERE
Điều này sẽ không thành công, nhưng iBATIS có một giải pháp đơn giản với một thay đổi đơn giản, mọi thứ đều hoạt động tốt -
<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>
Các wherephần tử chỉ chèn WHERE khi các thẻ chứa trả về bất kỳ nội dung nào. Hơn nữa, nếu nội dung đó bắt đầu bằng VÀ hoặc HOẶC, nó sẽ biết loại bỏ nội dung đó.
Tuyên bố foreach
Phần tử foreach cho phép bạn chỉ định một tập hợp và khai báo các biến mục và chỉ mục có thể được sử dụng bên trong phần thân của phần tử.
Nó cũng cho phép bạn chỉ định chuỗi mở và đóng, đồng thời thêm dấu phân tách để đặt giữa các lần lặp. Bạn có thể xây dựng mộtIN điều kiện như sau -
<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>
Dễ dàng gỡ lỗi chương trình của bạn khi làm việc với iBATIS. iBATIS có hỗ trợ ghi nhật ký tích hợp và nó hoạt động với các thư viện ghi nhật ký sau và tìm kiếm chúng theo thứ tự này.
- Jakarta Commons Logging (JCL).
- Log4J
- Ghi nhật ký JDK
Bạn có thể sử dụng bất kỳ thư viện nào được liệt kê ở trên cùng với iBATIS.
Gỡ lỗi bằng Log4J
Giả sử bạn sẽ sử dụng Log4J để ghi nhật ký. Trước khi tiếp tục, bạn cần kiểm tra kỹ các điểm sau:
- Tệp Log4J JAR (log4j- {version} .jar) phải nằm trong CLASSPATH.
- Bạn có log4j.properties có sẵn trong CLASSPATH.
Sau đây là tệp log4j.properties. Lưu ý rằng một số dòng được chú thích. Bạn có thể bỏ ghi chú chúng nếu bạn cần thêm thông tin gỡ lỗi.
# 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
Bạn có thể tìm thấy tài liệu đầy đủ cho Log4J từ trang Apaches - Tài liệu Log4J .
Ví dụ về gỡ lỗi iBATIS
Lớp Java sau đây là một ví dụ rất đơn giản khởi tạo và sau đó sử dụng thư viện ghi nhật ký Log4J cho các ứng dụng Java. Chúng tôi sẽ sử dụng tệp thuộc tính được đề cập ở trên nằm trong 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 ");
}
}
Biên dịch và Chạy
Trước hết, hãy đảm bảo rằng bạn đã đặt PATH và CLASSPATH thích hợp trước khi tiến hành biên dịch và thực thi.
- Tạo Employee.xml như hình trên.
- Tạo Employee.java như hình trên và biên dịch nó.
- Tạo IbatisUpdate.java như hình trên và biên dịch nó.
- Tạo log4j.properties như hình trên.
- Thực thi nhị phân IbatisUpdate để chạy chương trình.
Bạn sẽ nhận được kết quả sau. Bản ghi sẽ được cập nhật trong bảng EMPLOYEE và sau đó, bản ghi tương tự sẽ được đọc từ bảng 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
Phương pháp gỡ lỗi
Trong ví dụ trên, chúng tôi chỉ sử dụng info() , tuy nhiên bạn có thể sử dụng bất kỳ phương pháp nào sau đây theo yêu cầu của bạn -
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);
Có sự khác biệt lớn giữa iBATIS và Hibernate. Cả hai giải pháp đều hoạt động tốt, dựa trên miền cụ thể của chúng. iBATIS được đề xuất trong trường hợp -
- Bạn muốn tạo SQL của riêng mình và bạn sẵn sàng duy trì chúng.
- Môi trường của bạn được điều khiển bởi mô hình dữ liệu quan hệ.
- Bạn phải làm việc trên các lược đồ hiện có và phức tạp.
Sử dụng Hibernate nếu môi trường được điều khiển bởi mô hình đối tượng và cần tạo SQL tự động.
Sự khác biệt giữa iBATIS và Hibernate
Cả Hibernate và iBATIS đều là các công cụ Lập bản đồ Quan hệ Đối tượng (ORM) mã nguồn mở có sẵn trong ngành. Việc sử dụng từng công cụ này tùy thuộc vào ngữ cảnh bạn đang sử dụng chúng.
Bảng sau đây nêu rõ sự khác biệt giữa iBATIS và Hibernate:
iBATIS | Ngủ đông |
---|---|
iBATIS đơn giản hơn. Nó có kích thước gói nhỏ hơn nhiều. | Hibernate tạo SQL cho bạn, nghĩa là bạn không phải mất thời gian tạo SQL. |
iBATIS rất linh hoạt. Nó cung cấp thời gian phát triển nhanh hơn. | Hibernate có khả năng mở rộng cao. Nó cung cấp một bộ nhớ đệm nâng cao hơn nhiều. |
iBATIS sử dụng SQL có thể phụ thuộc vào cơ sở dữ liệu. | Hibernate sử dụng HQL tương đối độc lập với cơ sở dữ liệu. Thay đổi db trong Hibernate sẽ dễ dàng hơn. |
iBatis ánh xạ ResultSet từ API JDBC tới các đối tượng POJO của bạn, vì vậy bạn không cần phải quan tâm đến cấu trúc bảng. | Hibernate ánh xạ các đối tượng Java POJO của bạn vào các bảng Cơ sở dữ liệu. |
Nó khá dễ dàng để sử dụng quy trình được lưu trữ trong iBATIS. | Việc sử dụng các thủ tục được lưu trữ là một chút khó khăn trong Hibernate. |
Cả Hibernate và iBATIS đều nhận được sự hỗ trợ tốt từ khung công tác SPRING, vì vậy sẽ không có vấn đề gì khi chọn một trong số chúng.
iBATOR là trình tạo mã cho iBATIS. iBATOR xem xét bên trong một hoặc nhiều bảng cơ sở dữ liệu và tạo ra các tạo tác iBATIS có thể được sử dụng để truy cập các bảng.
Sau đó, bạn có thể viết mã SQL tùy chỉnh hoặc quy trình được lưu trữ để đáp ứng yêu cầu của bạn. iBATOR tạo ra các tạo tác sau:
- Tệp XML SqlMap
- Các lớp Java để khớp với khóa chính và các trường của (các) bảng
- Các lớp DAO sử dụng các đối tượng trên (tùy chọn)
iBATOR có thể chạy dưới dạng tệp JAR độc lập, hoặc dưới dạng tác vụ Ant hoặc như một plugin Eclipse. Hướng dẫn này mô tả cách đơn giản nhất để tạo tệp cấu hình iBATIS từ dòng lệnh.
Tải xuống iBATOR
Tải xuống JAR độc lập nếu bạn đang sử dụng IDE không phải Eclipse. JAR độc lập bao gồm một nhiệm vụ Ant để chạy iBATOR hoặc bạn có thể chạy iBATOR từ dòng lệnh của mã Java.
Bạn có thể tải xuống tệp zip từ Tải xuống iBATOR .
Bạn có thể kiểm tra tài liệu trực tuyến - Tài liệu iBATOR .
Tạo tệp cấu hình
Để chạy iBATOR, hãy làm theo các bước sau:
Bước 1
Tạo và điền vào tệp cấu hình ibatorConfig.xml một cách thích hợp. Tối thiểu, bạn phải chỉ định -
A <jdbcConnection> phần tử để chỉ định cách kết nối với cơ sở dữ liệu đích.
A <javaModelGenerator> phần tử để chỉ định gói mục tiêu và dự án mục tiêu cho các đối tượng mô hình Java được tạo.
A <sqlMapGenerator> phần tử để chỉ định gói mục tiêu và dự án mục tiêu cho các tệp bản đồ SQL được tạo.
A <daoGenerator> phần tử để chỉ định gói mục tiêu và dự án mục tiêu cho các giao diện và lớp DAO được tạo (bạn có thể bỏ qua phần tử <daoGenerator> nếu bạn không muốn tạo DAO).
Ít nhất một cơ sở dữ liệu <table> thành phần
NOTE −Xem trang Tham chiếu tệp cấu hình XML để biết ví dụ về tệp cấu hình iBATOR.
Bước 2
Lưu tệp ở một vị trí thuận tiện, ví dụ, tại: \ temp \ ibatorConfig.xml.
Bước 3
Bây giờ chạy iBATOR từ dòng lệnh như sau:
java -jar abator.jar -configfile \temp\abatorConfig.xml -overwrite
Nó sẽ yêu cầu iBATOR chạy bằng tệp cấu hình của bạn. Nó cũng sẽ yêu cầu iBATOR ghi đè bất kỳ tệp Java hiện có nào có cùng tên. Nếu bạn muốn lưu bất kỳ tệp Java hiện có nào, hãy bỏ qua−overwrite tham số.
Nếu có xung đột, iBATOR sẽ lưu tệp mới tạo với một tên duy nhất.
Sau khi chạy iBATOR, bạn cần tạo hoặc sửa đổi tệp cấu hình iBATIS tiêu chuẩn để sử dụng mã mới tạo của bạn. Điều này được giải thích trong phần tiếp theo.
Nhiệm vụ sau khi chạy iBATOR
Sau khi chạy iBATOR, bạn cần tạo hoặc sửa đổi các tạo tác cấu hình iBATIS khác. Các nhiệm vụ chính như sau:
- Tạo hoặc sửa đổi tệp SqlMapConfig.xml.
- Tạo hoặc sửa đổi tệp dao.xml (chỉ khi bạn đang sử dụng iBATIS DAO Framework).
Mỗi nhiệm vụ được mô tả chi tiết bên dưới:
Cập nhật Tệp SqlMapConfig.xml
iBATIS sử dụng tệp XML, thường được đặt tên là SqlMapConfig.xml, để chỉ định thông tin cho kết nối cơ sở dữ liệu, sơ đồ quản lý giao dịch và tệp XML ánh xạ SQL được sử dụng trong phiên iBATIS.
iBATOR không thể tạo tệp này cho bạn vì nó không biết gì về môi trường thực thi của bạn. Tuy nhiên, một số mục trong tệp này liên quan trực tiếp đến các mục do iBATOR tạo.
Các nhu cầu cụ thể của iBATOR trong tệp cấu hình như sau:
- Không gian tên báo cáo phải được kích hoạt.
- Các tệp XML Bản đồ SQL do iBATOR tạo phải được liệt kê.
Ví dụ: giả sử iBATOR đã tạo tệp XML Bản đồ SQL có tên MyTable_SqlMap.xml và tệp đó đã được đặt trong gói test.xml của dự án của bạn. Tệp SqlMapConfig.xml phải có các mục sau:
<?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>
Nếu có nhiều hơn một tệp SQL Map XML (như khá phổ biến), thì các tệp có thể được liệt kê theo thứ tự bất kỳ với các phần tử <sqlMap> lặp lại sau phần tử <transactionManager>.
Cập nhật tệp dao.xml
Khung công tác iBATIS DAO được định cấu hình bởi một tệp xml thường được gọi là dao.xml.
Khuôn khổ iBATIS DAO sử dụng tệp này để kiểm soát thông tin kết nối cơ sở dữ liệu cho các DAO và cũng để liệt kê các lớp triển khai DAO và giao diện DAO.
Trong tệp này, bạn nên chỉ định đường dẫn đến tệp SqlMapConfig.xml của mình và tất cả các lớp triển khai và giao diện DAO do iBATOR tạo.
Ví dụ: giả sử iBATOR đã tạo một giao diện DAO được gọi là MyTableDAO và một lớp triển khai có tên MyTableDAOImpl và các tệp đã được đặt trong gói test.dao của dự án của bạn.
Tệp dao.xml phải có các mục sau:
<?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 − Bước này chỉ bắt buộc nếu bạn đã tạo DAO cho khung iBATIS DAO.