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>等,还有各个标签的属性,自己百度,找不到百度的,谷歌百度。谢谢大家!


上一篇:SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。


下一篇:PHP获取文件后缀名的三种方法