iBATIS - คู่มือฉบับย่อ
iBATIS เป็นเฟรมเวิร์กการคงอยู่ซึ่งทำการแมปอัตโนมัติระหว่างฐานข้อมูล SQL และอ็อบเจ็กต์ใน Java, .NET และ Ruby on Rails การแม็พถูกแยกออกจากตรรกะของแอ็พพลิเคชันโดยการบรรจุคำสั่ง SQL ในไฟล์คอนฟิกูเรชัน XML
iBATIS เป็นเฟรมเวิร์กที่มีน้ำหนักเบาและ API การคงอยู่ที่ดีสำหรับ POJO ที่มีอยู่ (Plain Old Java Objects)
iBATIS เป็นสิ่งที่เรียกว่า data mapper และดูแลการแม็ปพารามิเตอร์และผลลัพธ์ระหว่างคุณสมบัติคลาสและคอลัมน์ของตารางฐานข้อมูล
ความแตกต่างที่สำคัญระหว่าง iBATIS และเฟรมเวิร์กการคงอยู่อื่น ๆ เช่น Hibernate คือ iBATIS เน้นการใช้ SQL ในขณะที่เฟรมเวิร์กอื่น ๆ มักใช้ภาษาเคียวรีแบบกำหนดเองเช่น Hibernate Query Language (HQL) หรือ Enterprise JavaBeans Query Language (EJB QL)
ปรัชญาการออกแบบ iBATIS
iBATIS มาพร้อมกับปรัชญาการออกแบบดังต่อไปนี้ -
Simplicity − iBATIS ได้รับการยกย่องอย่างกว้างขวางว่าเป็นหนึ่งในกรอบการคงอยู่ที่ง่ายที่สุดในปัจจุบัน
Fast Development − iBATIS ทำทุกอย่างเพื่ออำนวยความสะดวกในการพัฒนาที่รวดเร็วมาก
Portability − iBATIS สามารถใช้งานได้กับเกือบทุกภาษาหรือแพลตฟอร์มเช่น Java, Ruby และ C # สำหรับ Microsoft .NET
Independent Interfaces − iBATIS มีอินเทอร์เฟซและ API ที่ไม่ขึ้นกับฐานข้อมูลที่ช่วยให้แอปพลิเคชันที่เหลืออยู่เป็นอิสระจากทรัพยากรที่เกี่ยวข้องกับการคงอยู่
Open source − iBATIS ฟรีและเป็นซอฟต์แวร์โอเพ่นซอร์ส
ข้อดีของ iBATIS
iBATIS มีข้อดีดังต่อไปนี้ -
Supports stored procedures − iBATIS ห่อหุ้ม SQL ในรูปแบบของกระบวนงานที่จัดเก็บไว้เพื่อให้ตรรกะทางธุรกิจไม่อยู่ในฐานข้อมูลและแอปพลิเคชันนั้นง่ายต่อการปรับใช้และทดสอบและพกพาได้ง่ายขึ้น
Supports inline SQL − ไม่จำเป็นต้องมีพรีคอมไพเลอร์และคุณสามารถเข้าถึงคุณลักษณะทั้งหมดของ SQL ได้อย่างสมบูรณ์
Supports dynamic SQL − iBATIS มีคุณลักษณะสำหรับการสร้างแบบสอบถาม SQL แบบไดนามิกตามพารามิเตอร์
Supports O/RM − iBATIS รองรับคุณสมบัติหลายอย่างเช่นเดียวกับเครื่องมือ O / RM เช่นการโหลดแบบขี้เกียจการเข้าร่วมการดึงข้อมูลการแคชการสร้างรหัสรันไทม์และการสืบทอด
iBATIS ใช้ภาษาโปรแกรม JAVA ในขณะที่พัฒนาแอปพลิเคชันที่เน้นฐานข้อมูล ก่อนดำเนินการต่อโปรดตรวจสอบให้แน่ใจว่าคุณเข้าใจพื้นฐานของการเขียนโปรแกรมเชิงขั้นตอนและเชิงวัตถุ - โครงสร้างการควบคุมโครงสร้างข้อมูลและตัวแปรคลาสวัตถุ ฯลฯ
เพื่อให้เข้าใจในรายละเอียด JAVA คุณสามารถไปถึงเราสอน JAVA
คุณจะต้องตั้งค่าสภาพแวดล้อมที่เหมาะสมสำหรับ iBATIS ก่อนที่จะเริ่มงานพัฒนาจริง บทนี้อธิบายถึงวิธีการตั้งค่าสภาพแวดล้อมการทำงานสำหรับ iBATIS
การติดตั้ง iBATIS
ทำตามขั้นตอนง่ายๆต่อไปนี้เพื่อติดตั้ง iBATIS บนเครื่อง Linux ของคุณ -
ดาวน์โหลดรุ่นล่าสุดของ iBATIS จากดาวน์โหลด iBATIS
แตกไฟล์ที่ดาวน์โหลดมาเพื่อแตกไฟล์. jar จากบันเดิลและเก็บไว้ในไดเร็กทอรี lib ที่เหมาะสม
ตั้งค่าตัวแปร PATH และ CLASSPATH ที่ไฟล์. jar ที่แยกออกมาอย่างเหมาะสม
$ 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
การตั้งค่าฐานข้อมูล
สร้างตาราง EMPLOYEE ในฐานข้อมูล MySQL โดยใช้ไวยากรณ์ต่อไปนี้ -
mysql> CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
สร้าง SqlMapConfig.xml
พิจารณาสิ่งต่อไปนี้ -
เราจะใช้ JDBC เพื่อเข้าถึงฐานข้อมูล testdb.
ไดรเวอร์ JDBC สำหรับ MySQL คือ "com.mysql.jdbc.Driver"
URL การเชื่อมต่อคือ "jdbc: mysql: // localhost: 3306 / testdb"
เราจะใช้ชื่อผู้ใช้และรหัสผ่านเป็น "root" และ "root" ตามลำดับ
การแมปคำสั่ง sql ของเราสำหรับการดำเนินการทั้งหมดจะอธิบายไว้ใน "Employee.xml"
จากสมมติฐานข้างต้นเราต้องสร้างไฟล์คอนฟิกูเรชัน XML ที่มีชื่อ SqlMapConfig.xmlโดยมีเนื้อหาดังต่อไปนี้ นี่คือที่ที่คุณต้องจัดเตรียมการกำหนดค่าทั้งหมดที่จำเป็นสำหรับ iBatis -
สิ่งสำคัญคือควรมีทั้งไฟล์ SqlMapConfig.xml และ Employee.xml ในพา ธ คลาส สำหรับตอนนี้เราจะทำให้ไฟล์ Employee.xml ว่างเปล่าและเราจะครอบคลุมเนื้อหาในบทต่อ ๆ ไป
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/testdb"/>
<property name="JDBC.Username" value="root"/>
<property name="JDBC.Password" value="root"/>
</dataSource>
</transactionManager>
<sqlMap resource="Employee.xml"/>
</sqlMapConfig>
คุณสามารถตั้งค่าคุณสมบัติทางเลือกต่อไปนี้ได้เช่นกันโดยใช้ไฟล์ SqlMapConfig.xml -
<property name="JDBC.AutoCommit" value="true"/>
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="150000"/>
<property name="Pool.MaximumTimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from Employee"/>
<property name="Pool.PingEnabled" value="false"/>
ในการดำเนินการสร้างอ่านอัปเดตและลบ (CRUD) โดยใช้ iBATIS คุณจะต้องสร้างคลาส Plain Old Java Objects (POJO) ที่สอดคล้องกับตาราง คลาสนี้อธิบายถึงออบเจ็กต์ที่จะ "จำลอง" แถวของตารางฐานข้อมูล
คลาส POJO จะมีการใช้งานสำหรับวิธีการทั้งหมดที่จำเป็นในการดำเนินการที่ต้องการ
สมมติว่าเรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
พนักงาน POJO Class
เราจะสร้างคลาส Employee ในไฟล์ Employee.java ดังนี้ -
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
} /* End of Employee */
คุณสามารถกำหนดวิธีการตั้งค่าแต่ละเขตข้อมูลในตาราง บทถัดไปจะอธิบายวิธีรับค่าของแต่ละฟิลด์
ไฟล์ Employee.xml
ในการกำหนดคำสั่งการแมป SQL โดยใช้ iBATIS เราจะใช้แท็ก <insert> และภายในนิยามแท็กนี้เราจะกำหนด "id" ซึ่งจะใช้ในไฟล์ IbatisInsert.java สำหรับเรียกใช้แบบสอบถาม SQL INSERT บนฐานข้อมูล
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
insert into EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
</sqlMap>
ที่นี่ parameterClass −อาจจะใช้ค่าเป็นสตริง, int ลอยสองครั้งหรือระดับใดวัตถุขึ้นอยู่กับความต้องการ ในตัวอย่างนี้เราจะส่งผ่านอ็อบเจกต์พนักงานเป็นพารามิเตอร์ในขณะที่เรียกเมธอดinsertของคลาส SqlMap
ถ้าตารางฐานข้อมูลของคุณใช้ IDENTITY, AUTO_INCREMENT หรือคอลัมน์ SERIAL หรือคุณได้กำหนด SEQUENCE / GENERATOR คุณสามารถใช้องค์ประกอบ <selectKey> ในคำสั่ง <insert> เพื่อใช้หรือส่งคืนค่าที่ฐานข้อมูลสร้างขึ้น
ไฟล์ IbatisInsert.java
ไฟล์นี้จะมีตรรกะระดับแอปพลิเคชันเพื่อแทรกระเบียนในตารางพนักงาน -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisInsert{
public static void main(String[] args)throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would insert one record in Employee table. */
System.out.println("Going to insert record.....");
Employee em = new Employee("Zara", "Ali", 5000);
smc.insert("Employee.insert", em);
System.out.println("Record Inserted Successfully ");
}
}
รวบรวมและเรียกใช้
นี่คือขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ที่กล่าวถึงข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisInsert.java ตามที่แสดงด้านบนและคอมไพล์
- ดำเนินการ IbatisInsert ไบนารีเพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้และจะมีการสร้างเรกคอร์ดในตารางพนักงาน
$java IbatisInsert
Going to insert record.....
Record Inserted Successfully
หากคุณตรวจสอบตารางพนักงานควรแสดงผลลัพธ์ดังต่อไปนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
เราได้พูดถึงในบทสุดท้ายเกี่ยวกับวิธีดำเนินการ CREATE บนโต๊ะโดยใช้ iBATIS บทนี้จะอธิบายวิธีการอ่านตารางโดยใช้ iBATIS
เรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
ตารางนี้มีเพียงบันทึกเดียวดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
พนักงาน POJO Class
ในการดำเนินการอ่านเราจะแก้ไขคลาสพนักงานใน Employee.java ดังต่อไปนี้ -
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the method definitions */
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ในการกำหนดคำสั่งการแมป SQL โดยใช้ iBATIS เราจะเพิ่มแท็ก <select> ในไฟล์ Employee.xml และภายในคำจำกัดความของแท็กนี้เราจะกำหนด "id" ซึ่งจะใช้ในไฟล์ IbatisRead.java สำหรับดำเนินการสืบค้น SQL SELECT บนฐานข้อมูล
<?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>
ที่นี่เราไม่ได้ใช้คำสั่ง WHERE กับคำสั่ง SQL SELECT เราจะแสดงให้เห็นในบทถัดไปว่าคุณสามารถใช้ WHERE clause กับคำสั่ง SELECT ได้อย่างไรและคุณจะส่งผ่านค่าไปยัง WHERE clause ได้อย่างไร
ไฟล์ IbatisRead.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันเพื่ออ่านบันทึกจากตารางพนักงาน -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisRead{
public static void main(String[] args)throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would read all records from the Employee table. */
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
รวบรวมและเรียกใช้
นี่คือขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ที่กล่าวถึงข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisRead.java ตามที่แสดงด้านบนและคอมไพล์
- รันไบนารี IbatisRead เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้และจะอ่านบันทึกจากตารางพนักงานดังนี้ -
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
เราได้กล่าวถึงในบทสุดท้ายเกี่ยวกับวิธีดำเนินการอ่านบนโต๊ะโดยใช้ iBATIS บทนี้อธิบายถึงวิธีการอัปเดตเรกคอร์ดในตารางโดยใช้ iBATIS
เรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
ตารางนี้มีเพียงบันทึกเดียวดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
พนักงาน POJO Class
ในการดำเนินการ udpate คุณจะต้องแก้ไขไฟล์ Employee.java ดังนี้ -
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the required method definitions */
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ในการกำหนดคำสั่งการแมป SQL โดยใช้ iBATIS เราจะเพิ่มแท็ก <update> ใน Employee.xml และภายในคำจำกัดความของแท็กนี้เราจะกำหนด "id" ซึ่งจะใช้ในไฟล์ IbatisUpdate.java สำหรับดำเนินการสืบค้น SQL UPDATE บนฐานข้อมูล
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
</sqlMap>
ไฟล์ IbatisUpdate.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันเพื่ออัปเดตเรกคอร์ดในตารางพนักงาน -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisUpdate{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would update one record in Employee table. */
System.out.println("Going to update record.....");
Employee rec = new Employee();
rec.setId(1);
rec.setFirstName( "Roma");
smc.update("Employee.update", rec );
System.out.println("Record updated Successfully ");
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
รวบรวมและเรียกใช้
ต่อไปนี้เป็นขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ดังกล่าวข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisUpdate.java ตามที่แสดงด้านบนและคอมไพล์
- เรียกใช้ไบนารี IbatisUpdate เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้และจะมีการอัปเดตบันทึกในตารางพนักงานและในภายหลังระเบียนเดียวกันจะอ่านได้จากตาราง EMPLOYEE
Going to update record.....
Record updated Successfully
Going to read records.....
1 Roma Ali 5000
Records Read Successfully
บทนี้อธิบายถึงวิธีการลบระเบียนจากตารางโดยใช้ iBATIS
เรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
สมมติว่าตารางนี้มีสองระเบียนดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
พนักงาน POJO Class
ในการดำเนินการลบคุณไม่จำเป็นต้องแก้ไขไฟล์ Employee.java ให้เราเก็บไว้เหมือนเดิมในบทสุดท้าย
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the required method definitions */
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ในการกำหนดคำสั่งการแมป SQL โดยใช้ iBATIS เราจะเพิ่มแท็ก <delete> ใน Employee.xml และภายในคำจำกัดความของแท็กนี้เราจะกำหนด "id" ซึ่งจะใช้ในไฟล์ IbatisDelete.java สำหรับดำเนินการสืบค้น SQL DELETE บนฐานข้อมูล
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
</sqlMap>
ไฟล์ IbatisDelete.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันในการลบบันทึกจากตารางพนักงาน -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisDelete{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would delete one record in Employee table. */
System.out.println("Going to delete record.....");
int id = 1;
smc.delete("Employee.delete", id );
System.out.println("Record deleted Successfully ");
System.out.println("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
รวบรวมและเรียกใช้
ต่อไปนี้เป็นขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ดังกล่าวข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisDelete.java ตามที่แสดงด้านบนและคอมไพล์
- เรียกใช้ไบนารี IbatisDelete เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ต่อไปนี้และบันทึกที่มี ID = 1 จะถูกลบออกจากตารางพนักงานและส่วนที่เหลือของระเบียนจะถูกอ่าน
Going to delete record.....
Record deleted Successfully
Going to read records.....
2 Roma Ali 3000
Records Read Successfully
องค์ประกอบ resultMap เป็นองค์ประกอบที่สำคัญและทรงพลังที่สุดใน iBATIS คุณสามารถลดการเข้ารหัส JDBC ได้ถึง 90% โดยใช้ iBATIS ResultMap และในบางกรณีจะช่วยให้คุณสามารถทำสิ่งที่ JDBC ไม่รองรับได้
การออกแบบ ResultMaps เป็นเช่นนั้นข้อความง่ายๆไม่จำเป็นต้องมีการแมปผลลัพธ์ที่ชัดเจนเลยและคำสั่งที่ซับซ้อนกว่านั้นไม่จำเป็นต้องใช้เกินความจำเป็นในการอธิบายความสัมพันธ์
บทนี้ให้คำแนะนำง่ายๆของ iBATIS ResultMaps
เรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
ตารางนี้มีสองระเบียนดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
พนักงาน POJO Class
ในการใช้ iBATIS ResultMap คุณไม่จำเป็นต้องแก้ไขไฟล์ Employee.java ให้เราเก็บไว้เหมือนเดิมในบทสุดท้าย
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the required method definitions */
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ที่นี่เราจะแก้ไข Employee.xml เพื่อแนะนำแท็ก <resultMap> </resultMap> แท็กนี้จะมีรหัสที่จำเป็นในการเรียกใช้ resultMap นี้ในแอตทริบิวต์ resultMap ของแท็ก <select> ของเรา
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<!-- Perform Insert Operation -->
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<!-- Perform Read Operation -->
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<!-- Perform Update Operation -->
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<!-- Perform Delete Operation -->
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
<!-- Using ResultMap -->
<resultMap id="result" class="Employee">
<result property="id" column="id"/>
<result property="first_name" column="first_name"/>
<result property="last_name" column="last_name"/>
<result property="salary" column="salary"/>
</resultMap>
<select id="useResultMap" resultMap="result">
SELECT * FROM EMPLOYEE
WHERE id=#id#
</select>
</sqlMap>
ไฟล์ IbatisResultMap.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันเพื่ออ่านบันทึกจากตารางพนักงานโดยใช้ ResultMap -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisResultMap{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
int id = 1;
System.out.println("Going to read record.....");
Employee e = (Employee)smc.queryForObject ("Employee.useResultMap", id);
System.out.println("ID: " + e.getId());
System.out.println("First Name: " + e.getFirstName());
System.out.println("Last Name: " + e.getLastName());
System.out.println("Salary: " + e.getSalary());
System.out.println("Record read Successfully ");
}
}
รวบรวมและเรียกใช้
ต่อไปนี้เป็นขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ดังกล่าวข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisResultMap.java ตามที่แสดงด้านบนและรวบรวม
- เรียกใช้ไบนารี IbatisResultMap เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ต่อไปนี้ซึ่งเป็นการดำเนินการอ่านบนตารางพนักงาน
Going to read record.....
ID: 1
First Name: Zara
Last Name: Ali
Salary: 5000
Record read Successfully
คุณสามารถเรียกใช้กระบวนงานที่จัดเก็บโดยใช้การกำหนดค่า iBATIS ก่อนอื่นให้เราเข้าใจวิธีสร้างขั้นตอนการจัดเก็บใน MySQL
เรามีตาราง EMPLOYEE ต่อไปนี้ใน MySQL -
CREATE TABLE EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
ให้เราสร้างขั้นตอนการจัดเก็บต่อไปนี้ในฐานข้อมูล MySQL -
DELIMITER $$
DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$ CREATE PROCEDURE `testdb`.`getEmp` (IN empid INT) BEGIN SELECT * FROM EMPLOYEE WHERE ID = empid; END $$
DELIMITER;
ลองพิจารณาตารางพนักงานมีสองระเบียนดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
| 2 | Roma | Ali | 3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)
พนักงาน POJO Class
ในการใช้กระบวนงานที่เก็บไว้คุณไม่จำเป็นต้องแก้ไขไฟล์ Employee.java ให้เราเก็บไว้เหมือนเดิมในบทสุดท้าย
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the required method definitions */
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return first_name;
}
public void setFirstName(String fname) {
this.first_name = fname;
}
public String getLastName() {
return last_name;
}
public void setlastName(String lname) {
this.last_name = lname;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ที่นี่เราจะแก้ไข Employee.xml เพื่อแนะนำแท็ก <procedure> </procedure> และ <parameterMap> </parameterMap> ที่นี่แท็ก <procedure> </procedure> จะมีรหัสที่เราจะใช้ในแอปพลิเคชันของเราเพื่อเรียกกระบวนงานที่เก็บไว้
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<!-- Perform Insert Operation -->
<insert id="insert" parameterClass="Employee">
INSERT INTO EMPLOYEE(first_name, last_name, salary)
values (#first_name#, #last_name#, #salary#)
<selectKey resultClass="int" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
<!-- Perform Read Operation -->
<select id="getAll" resultClass="Employee">
SELECT * FROM EMPLOYEE
</select>
<!-- Perform Update Operation -->
<update id="update" parameterClass="Employee">
UPDATE EMPLOYEE
SET first_name = #first_name#
WHERE id = #id#
</update>
<!-- Perform Delete Operation -->
<delete id="delete" parameterClass="int">
DELETE FROM EMPLOYEE
WHERE id = #id#
</delete>
<!-- To call stored procedure. -->
<procedure id="getEmpInfo" resultClass="Employee" parameterMap="getEmpInfoCall">
{ call getEmp( #acctID# ) }
</procedure>
<parameterMap id="getEmpInfoCall" class="map">
<parameter property="acctID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
</parameterMap>
</sqlMap>
ไฟล์ IbatisSP.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันเพื่ออ่านชื่อของพนักงานจากตารางพนักงานโดยใช้ ResultMap -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisSP{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
int id = 1;
System.out.println("Going to read employee name.....");
Employee e = (Employee) smc.queryForObject ("Employee.getEmpInfo", id);
System.out.println("First Name: " + e.getFirstName());
System.out.println("Record name Successfully ");
}
}
รวบรวมและเรียกใช้
ต่อไปนี้เป็นขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ดังกล่าวข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisSP.java ตามที่แสดงด้านบนและรวบรวม
- เรียกใช้ไบนารี IbatisSP เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้:
Going to read employee name.....
First Name: Zara
Record name Successfully
Dynamic SQL เป็นคุณสมบัติที่มีประสิทธิภาพมากของ iBATIS บางครั้งคุณต้องเปลี่ยนเกณฑ์ WHERE clause ตามสถานะของออบเจ็กต์พารามิเตอร์ของคุณ ในสถานการณ์เช่นนี้ iBATIS มีชุดของแท็ก SQL แบบไดนามิกที่สามารถใช้ภายในคำสั่งที่แมปเพื่อเพิ่มความสามารถในการนำกลับมาใช้ใหม่และความยืดหยุ่นของ SQL
ตรรกะทั้งหมดใส่ไว้ในไฟล์. XML โดยใช้แท็กเพิ่มเติม ต่อไปนี้เป็นตัวอย่างที่คำสั่ง SELECT ทำงานได้สองวิธี -
หากคุณผ่าน ID ระบบจะส่งคืนระเบียนทั้งหมดที่เกี่ยวข้องกับ ID นั้น
มิฉะนั้นจะส่งคืนระเบียนทั้งหมดที่ ID พนักงานถูกตั้งค่าเป็น NULL
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNull property="id">
id IS NULL
</isNull>
<isNotNull property="id">
id = #id#
</isNotNull>
</dynamic>
</select>
</sqlMap>
คุณสามารถตรวจสอบเงื่อนไขโดยใช้แท็ก <isNotEmpty> ดังต่อไปนี้ เงื่อนไขนี้จะถูกเพิ่มก็ต่อเมื่อคุณสมบัติที่ผ่านไม่ว่างเปล่า
..................
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty property="id">
id = #id#
</isNotEmpty>
</dynamic>
</select>
..................
หากคุณต้องการแบบสอบถามที่เราสามารถเลือก id และ / หรือชื่อของพนักงานคำสั่ง SELECT ของคุณจะเป็นดังนี้ -
..................
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotEmpty prepend="AND" property="id">
id = #id#
</isNotEmpty>
<isNotEmpty prepend="OR" property="first_name">
first_name = #first_name#
</isNotEmpty>
</dynamic>
</select>
..................
ตัวอย่าง Dynamic SQL
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าคุณสามารถเขียนคำสั่ง SELECT ด้วยไดนามิก SQL ได้อย่างไร พิจารณาเรามีตารางพนักงานต่อไปนี้ใน 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)
);
สมมติว่าตารางนี้มีเพียงระเบียนเดียวดังนี้ -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Zara | Ali | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
พนักงาน POJO Class
ในการดำเนินการอ่านให้เรามีคลาส Employee ใน Employee.java ดังนี้ -
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
/* Define constructors for the Employee class. */
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
/* Here are the method definitions */
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
} /* End of Employee */
ไฟล์ Employee.xml
ในการกำหนดคำสั่งการแมป SQL โดยใช้ iBATIS เราจะเพิ่มแท็ก <select> ที่แก้ไขต่อไปนี้ใน Employee.xml และภายในนิยามแท็กนี้เราจะกำหนด "id" ซึ่งจะใช้ใน IbatisReadDy.java สำหรับการเรียกใช้แบบสอบถาม Dynamic SQL SELECT ฐานข้อมูล.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employee">
<select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE ">
<isNotNull property="id">
id = #id#
</isNotNull>
</dynamic>
</select>
</sqlMap>
คำสั่ง SELECT ข้างต้นจะทำงานได้สองวิธี -
หากคุณส่งผ่าน ID ระบบจะส่งคืนระเบียนที่ตรงกับ ID นั้นมิฉะนั้นจะส่งคืนระเบียนทั้งหมด
ไฟล์ IbatisReadDy.java
ไฟล์นี้มีตรรกะระดับแอปพลิเคชันเพื่ออ่านเรกคอร์ดแบบมีเงื่อนไขจากตารางพนักงาน -
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisReadDy{
public static void main(String[] args)
throws IOException,SQLException{
Reader rd=Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc=SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would read all records from the Employee table.*/
System.out.println("Going to read records.....");
Employee rec = new Employee();
rec.setId(1);
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.findByID", rec);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
System.out.println("Records Read Successfully ");
}
}
รวบรวมและเรียกใช้
นี่คือขั้นตอนในการคอมไพล์และรันซอฟต์แวร์ที่กล่าวถึงข้างต้น ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisReadDy.java ตามที่แสดงด้านบนและคอมไพล์
- เรียกใช้ไบนารี IbatisReadDy เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้และจะอ่านบันทึกจากตาราง EMPLOYEE
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
ลองใช้ตัวอย่างข้างต้นโดยผ่าน nullเป็นsmc.queryForList ( "Employee.findByID" null)
นิพจน์ iBATIS OGNL
iBATIS มีนิพจน์ที่ใช้ OGNL ที่มีประสิทธิภาพเพื่อกำจัดองค์ประกอบอื่น ๆ ส่วนใหญ่
- ถ้าคำชี้แจง
- เลือกเมื่อเป็นอย่างอื่นคำชี้แจง
- โดยที่คำชี้แจง
- คำชี้แจง foreach
คำสั่ง if
สิ่งที่ต้องทำบ่อยที่สุดในไดนามิก SQL คือการรวมส่วนคำสั่ง where อย่างมีเงื่อนไข ตัวอย่างเช่น -
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
</select>
คำสั่งนี้มีฟังก์ชันการทำงานประเภทการค้นหาข้อความที่เป็นทางเลือก หากคุณไม่ผ่านหัวข้อใดบล็อกที่ใช้งานอยู่ทั้งหมดจะถูกส่งกลับ แต่ถ้าคุณส่งผ่านชื่อก็จะมองหาชื่อที่ระบุlike เงื่อนไข.
คุณสามารถรวมหลาย ๆ if เงื่อนไขดังนี้ -
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null">
AND author like #{author}
</if>
</select>
คำสั่งเลือกเวลาและอื่น ๆ
iBATIS เสนอไฟล์ chooseองค์ประกอบที่คล้ายกับคำสั่งสวิตช์ของ Java ช่วยเลือกเพียงกรณีเดียวจากหลายตัวเลือก
ตัวอย่างต่อไปนี้จะค้นหาตามชื่อเรื่องเท่านั้นหากมีให้จากนั้นผู้แต่งก็ต่อเมื่อมีให้ หากไม่ได้ระบุไว้จะส่งคืนเฉพาะบล็อกที่แนะนำ -
<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>
คำชี้แจงที่
ลองดูตัวอย่างก่อนหน้านี้เพื่อดูว่าจะเกิดอะไรขึ้นหากไม่ตรงตามเงื่อนไข คุณจะได้รับ SQL ที่มีลักษณะเช่นนี้ -
SELECT * FROM BLOG
WHERE
สิ่งนี้จะล้มเหลว แต่ iBATIS มีวิธีแก้ปัญหาง่ายๆด้วยการเปลี่ยนแปลงง่ายๆเพียงครั้งเดียวทุกอย่างทำงานได้ดี -
<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null>
AND author like #{author}
</if>
</where>
</select>
whereองค์ประกอบแทรกWHEREเฉพาะเมื่อแท็กที่มีส่งคืนเนื้อหาใด ๆ นอกจากนี้หากเนื้อหานั้นขึ้นต้นด้วยANDหรือORก็ควรถอดเนื้อหานั้นออก
คำชี้แจง foreach
องค์ประกอบ foreach ช่วยให้คุณระบุคอลเล็กชันและประกาศตัวแปรรายการและดัชนีที่สามารถใช้ภายในเนื้อหาขององค์ประกอบได้
นอกจากนี้ยังช่วยให้คุณระบุสตริงการเปิดและปิดและเพิ่มตัวคั่นเพื่อวางระหว่างการวนซ้ำ คุณสามารถสร้างไฟล์IN เงื่อนไขดังนี้ -
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
ง่ายต่อการดีบักโปรแกรมของคุณในขณะที่ทำงานกับ iBATIS iBATIS มีการรองรับการบันทึกในตัวและทำงานร่วมกับไลบรารีการบันทึกต่อไปนี้และค้นหาตามลำดับนี้
- Jakarta Commons Logging (JCL)
- Log4J
- การบันทึก JDK
คุณสามารถใช้ไลบรารีที่ระบุไว้ข้างต้นร่วมกับ iBATIS
การดีบักด้วย Log4J
สมมติว่าคุณกำลังจะใช้ Log4J สำหรับการบันทึก ก่อนดำเนินการต่อคุณต้องตรวจสอบประเด็นต่อไปนี้ -
- ไฟล์ Log4J JAR (log4j- {version} .jar) ควรอยู่ใน CLASSPATH
- คุณมี log4j.properties พร้อมใช้งานใน CLASSPATH
ต่อไปนี้คือไฟล์ log4j.properties โปรดทราบว่ามีการแสดงความคิดเห็นบางบรรทัด คุณสามารถยกเลิกการแสดงความคิดเห็นได้หากต้องการข้อมูลการแก้ไขข้อบกพร่องเพิ่มเติม
# Global logging configuration
log4j.rootLogger = ERROR, stdout
log4j.logger.com.ibatis = DEBUG
# shows SQL of prepared statements
#log4j.logger.java.sql.Connection = DEBUG
# shows parameters inserted into prepared statements
#log4j.logger.java.sql.PreparedStatement = DEBUG
# shows query results
#log4j.logger.java.sql.ResultSet = DEBUG
#log4j.logger.java.sql.Statement = DEBUG
# Console output
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] − %m%n
คุณสามารถค้นหาเอกสารที่สมบูรณ์สำหรับ Log4J จากเว็บไซต์ของอาปาเช่ - เอกสาร Log4J
iBATIS ตัวอย่างการดีบัก
คลาส Java ต่อไปนี้เป็นตัวอย่างง่ายๆที่เริ่มต้นแล้วใช้ไลบรารีการบันทึก Log4J สำหรับแอ็พพลิเคชัน Java เราจะใช้ไฟล์คุณสมบัติดังกล่าวข้างต้นซึ่งอยู่ใน CLASSPATH
import org.apache.log4j.Logger;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisUpdate{
static Logger log = Logger.getLogger(IbatisUpdate.class.getName());
public static void main(String[] args)
throws IOException,SQLException{
Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
/* This would insert one record in Employee table. */
log.info("Going to update record.....");
Employee rec = new Employee();
rec.setId(1);
rec.setFirstName( "Roma");
smc.update("Employee.update", rec );
log.info("Record updated Successfully ");
log.debug("Going to read records.....");
List <Employee> ems = (List<Employee>)
smc.queryForList("Employee.getAll", null);
Employee em = null;
for (Employee e : ems) {
System.out.print(" " + e.getId());
System.out.print(" " + e.getFirstName());
System.out.print(" " + e.getLastName());
System.out.print(" " + e.getSalary());
em = e;
System.out.println("");
}
log.debug("Records Read Successfully ");
}
}
รวบรวมและเรียกใช้
ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ CLASSPATH อย่างเหมาะสมก่อนดำเนินการรวบรวมและดำเนินการ
- สร้าง Employee.xml ตามที่แสดงด้านบน
- สร้าง Employee.java ตามที่แสดงด้านบนและรวบรวม
- สร้าง IbatisUpdate.java ตามที่แสดงด้านบนและคอมไพล์
- สร้าง log4j.properties ดังที่แสดงด้านบน
- เรียกใช้ไบนารี IbatisUpdate เพื่อรันโปรแกรม
คุณจะได้รับผลลัพธ์ดังต่อไปนี้ บันทึกจะได้รับการอัปเดตในตารางพนักงานและในภายหลังบันทึกเดียวกันจะถูกอ่านจากตาราง EMPLOYEE
DEBUG [main] - Created connection 28405330.
DEBUG [main] - Returned connection 28405330 to pool.
DEBUG [main] - Checked out connection 28405330 from pool.
DEBUG [main] - Returned connection 28405330 to pool.
1 Roma Ali 5000
2 Zara Ali 5000
3 Zara Ali 5000
วิธีการดีบัก
ในตัวอย่างข้างต้นเราใช้เฉพาะ info() วิธีการอย่างไรก็ตามคุณสามารถใช้วิธีการใด ๆ ต่อไปนี้ตามความต้องการของคุณ -
public void trace(Object message);
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
มีความแตกต่างที่สำคัญระหว่าง iBATIS และ Hibernate โซลูชันทั้งสองทำงานได้ดีโดยมีโดเมนเฉพาะ แนะนำให้ใช้ iBATIS ในกรณี -
- คุณต้องการสร้าง SQL ของคุณเองและคุณยินดีที่จะรักษาไว้
- สภาพแวดล้อมของคุณขับเคลื่อนด้วยโมเดลข้อมูลเชิงสัมพันธ์
- คุณต้องทำงานกับสคีมาที่มีอยู่และซับซ้อน
ใช้ไฮเบอร์เนตหากสภาพแวดล้อมขับเคลื่อนด้วยโมเดลอ็อบเจ็กต์และจำเป็นต้องสร้าง SQL โดยอัตโนมัติ
ความแตกต่างระหว่าง iBATIS และ Hibernate
ทั้ง Hibernate และ iBATIS เป็นเครื่องมือโอเพ่นซอร์ส Object Relational Mapping (ORM) ที่มีอยู่ในอุตสาหกรรม การใช้เครื่องมือเหล่านี้ขึ้นอยู่กับบริบทที่คุณใช้
ตารางต่อไปนี้เน้นความแตกต่างระหว่าง iBATIS และ Hibernate -
iBATIS | ไฮเบอร์เนต |
---|---|
iBATIS นั้นง่ายกว่า มีขนาดบรรจุภัณฑ์ที่เล็กกว่ามาก | Hibernate สร้าง SQL ให้คุณซึ่งหมายความว่าคุณไม่ต้องเสียเวลาในการสร้าง SQL |
iBATIS มีความยืดหยุ่น มีเวลาในการพัฒนาที่เร็วขึ้น | ไฮเบอร์เนตสามารถปรับขนาดได้สูง มันมีแคชขั้นสูงกว่ามาก |
iBATIS ใช้ SQL ซึ่งอาจขึ้นอยู่กับฐานข้อมูล | Hibernate ใช้ HQL ซึ่งค่อนข้างไม่ขึ้นกับฐานข้อมูล การเปลี่ยน db ใน Hibernate ทำได้ง่ายกว่า |
iBatis แมป ResultSet จาก JDBC API กับ POJO Objets ของคุณดังนั้นคุณไม่ต้องสนใจโครงสร้างตาราง | ไฮเบอร์เนตแมปวัตถุ Java POJO ของคุณกับตารางฐานข้อมูล |
มันค่อนข้างง่ายที่จะใช้ขั้นตอนการจัดเก็บใน iBATIS | การใช้โพรซีเดอร์ที่เก็บไว้นั้นค่อนข้างยากในโหมดไฮเบอร์เนต |
ทั้ง Hibernate และ iBATIS ได้รับการสนับสนุนที่ดีจากกรอบงาน SPRING ดังนั้นจึงไม่ควรเป็นปัญหาในการเลือกหนึ่งในนั้น
iBATOR เป็นตัวสร้างรหัสสำหรับ iBATIS iBATOR วิเคราะห์ตารางฐานข้อมูลอย่างน้อยหนึ่งตารางและสร้างสิ่งประดิษฐ์ iBATIS ที่สามารถใช้เพื่อเข้าถึงตาราง
ในภายหลังคุณสามารถเขียนโค้ด SQL แบบกำหนดเองหรือขั้นตอนการจัดเก็บเพื่อให้ตรงตามความต้องการของคุณ iBATOR สร้างสิ่งประดิษฐ์ต่อไปนี้ -
- SqlMap ไฟล์ XML
- Java Classes เพื่อให้ตรงกับคีย์หลักและฟิลด์ของตาราง
- DAO Classes ที่ใช้วัตถุข้างต้น (ทางเลือก)
iBATOR สามารถรันเป็นไฟล์ JAR แบบสแตนด์อโลนหรือเป็นงาน Ant หรือเป็นปลั๊กอิน Eclipse บทช่วยสอนนี้อธิบายถึงวิธีที่ง่ายที่สุดในการสร้างไฟล์คอนฟิกูเรชัน iBATIS จากบรรทัดคำสั่ง
ดาวน์โหลด iBATOR
ดาวน์โหลด JAR แบบสแตนด์อโลนหากคุณใช้ IDE อื่นที่ไม่ใช่ Eclipse JAR แบบสแตนด์อโลนมีภารกิจ Ant เพื่อรัน iBATOR หรือคุณสามารถรัน iBATOR จากบรรทัดคำสั่งของโค้ด Java
คุณสามารถดาวน์โหลดไฟล์ซิปจากดาวน์โหลด iBATOR
คุณสามารถตรวจสอบเอกสารออนไลน์ - เอกสาร iBATOR
การสร้างไฟล์คอนฟิกูเรชัน
ในการเรียกใช้ iBATOR ให้ทำตามขั้นตอนเหล่านี้ -
ขั้นตอนที่ 1
สร้างและเติมไฟล์คอนฟิกูเรชัน ibatorConfig.xml อย่างเหมาะสม อย่างน้อยคุณต้องระบุ -
ก <jdbcConnection> องค์ประกอบเพื่อระบุวิธีการเชื่อมต่อกับฐานข้อมูลเป้าหมาย
ก <javaModelGenerator> องค์ประกอบเพื่อระบุแพ็กเกจเป้าหมายและโปรเจ็กต์เป้าหมายสำหรับอ็อบเจ็กต์โมเดล Java ที่สร้างขึ้น
ก <sqlMapGenerator> องค์ประกอบเพื่อระบุแพ็กเกจเป้าหมายและโปรเจ็กต์เป้าหมายสำหรับไฟล์แม็พ SQL ที่สร้างขึ้น
ก <daoGenerator> องค์ประกอบเพื่อระบุแพ็กเกจเป้าหมายและโปรเจ็กต์เป้าหมายสำหรับอินเทอร์เฟซและคลาส DAO ที่สร้างขึ้น (คุณอาจละเว้นองค์ประกอบ <daoGenerator> หากคุณไม่ต้องการสร้าง DAO)
อย่างน้อยหนึ่งฐานข้อมูล <table> ธาตุ
NOTE −ดูหน้าการอ้างอิงไฟล์คอนฟิกูเรชัน XMLสำหรับตัวอย่างของไฟล์คอนฟิกูเรชัน iBATOR
ขั้นตอนที่ 2
บันทึกไฟล์ในตำแหน่งที่สะดวกตัวอย่างเช่นที่: \ temp \ ibatorConfig.xml
ขั้นตอนที่ 3
ตอนนี้เรียกใช้ iBATOR จากบรรทัดคำสั่งดังนี้ -
java -jar abator.jar -configfile \temp\abatorConfig.xml -overwrite
มันจะบอกให้ iBATOR ทำงานโดยใช้ไฟล์กำหนดค่าของคุณ นอกจากนี้ยังบอกให้ iBATOR เขียนทับไฟล์ Java ที่มีอยู่ด้วยชื่อเดียวกัน หากคุณต้องการบันทึกไฟล์ Java ที่มีอยู่ให้ละเว้นไฟล์−overwrite พารามิเตอร์.
หากมีข้อขัดแย้ง iBATOR จะบันทึกไฟล์ที่สร้างขึ้นใหม่ด้วยชื่อเฉพาะ
หลังจากเรียกใช้ iBATOR คุณต้องสร้างหรือแก้ไขไฟล์คอนฟิกูเรชัน iBATIS มาตรฐานเพื่อใช้งานโค้ดที่สร้างขึ้นใหม่ของคุณ นี่คือคำอธิบายในหัวข้อถัดไป
งานหลังจากเรียกใช้ iBATOR
หลังจากที่คุณเรียกใช้ iBATOR คุณต้องสร้างหรือแก้ไขสิ่งประดิษฐ์การกำหนดค่า iBATIS อื่น ๆ งานหลักมีดังนี้ -
- สร้างหรือแก้ไขไฟล์ SqlMapConfig.xml
- สร้างหรือแก้ไขไฟล์ dao.xml (เฉพาะในกรณีที่คุณใช้ iBATIS DAO Framework)
แต่ละงานมีรายละเอียดอธิบายไว้ด้านล่าง -
การอัพเดตไฟล์ SqlMapConfig.xml
iBATIS ใช้ไฟล์ XML ชื่อทั่วไป SqlMapConfig.xml เพื่อระบุข้อมูลสำหรับการเชื่อมต่อฐานข้อมูลโครงร่างการจัดการธุรกรรมและไฟล์ XML การแมป SQL ที่ใช้ในเซสชัน iBATIS
iBATOR ไม่สามารถสร้างไฟล์นี้ให้คุณได้เนื่องจากไม่รู้อะไรเกี่ยวกับสภาพแวดล้อมการดำเนินการของคุณ อย่างไรก็ตามบางรายการในไฟล์นี้เกี่ยวข้องโดยตรงกับรายการที่สร้างโดย iBATOR
ความต้องการเฉพาะของ iBATOR ในไฟล์คอนฟิกูเรชันมีดังนี้ -
- ต้องเปิดใช้งานเนมสเปซคำสั่ง
- iBATOR สร้างไฟล์ SQL Map XML ต้องอยู่ในรายการ
ตัวอย่างเช่นสมมติว่า iBATOR ได้สร้างไฟล์ SQL Map XML ชื่อ MyTable_SqlMap.xml และไฟล์นั้นถูกวางไว้ในแพ็คเกจ test.xml ของโปรเจ็กต์ของคุณ ไฟล์ SqlMapConfig.xml ควรมีรายการเหล่านี้ -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- Statement namespaces are required for Abator -->
<settings useStatementNamespaces="true" />
<!-- Setup the transaction manager and data source that are
appropriate for your environment
-->
<transactionManager type="...">
<dataSource type="...">
</dataSource>
</transactionManager>
<!-- SQL Map XML files should be listed here -->
<sqlMap resource="test/xml/MyTable_SqlMap.xml" />
</sqlMapConfig>
หากมีไฟล์ SQL Map XML มากกว่าหนึ่งไฟล์ (ซึ่งเป็นเรื่องปกติธรรมดา) ไฟล์สามารถแสดงในลำดับใดก็ได้โดยมีอิลิเมนต์ <sqlMap> ซ้ำหลังองค์ประกอบ <transactionManager>
การอัปเดตไฟล์ dao.xml
เฟรมเวิร์ก iBATIS DAO ถูกกำหนดค่าโดยไฟล์ xml ที่เรียกกันทั่วไปว่า dao.xml
กรอบงาน iBATIS DAO ใช้ไฟล์นี้เพื่อควบคุมข้อมูลการเชื่อมต่อฐานข้อมูลสำหรับ DAO และยังแสดงรายการคลาสการใช้งาน DAO และอินเทอร์เฟซ DAO
ในไฟล์นี้คุณควรระบุพา ธ ไปยังไฟล์ SqlMapConfig.xml ของคุณและอินเทอร์เฟซ DAO และคลาสการนำไปใช้งานของ iBATOR ทั้งหมด
ตัวอย่างเช่นสมมติว่า iBATOR ได้สร้างอินเทอร์เฟซ DAO ชื่อ MyTableDAO และคลาสการใช้งานที่เรียกว่า MyTableDAOImpl และไฟล์นั้นถูกวางไว้ในแพ็คเกจ test.dao ของโปรเจ็กต์ของคุณ
ไฟล์ dao.xml ควรมีรายการเหล่านี้ -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE daoConfig PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
<context>
<transactionManager type="SQLMAP">
<property name="SqlMapConfigResource" value="test/SqlMapConfig.xml"/>
</transactionManager>
<!-- DAO interfaces and implementations should be listed here -->
<dao interface="test.dao.MyTableDAO" implementation="test.dao.MyTableDAOImpl" />
</context>
</daoConfig>
NOTE − ขั้นตอนนี้จำเป็นต่อเมื่อคุณสร้าง DAO สำหรับกรอบงาน iBATIS DAO