Ibatis动态拼装sql,常用标签总结及举栗子。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ibatis动态拼装sql,常用标签总结及举栗子。相关的知识,希望对你有一定的参考价值。

今天得到项目经理一项任务,就是拼装sql,第一次见到,不是太懂,赶紧回来睡一觉再说,由于这次的项目orm使用的是ibatis框架,所以需要使用动态拼装sql,或者是ognl语言,这门语言不是专属于ibatis的,而是一门独立的语言,就像EL表达式一样。

首先(摘抄一段,私密马赛,其实可以手写的)使用动态查询时ibatis的一个强大的功能,又是你已经改变WHERE子句条件的基础上你的参数对象的状态,在这种情况下的ibatis提供了一组可以映射语句中标签,这种标签的使用提高了SQL语句的重用性和灵活性的动态SQL标签。

他的大致的逻辑就是使用一些额外的标签将sql语句动态的放在xml文件中,定义向该xml文件的sql语句注入参数条件的Bean(记inBean),和利用该xml文件(也就是执行完sql语句)所输出的数据结果存在的Bean(记outBean)。这就是大致的流程。接下来我们来操练一下。(其实就是望文生义令我汗颜)。

下面是一个select语句,功能:

1、如果传递一个非空ID,那么就返回与该ID相关的雇员记录。

2、如果ID为空,就返回所有雇员ID为null 的雇员记录。

首先创建雇员的数据库表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)

);

 此表有如下的记录:

id

first_name last_name salary 
1 Zara Ali 3000
2 Roma Ali 5000
3 Noha Ali 7000

 

Employee 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>标记和这个标签定义,我们将定义一个“id”,这将被用于IbatisReadDy.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">

<select id="findByID" resultClass="Employee">

SELECT * FROM EMPLOYEE

<dynamic prepend="WHERE ">

<isNotNull property="id">

id = #id#

</isNotNull>

</dynamic>

</select>

</sqlMap>

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 <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 ");
  }
} 编辑运行结果:
Going to read records.....
  1  Zara  Ali  5000
Record Reads Successfully
ok~其他的标签<isEmpty></isEmpty>,<iterate></iterate>,<isEqual></isEqual>等,还有各个标签的属性,自己百度,找不到百度的,谷歌百度。谢谢大家!

 

 

以上是关于Ibatis动态拼装sql,常用标签总结及举栗子。的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.tmpl

PLSQ执行同样的sql,使用mybatis进行动态拼装执行的时候非常慢的问题解决

mybatis动态sql之修改(学习set标签)

mybatis 基本用法

如何生成ibatis 动态sql

ibatis实现动态sql处理