📅  最后修改于: 2020-11-16 08:16:29             🧑  作者: Mango
动态SQL是iBATIS的一项非常强大的功能。有时您必须根据参数对象的状态更改WHERE子句条件。在这种情况下,iBATIS提供了一组动态SQL标记,可在映射语句中使用这些标记,以增强SQL的可重用性和灵活性。
使用一些其他标签,所有逻辑都放在.XML文件中。以下是SELECT语句以两种方式工作的示例-
您可以使用
..................
..................
如果您想查询我们可以选择员工的ID和/或名字的信息,那么您的SELECT语句将如下所示-
..................
..................
以下示例说明如何使用动态SQL编写SELECT语句。考虑一下,我们在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 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
为了执行读取操作,让我们在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;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
} /* End of Employee */
要使用iBATIS定义SQL映射语句,我们将在Employee.xml中添加以下修改后的
上面的SELECT语句将以两种方式工作-
如果传递ID,则它将返回与该ID对应的记录,否则,它将返回所有记录。
该文件具有应用程序级逻辑,可从Employee表读取条件记录-
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class 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 ems = (List)
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表中读取一条记录。
Going to read records.....
1 Zara Ali 5000
Record Reads Successfully
通过传递null作为smc.queryForList(“ Employee.findByID”,null)来尝试上述示例。
iBATIS提供了基于OGNL的强大表达式,可以消除大多数其他元素。
动态SQL中最常见的操作是有条件地包含where子句的一部分。例如-
该语句提供了可选的文本搜索功能。如果您没有输入标题,那么将返回所有活动的博客。但是,如果你传递了一个标题,它会寻找与给定像条件的称号。
您可以包含多个if条件,如下所示-
iBATIS的提供了一个选择元件,它类似于Java的switch语句。在许多选项中,它仅帮助选择一种情况。
以下示例将仅按标题搜索(如果提供了标题),然后仅按作者搜索(如果提供了标题)。如果两者均未提供,则仅返回精选博客-
看一下我们以前的示例,看看如果不满足任何条件会发生什么。您最终将得到一个看起来像这样的SQL-
SELECT * FROM BLOG
WHERE
这将失败,但是iBATIS拥有一个简单的解决方案,只需进行一次简单的更改,一切都可以正常工作-
仅当包含标签返回任何内容时, where元素才插入WHERE 。此外,如果该内容以AND或OR开头,它将知道将其剥离。
使用foreach元素,您可以指定一个集合,并声明可以在该元素主体内使用的项目和索引变量。
它还允许您指定打开和关闭字符串,并添加一个分隔符以放置在两次迭代之间。您可以按如下方式建立IN条件-