📜  iBATIS-动态SQL

📅  最后修改于: 2020-11-16 08:16:29             🧑  作者: Mango


动态SQL是iBATIS的一项非常强大的功能。有时您必须根据参数对象的状态更改WHERE子句条件。在这种情况下,iBATIS提供了一组动态SQL标记,可在映射语句中使用这些标记,以增强SQL的可重用性和灵活性。

使用一些其他标签,所有逻辑都放在.XML文件中。以下是SELECT语句以两种方式工作的示例-

  • 如果传递ID,则它将返回与该ID对应的所有记录。
  • 否则,它将返回员工ID设置为NULL的所有记录。





   

您可以使用标记检查条件,如下所示。在此仅当传递的属性不为空时才添加条件。

..................

..................

如果您想查询我们可以选择员工的ID和/或名字的信息,那么您的SELECT语句将如下所示-

..................

..................

动态SQL示例

以下示例说明如何使用动态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)

员工POJO班

为了执行读取操作,让我们在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 */

Employee.xml文件

要使用iBATIS定义SQL映射语句,我们将在Employee.xml中添加以下修改后的 SELECT * FROM EMPLOYEE id = #id#

上面的SELECT语句将以两种方式工作-

  • 如果传递ID,则它将返回与该ID对应的记录,否则,它将返回所有记录。

IbatisReadDy.java文件

该文件具有应用程序级逻辑,可从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.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子句的一部分。例如-


该语句提供了可选的文本搜索功能。如果您没有输入标题,那么将返回所有活动的博客。但是,如果你传递了一个标题,它会寻找与给定条件的称号。

您可以包含多个if条件,如下所示-


选择,何时和其他声明

iBATIS的提供了一个选择元件,它类似于Java的switch语句。在许多选项中,它仅帮助选择一种情况。

以下示例将仅按标题搜索(如果提供了标题),然后仅按作者搜索(如果提供了标题)。如果两者均未提供,则仅返回精选博客-


在哪里声明

看一下我们以前的示例,看看如果不满足任何条件会发生什么。您最终将得到一个看起来像这样的SQL-

SELECT * FROM BLOG
WHERE

这将失败,但是iBATIS拥有一个简单的解决方案,只需进行一次简单的更改,一切都可以正常工作-

仅当包含标签返回任何内容时, where元素才插入WHERE 。此外,如果该内容以ANDOR开头它将知道将其剥离。

foreach语句

使用foreach元素,您可以指定一个集合,并声明可以在该元素主体内使用的项目和索引变量。

它还允许您指定打开和关闭字符串,并添加一个分隔符以放置在两次迭代之间。您可以按如下方式建立IN条件-