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