使用動態(tài)查詢是iBatis一個非常強大的功能。有時你已經改變WHERE子句條件的基礎上你的參數(shù)對象的狀態(tài)。在這種情況下的iBATIS提供了一組可以映射語句中使用,以提高SQL語句的重用性和靈活性的動態(tài)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> ..................
下面的例子將展示如何編寫SELECT語句中使用動態(tài)SQL??紤],我們已經在MySQL下有EMPLOYEE表:
CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) );
此表有如下只有一條記錄:
mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Zara | Ali | 5000 | | 2 | Roma | Ali | 3000 | | 3 | Noha | Ali | 7000 | +----+------------+-----------+--------+ 3 row in set (0.00 sec)
要執(zhí)行讀取操作,讓我們在Employee.java文件Employee類,如下所示:
public class Employee { private int id; private String first_name; private String last_name; private int salary; /* Define constructors for the Employee class. */ public Employee() {} public Employee(String fname, String lname, int salary) { this.first_name = fname; this.last_name = lname; this.salary = salary; } /* Here are the method definitions */ public int getId() { return id; } pu