iBATIS----增删改查

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数据库中创建存储过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$
CREATE PROCEDURE `testdb`.`getEmp`(IN empid INT)BEGIN
   SELECT * FROM EMPLOYEE
   WHERE ID = empid;END $$

DELIMITER;

此表有如下两条记录:

mysql>select*from EMPLOYEE;
+----+| id | first_name | last_name | salary |
+----+|1|Zara|Ali|5000||2|Roma|Ali|3000|

 Employee POJO 类:

使用iBATIS的结果映射,需要修改Employee.java文件。因此,让我们保持它,因为它已经在前一章中使用过。

public class Employee{
privateint id;
private String first_name;
privateString last_name;
privateint salary;
/* Define constructors for the Employee class. */
publicEmployee(){}
publicEmployee(String fname,String lname,int salary){
 this.first_name = fname;this.last_name = lname;this.salary = salary;
}
/* Here are the required method definitions */
publicint getId(){return id;}
publicvoid setId(int id){this.id = id;}
publicString getFirstName(){return first_name;}
publicvoid setFirstName(String fname){this.first_name = fname;}
publicString getLastName(){return last_name;}
publicvoid setlastName(String lname){this.last_name = lname;}
publicint getSalary(){return salary;}
publicvoid setSalary(int salary){this.salary = salary;}
}/* End of Employee */  

 

Employee.xml 文件: 

<?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"> parameterClass:可以采取一个值作为字符串,整型,浮点型,double或根据要求任何类的对象。
此例中,我们通过Employee对象作为参数而调用SqlMap类的insert方法。
如果数据库表使用IDENTITY,AUTO_INCREMENT或串行列或已定义的SEQUENCE/GENERATOR,
可使用<selectKey>元素在<insert>语句中使用或返回数据库生成的值,此处为使用序列作为插入数据的id值
<!-- Perform Insert Operation -->
<insertid="insert"parameterClass="Employee">
   INSERT INTO EMPLOYEE(first_name, last_name, salary)
   values (#first_name#, #last_name#, #salary#)

   <selectKeyresultClass="int"keyProperty="id">
      select last_insert_id() as id
   </selectKey>
</insert>

<!-- Perform Delete Operation --> <deleteid="delete"parameterClass="int"> DELETE FROM EMPLOYEE WHERE id = #id# </delete>

<!-- Perform Update Operation -->
<updateid="update"parameterClass="Employee">
   UPDATE EMPLOYEE
   SET    first_name = #first_name#
   WHERE  id = #id#
</update>

<!-- Perform Read Operation 查询结果用Employee类封装--> <selectid="getAll"resultClass="Employee"> SELECT * FROM EMPLOYEE </select> 
<!-- Using ResultMap 查询结果用ResultMap封装-->
resultMap的元素是在iBATIS的最重要和最强大的元素。您可以通过使用iBATIS的结果映射减少高达90%的JDBC编码,
在某些情况下,可以让你做JDBC不支持的事情
 <resultMapid="result"class="Employee">
  <resultproperty="id"column="id"/>
  <resultproperty="first_name"column="first_name"/>
  <resultproperty="last_name"column="last_name"/>
  <resultproperty="salary"column="salary"/>
 </resultMap>
 <selectid="useResultMap"resultMap="result">
         SELECT * FROM EMPLOYEE
         WHERE id=#id#
 </select>

使用存储过程查询:
<!-- To call stored procedure. 调用数据库中创建的存储过程SQL语句--> <parameterMapid="getEmpInfoCall"class="map"> <parameterproperty="acctID"jdbcType="INT"javaType="java.lang.Integer"mode="IN"/> </parameterMap> <procedureid="getEmpInfo" parameterMap="getEmpInfoCall"resultClass="Employee"> { call getEmp( #acctID# ) } </procedure>

动态SQL查询:
动态查询是iBatis一个非常强大的功能。有时你已经改变WHERE子句条件的基础上你的参数对象的状态。 在这种情况下的iBATIS提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的动态SQL标签。 所有的逻辑是使用一些额外的标签放在:XML文件。下面是一个例子,其中的SELECT语句将努力在两个方面: 如果想传递一个ID,然后它会返回所有与该ID的记录,否则,将返回所有雇员ID为NULL的记录。 <selectid="findByID"resultClass="Employee"> SELECT * FROM EMPLOYEE <dynamicprepend="WHERE "> <isNullproperty="id">id IS NULL</isNull> <isNotNullproperty="id">id = #id#</isNotNull> </dynamic> </select> 可以使用<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> iBATIS OGNL 表达式:iBATIS的提供了强大的基于OGNL的表达式来消除其他元素。

if 语句

choose, when, otherwise 语句

where 语句

foreach 语句

 

 

if 语句:最常见的事情在动态SQL是有条件地包括一个where子句的一部分。例如:

这条语句会提供功能的可选的文本搜索类型。如果没有传递title,那么所有激活的博客将被退回。但是,如果传递一个标题,它会寻找标题以like 给定的条件。 

<selectid="findActiveBlogWithTitleLike"parameterType="Blog"resultType="Blog">

   SELECT * FROM BLOG

   WHERE state = 'ACTIVE.

    <if test="title != null">AND title like #{title}</if>

    <iftest="author != null">AND author like #{author}</if>

</select>

 

choose, when, otherwise 语句:iBATIS提供了一个选择的元素,它类似于Java的switch语句。这有助于选择很多种情况。

<selectid="findActiveBlogWithTitleLike"parameterType="Blog"resultType="Blog">

   SELECT * FROM BLOG

   WHERE state = 'ACTIVE.

   <choose>

      <when test="title != null">AND title like #{title}</when>

     <whentest="author != null and author.name != null">AND author like #{author}</when>

     <otherwise>AND featured = 1</otherwise>

   </choose>

</select>

 

where 语句 :

where元素知道只有插入WHERE ,如果有一个由含标签返回的任何内容。此外,如果该内容开头AND或OR,它知道剥离其关闭

<selectid="findActiveBlogLike"parameterType="Blog"resultType="Blog">

     SELECT * FROM BLOG

     <where>

       <iftest="state != null">state = #{state}</if>

       <iftest="title != null">AND title like #{title}</if>

       <iftest="author != null>AND author like #{author}</if>

     </where>

</select>

 

foreach 语句:

foreach元素是非常强大的,并允许你指定一个集合,声明可以在元素的体内可用于项目和索引变量。

它也允许你指定打开和关闭的字符串,并添加一个分隔符放置在迭代之间。可以建立一个IN条件如下:

<selectid="selectPostIn"resultType="domain.blog.Post">

     SELECT * FROM POST P

     WHERE ID in

       <foreachitem="item"index="index"collection="list"

           open="("separator=","close=")"> #{item}

       </foreach>

</select>

 

</sqlMap>

 

 

IbatisResultMap.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 IbatisResultMap{
 publicstaticvoid main(String[] args)throwsIOException,SQLException{

   //调用工具类Resources加载Ibatis配置文件SqlMapConfig.xml(包含employee.xml文件)
   Reader rd =Resources.getResourceAsReader("SqlMapConfig.xml");
   //调用Ibatis的接口获取SQL数据操作实例对象SqlMapClient
   SqlMapClient smc =SqlMapClientBuilder.buildSqlMapClient(rd);

   增:
   Employee em =newEmployee("Zara","Ali",5000); smc.insert("Employee.insert", em); 删:  int id =1; smc.delete("Employee.delete", id ); 改:  Employee rec =newEmployee(); rec.setId(1); rec.setFirstName("Roma"); smc.update("Employee.update", rec ); 查:  List<Employee> ems =(List<Employee>)smc.queryForList("Employee.getAll",null);
   int id =1;
   Employee e =(Employee)smc.queryForObject("Employee.useResultMap", id);
   //调用存储过程查询
   Employee e =(Employee)smc.queryForObject("Employee.getEmpInfo", id);
   //动态查询
   Employee rec =newEmployee(); rec.setId(1);List<Employee> ems =(List<Employee>)smc.queryForList("Employee.findByID", rec);
 }
   
}  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ibatis)