Mybatis基礎操作之存儲過程

    mybatis調用存儲過程非常的方便,下面開始學習Mybatis/Ibatis 2如何調用Oracle的存儲過程。先學習一個簡單輸出文本的例子:

   

Java代碼 
  1. <SPAN>CREATE OR REPLACE PROCEDURE proc_out(yes IN VARCHAR2,fly OUT VARCHAR2) AS   
  2.  begin   
  3.   dbms_output.put_line(yes);   
  4.   fly:='return something';   
  5.  end proc_out;   
  6. </SPAN>  
<span>CREATE OR REPLACE PROCEDURE proc_out(yes IN VARCHAR2,fly OUT VARCHAR2) AS
 begin
  dbms_output.put_line(yes);
  fly:='return something';
 end proc_out;
</span>

  

   Mybatis調用配置如下:

   

Java代碼  
  1. <SPAN><select id="testOutput" statementType="CALLABLE" parameterType="hashmap">     
  2.   <![CDATA[ {call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR})}]]>   
  3.     </select></SPAN>  
<span><select id="testOutput" statementType="CALLABLE" parameterType="hashmap">  
  <![CDATA[ {call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR})}]]>
	</select></span>

    測試方法如下:

   

Java代碼  
  1. <SPAN>public void TestOutputCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         // 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一致,只要保證它們的順序是一致的即可。   
  5.         params.put("yes""china");   
  6.         sqlSession.selectOne("test.testOutput", params);   
  7.         String result = (String) params.get("gog");   
  8.         System.out.println(result);   
  9.     }</SPAN>  
<span>public void TestOutputCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		// 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一致,只要保證它們的順序是一致的即可。
		params.put("yes", "china");
		sqlSession.selectOne("test.testOutput", params);
		String result = (String) params.get("gog");
		System.out.println(result);
	}</span>

    Ibatis配置如下:

   

Java代碼  
  1. <SPAN><parameterMap id="stringOutMap" class="java.util.Map">   
  2.         <!-- mode參數用來設置是傳入參數還是返回參數 -->   
  3.         <parameter property="yes" javaType="String" jdbcType="VARCHAR"  
  4.             mode="IN" />   
  5.         <parameter property="fly" javaType="String" jdbcType="VARCHAR"  
  6.             mode="OUT" />   
  7.     </parameterMap>   
  8.   
  9.     <procedure id="testOutput" parameterMap="stringOutMap">   
  10.        <![CDATA[{call proc_out(?,?)}]]>   
  11.     </procedure></SPAN>  
<span><parameterMap id="stringOutMap" class="java.util.Map">
		<!-- mode參數用來設置是傳入參數還是返回參數 -->
		<parameter property="yes" javaType="String" jdbcType="VARCHAR"
			mode="IN" />
		<parameter property="fly" javaType="String" jdbcType="VARCHAR"
			mode="OUT" />
	</parameterMap>

	<procedure id="testOutput" parameterMap="stringOutMap">
       <![CDATA[{call proc_out(?,?)}]]>
	</procedure></span>

    測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestOutputCallable(SqlMapClient sqlMapper) throws SQLException {   
  2.         Map  mapIn = new HashMap();   
  3.         mapIn.put("yes""china");   
  4.         mapIn.put("fly""");   
  5.         sqlMapper.queryForObject("test.testOutput",mapIn);   
  6.         String result=(String) mapIn.get("fly");   
  7.         System.out.println(result);   
  8.     }</SPAN>  
<span>public void TestOutputCallable(SqlMapClient sqlMapper) throws SQLException {
		Map  mapIn = new HashMap();
		mapIn.put("yes", "china");
		mapIn.put("fly", "");
		sqlMapper.queryForObject("test.testOutput",mapIn);
		String result=(String) mapIn.get("fly");
		System.out.println(result);
	}</span>

    Ps,Ibatis每次輸入都要新建一個Map來指定輸入參數和輸出參數,用起來特不爽,還是Mybatis好用

   

     下面開始使用表了, 首先新建表Emp:

   

Java代碼  
  1. <SPAN>-- Create table   
  2. create table EMP   
  3. (   
  4.   EMPNO    NUMBER not null,   
  5.   ENAME    VARCHAR2(30) not null,   
  6.   JOB      VARCHAR2(15),   
  7.   MGR      NUMBER,   
  8.   HIREDATE DATE,   
  9.   SALE     NUMBER,   
  10.   COMM     NUMBER,   
  11.   DEPTNO   NUMBER   
  12. )   
  13. -- Create/Recreate primary, unique and foreign key constraints    
  14. alter table EMP   
  15.   add primary key (EMPNO)   
  16.     
  17. </SPAN>  
<span>-- Create table
create table EMP
(
  EMPNO    NUMBER not null,
  ENAME    VARCHAR2(30) not null,
  JOB      VARCHAR2(15),
  MGR      NUMBER,
  HIREDATE DATE,
  SALE     NUMBER,
  COMM     NUMBER,
  DEPTNO   NUMBER
)
-- Create/Recreate primary, unique and foreign key constraints 
alter table EMP
  add primary key (EMPNO)
 
</span>

   再新建JavaBean

  

Java代碼  
  1. <SPAN>package bean;   
  2.   
  3. import java.util.Date;   
  4.   
  5. public class EmpBean {   
  6.     @Override  
  7.     public String toString() {   
  8.         return "EmpBean [empNo=" + empNo + ", ename=" + ename + ", job=" + job   
  9.                 + ", mrg=" + mrg + ", hireDate=" + hireDate.toLocaleString()   
  10.                 + ", sale=" + sale + ", comm=" + comm + ", depNo=" + depNo   
  11.                 + "]";   
  12.     }   
  13.   
  14.     private long empNo;   
  15.     private String ename;   
  16.     private String job;   
  17.     private long mrg;   
  18.     private Date hireDate;   
  19.     private long sale;   
  20.     private long comm=0;   
  21.     private long depNo;   
  22.   
  23.     public long getEmpNo() {   
  24.         return empNo;   
  25.     }   
  26.   
  27.     public void setEmpNo(long empNo) {   
  28.         this.empNo = empNo;   
  29.     }   
  30.   
  31.     public String getEname() {   
  32.         return ename;   
  33.     }   
  34.   
  35.     public void setEname(String ename) {   
  36.         this.ename = ename;   
  37.     }   
  38.   
  39.     public String getJob() {   
  40.         return job;   
  41.     }   
  42.   
  43.     public void setJob(String job) {   
  44.         this.job = job;   
  45.     }   
  46.   
  47.     public long getMrg() {   
  48.         return mrg;   
  49.     }   
  50.   
  51.     public void setMrg(long mrg) {   
  52.         this.mrg = mrg;   
  53.     }   
  54.   
  55.     public Date getHireDate() {   
  56.         return hireDate;   
  57.     }   
  58.   
  59.     public void setHireDate(Date hireDate) {   
  60.         this.hireDate = hireDate;   
  61.     }   
  62.   
  63.     public long getSale() {   
  64.         return sale;   
  65.     }   
  66.   
  67.     public void setSale(long sale) {   
  68.         this.sale = sale;   
  69.     }   
  70.   
  71.     public long getComm() {   
  72.         return comm;   
  73.     }   
  74.   
  75.     public void setComm(long comm) {   
  76.         this.comm = comm;   
  77.     }   
  78.   
  79.     public long getDepNo() {   
  80.         return depNo;   
  81.     }   
  82.   
  83.     public void setDepNo(long depNo) {   
  84.         this.depNo = depNo;   
  85.     }   
  86.   
  87. }   
  88. </SPAN>  
<span>package bean;

import java.util.Date;

public class EmpBean {
	@Override
	public String toString() {
		return "EmpBean [empNo=" + empNo + ", ename=" + ename + ", job=" + job
				+ ", mrg=" + mrg + ", hireDate=" + hireDate.toLocaleString()
				+ ", sale=" + sale + ", comm=" + comm + ", depNo=" + depNo
				+ "]";
	}

	private long empNo;
	private String ename;
	private String job;
	private long mrg;
	private Date hireDate;
	private long sale;
	private long comm=0;
	private long depNo;

	public long getEmpNo() {
		return empNo;
	}

	public void setEmpNo(long empNo) {
		this.empNo = empNo;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public long getMrg() {
		return mrg;
	}

	public void setMrg(long mrg) {
		this.mrg = mrg;
	}

	public Date getHireDate() {
		return hireDate;
	}

	public void setHireDate(Date hireDate) {
		this.hireDate = hireDate;
	}

	public long getSale() {
		return sale;
	}

	public void setSale(long sale) {
		this.sale = sale;
	}

	public long getComm() {
		return comm;
	}

	public void setComm(long comm) {
		this.comm = comm;
	}

	public long getDepNo() {
		return depNo;
	}

	public void setDepNo(long depNo) {
		this.depNo = depNo;
	}

}
</span>

 

    先來一個根據主鍵得到Emp記錄的例子,對應的存儲過程爲:

   

Java代碼  
  1. <SPAN>create or replace procedure getEmpById(V_USERID IN NUMBER,   
  2.                                        V_CURSOR OUT SYS_REFCURSOR) is   
  3. begin   
  4.   OPEN V_CURSOR FOR   
  5.     SELECT * from emp WHERE empno = V_USERID;   
  6. end getEmpById;   
  7. </SPAN>  
<span>create or replace procedure getEmpById(V_USERID IN NUMBER,
                                       V_CURSOR OUT SYS_REFCURSOR) is
begin
  OPEN V_CURSOR FOR
    SELECT * from emp WHERE empno = V_USERID;
end getEmpById;
</span>

 

    Mybatis配置如下:

   

Java代碼  
  1. <SPAN><resultMap id="enameMap" type="bean.EmpBean">   
  2.         <result column="EMPNO" property="empNo" />   
  3.         <result column="ENAME" property="ename" />   
  4.         <result column="JOB" property="job" />   
  5.         <result column="MGR" property="mrg" />   
  6.         <result column="HIREDATE" property="hireDate" />   
  7.         <result column="SALE" property="sale" />   
  8.         <result column="COMM" property="comm" />   
  9.         <result column="DEPTNO" property="depNo" />   
  10. </resultMap>   
  11.   
  12. <update id="selectEmpById" statementType="CALLABLE"  
  13.         parameterType="map">        
  14.           <![CDATA[   
  15.           call getEmpById(#{userid,mode=IN,jdbcType=DECIMAL},   
  16.                          #{emp,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=enameMap})   
  17.         ]]>   
  18.     </update></SPAN>  
<span><resultMap id="enameMap" type="bean.EmpBean">
		<result column="EMPNO" property="empNo" />
		<result column="ENAME" property="ename" />
		<result column="JOB" property="job" />
		<result column="MGR" property="mrg" />
		<result column="HIREDATE" property="hireDate" />
		<result column="SALE" property="sale" />
		<result column="COMM" property="comm" />
		<result column="DEPTNO" property="depNo" />
</resultMap>

<update id="selectEmpById" statementType="CALLABLE"
		parameterType="map">     
          <![CDATA[
		  call getEmpById(#{userid,mode=IN,jdbcType=DECIMAL},
		                 #{emp,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=enameMap})
	    ]]>
	</update></span>

   測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestGetEmpByIdCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         // 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一致,只要保證它們的順序是一致的即可。   
  5.         params.put("userid"7769);   
  6.         sqlSession.selectOne("test.selectEmpById", params);   
  7.         List<EmpBean> list = (List<EmpBean>) params.get("emp");   
  8.         System.out.println(list.size() + "---" + list.get(0).toString());   
  9.     }</SPAN>  
<span>public void TestGetEmpByIdCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		// 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一致,只要保證它們的順序是一致的即可。
		params.put("userid", 7769);
		sqlSession.selectOne("test.selectEmpById", params);
		List<EmpBean> list = (List<EmpBean>) params.get("emp");
		System.out.println(list.size() + "---" + list.get(0).toString());
	}</span>

   Ibatis配置爲:

  

Java代碼  
  1. <SPAN><parameterMap id="empListParam" class="java.util.Map">   
  2.        <parameter property="userid" javaType="Long" jdbcType="NUMBER"  
  3.             mode="IN" />   
  4.         <parameter property="result" jdbcType="ORACLECURSOR"  
  5.             javaType="java.sql.ResultSet" mode="OUT" />   
  6.     </parameterMap>   
  7.        
  8.     <procedure id="selectEmpById" parameterMap="empListParam" resultClass="bean.EmpBean">   
  9.        <![CDATA[{call getEmpById(?,?)}]]>   
  10.     </procedure></SPAN>  
<span><parameterMap id="empListParam" class="java.util.Map">
	   <parameter property="userid" javaType="Long" jdbcType="NUMBER"
			mode="IN" />
		<parameter property="result" jdbcType="ORACLECURSOR"
			javaType="java.sql.ResultSet" mode="OUT" />
	</parameterMap>
	
	<procedure id="selectEmpById" parameterMap="empListParam" resultClass="bean.EmpBean">
       <![CDATA[{call getEmpById(?,?)}]]>
	</procedure></span>

    Ibatis測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestEmpByIdCallable(SqlMapClient sqlMapper) throws SQLException {   
  2.         Map t=new HashMap();   
  3.         t.put("userid",7782L);   
  4.         List<EmpBean> list = sqlMapper.queryForList("test.selectEmpById",t);   
  5.         System.out.println(list.size()+"----="+list.get(0).toString());   
  6.     }</SPAN>  
<span>public void TestEmpByIdCallable(SqlMapClient sqlMapper) throws SQLException {
		Map t=new HashMap();
		t.put("userid",7782L);
		List<EmpBean> list = sqlMapper.queryForList("test.selectEmpById",t);
		System.out.println(list.size()+"----="+list.get(0).toString());
	}</span>

   下面學習使用存儲過程進行普通的增刪改查操作,首先是新增,新建存儲過程

  

Java代碼  
  1. <SPAN>create or replace procedure addEmp(e_no    in long,   
  2.                                    e_name  in varchar2,   
  3.                                    e_job   in varchar2,   
  4.                                    e_mgr   in long,   
  5.                                    e_date  in date,   
  6.                                    e_sale  in long,   
  7.                                    e_comm  in long,   
  8.                                    e_depno in long,   
  9.                                    message out varchar2) is   
  10. begin   
  11.   insert into emp   
  12.     (EMPNO, ENAME, JOB, MGR, HIREDATE, SALE, COMM, DEPTNO)   
  13.   VALUES   
  14.     (e_no, e_name, e_job, e_mgr, e_date, e_sale, e_comm, e_depno);   
  15.   message := '插入用戶表成功';   
  16.   commit;   
  17. EXCEPTION   
  18.   WHEN OTHERS THEN   
  19.     message := '插入用戶表失敗';   
  20. end addEmp;   
  21. </SPAN>  
<span>create or replace procedure addEmp(e_no    in long,
                                   e_name  in varchar2,
                                   e_job   in varchar2,
                                   e_mgr   in long,
                                   e_date  in date,
                                   e_sale  in long,
                                   e_comm  in long,
                                   e_depno in long,
                                   message out varchar2) is
begin
  insert into emp
    (EMPNO, ENAME, JOB, MGR, HIREDATE, SALE, COMM, DEPTNO)
  VALUES
    (e_no, e_name, e_job, e_mgr, e_date, e_sale, e_comm, e_depno);
  message := '插入用戶表成功';
  commit;
EXCEPTION
  WHEN OTHERS THEN
    message := '插入用戶表失敗';
end addEmp;
</span>

   Mybatis配置如下:

  

Java代碼  
  1. <SPAN><insert id="addEmp" statementType="CALLABLE">   
  2.         {call   
  3.         addEmp(#{empNo},#{ename},#{job},#{mrg},#{hireDate},#{sale},#{comm},#{depNo},#{message,   
  4.         mode=OUT,javaType=string,jdbcType=VARCHAR})}   
  5.     </insert></SPAN>  
<span><insert id="addEmp" statementType="CALLABLE">
		{call
		addEmp(#{empNo},#{ename},#{job},#{mrg},#{hireDate},#{sale},#{comm},#{depNo},#{message,
		mode=OUT,javaType=string,jdbcType=VARCHAR})}
	</insert></span>

    測試方法爲:

  

Java代碼  
  1. <SPAN>public void TestAddEmpCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         params.put("empNo"123);   
  5.         params.put("ename""testadd");   
  6.         params.put("job""testjob");   
  7.         params.put("mrg"123);   
  8.         params.put("hireDate"new Date());   
  9.         params.put("sale"8000);   
  10.         params.put("comm"1);   
  11.         params.put("depNo"20);   
  12.         sqlSession.selectOne("test.addEmp", params);   
  13.         String result = (String) params.get("message");   
  14.         System.out.println(result);   
  15.     }</SPAN>  
<span>public void TestAddEmpCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		params.put("empNo", 123);
		params.put("ename", "testadd");
		params.put("job", "testjob");
		params.put("mrg", 123);
		params.put("hireDate", new Date());
		params.put("sale", 8000);
		params.put("comm", 1);
		params.put("depNo", 20);
		sqlSession.selectOne("test.addEmp", params);
		String result = (String) params.get("message");
		System.out.println(result);
	}</span>

    Ibatis配置爲:

   

Java代碼  
  1. <SPAN><parameterMap id="empInfoMap" class="java.util.Map">   
  2.       <parameter property="empNo" jdbcType="NUMBER" javaType="java.lang.Long"  
  3.         mode="IN" />   
  4.       <parameter property="ename" jdbcType="VARCHAR" javaType="java.lang.String"  
  5.         mode="IN" />   
  6.       <parameter property="job" jdbcType="VARCHAR" javaType="java.lang.String"  
  7.         mode="IN" />   
  8.       <parameter property="mrg" jdbcType="NUMBER" javaType="java.lang.Long"  
  9.         mode="IN" />   
  10.       <parameter property="hireDate" jdbcType="DATE" javaType="java.util.Date"  
  11.         mode="IN" />   
  12.       <parameter property="sale" jdbcType="NUMBER" javaType="java.lang.Long"  
  13.         mode="IN" />   
  14.       <parameter property="comm" jdbcType="NUMBER" javaType="java.lang.Long"  
  15.         mode="IN" />   
  16.       <parameter property="depNo" jdbcType="NUMBER" javaType="java.lang.Long"  
  17.         mode="IN" />   
  18.       <parameter property="message" jdbcType="VARCHAR" javaType="java.lang.String"  
  19.         mode="OUT" />   
  20.    </parameterMap>   
  21.        
  22.     <procedure id="addEmp" parameterMap="empInfoMap">   
  23.        <![CDATA[{call addEmp(?,?,?,?,?,?,?,?,?)}]]>   
  24.     </procedure></SPAN>  
<span><parameterMap id="empInfoMap" class="java.util.Map">
	  <parameter property="empNo" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="ename" jdbcType="VARCHAR" javaType="java.lang.String"
		mode="IN" />
	  <parameter property="job" jdbcType="VARCHAR" javaType="java.lang.String"
		mode="IN" />
	  <parameter property="mrg" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="hireDate" jdbcType="DATE" javaType="java.util.Date"
		mode="IN" />
	  <parameter property="sale" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="comm" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="depNo" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="message" jdbcType="VARCHAR" javaType="java.lang.String"
		mode="OUT" />
   </parameterMap>
	
	<procedure id="addEmp" parameterMap="empInfoMap">
       <![CDATA[{call addEmp(?,?,?,?,?,?,?,?,?)}]]>
	</procedure></span>

    對應的測試方法爲:

   

Java代碼  
  1. <SPAN>public void addEmpCallable(SqlMapClient sqlMapper)throws SQLException{   
  2.         Map params = new HashMap();   
  3.         params.put("empNo", 124L);   
  4.         params.put("ename""testadd");   
  5.         params.put("job""testjob");   
  6.         params.put("mrg", 124L);   
  7.         params.put("hireDate"new Date());   
  8.         params.put("sale", 8000L);   
  9.         params.put("comm", 2L);   
  10.         params.put("depNo", 20L);   
  11.         params.put("message","");   
  12.         sqlMapper.update("test.addEmp",params);   
  13.         System.out.println(params.get("message"));   
  14.     }</SPAN>  
<span>public void addEmpCallable(SqlMapClient sqlMapper)throws SQLException{
		Map params = new HashMap();
		params.put("empNo", 124L);
		params.put("ename", "testadd");
		params.put("job", "testjob");
		params.put("mrg", 124L);
		params.put("hireDate", new Date());
		params.put("sale", 8000L);
		params.put("comm", 2L);
		params.put("depNo", 20L);
		params.put("message","");
		sqlMapper.update("test.addEmp",params);
		System.out.println(params.get("message"));
	}</span>

    下面是修改,存儲過程如下:

   

Java代碼  
  1. <SPAN>create or replace procedure updateEmp(e_no    in long,   
  2.                                        e_name  in varchar2,   
  3.                                        e_job   in varchar2,   
  4.                                        e_mgr   in long,   
  5.                                        e_date  in date,   
  6.                                        e_sale  in long,   
  7.                                        e_comm  in long,   
  8.                                        e_depno in long,   
  9.                                        message out varchar2) is   
  10. begin   
  11.   update emp u   
  12.      set ENAME     = e_name,   
  13.          JOB      = e_job,   
  14.          MGR      = e_mgr,   
  15.          HIREDATE  = e_date,   
  16.          SALE=e_sale,   
  17.          COMM=e_comm,   
  18.          DEPTNO=e_depno   
  19.    where EMPNO = e_no;   
  20.   message := '更新用戶表成功';   
  21.   commit;   
  22. EXCEPTION   
  23.   WHEN OTHERS THEN   
  24.     message := '更新用戶表失敗';   
  25. end updateEmp;   
  26. </SPAN>  
<span>create or replace procedure updateEmp(e_no    in long,
                                       e_name  in varchar2,
                                       e_job   in varchar2,
                                       e_mgr   in long,
                                       e_date  in date,
                                       e_sale  in long,
                                       e_comm  in long,
                                       e_depno in long,
                                       message out varchar2) is
begin
  update emp u
     set ENAME     = e_name,
         JOB      = e_job,
         MGR      = e_mgr,
         HIREDATE  = e_date,
         SALE=e_sale,
         COMM=e_comm,
         DEPTNO=e_depno
   where EMPNO = e_no;
  message := '更新用戶表成功';
  commit;
EXCEPTION
  WHEN OTHERS THEN
    message := '更新用戶表失敗';
end updateEmp;
</span>

   Mybatis匹配爲:

  

Java代碼  
  1. <SPAN><update id="updateEmp" statementType="CALLABLE">   
  2.         {call   
  3.         updateEmp(#{empNo},#{ename},#{job},#{mrg},#{hireDate},#{sale},#{comm},#{depNo},#{message,   
  4.         mode=OUT,javaType=string,jdbcType=VARCHAR})}   
  5.     </update></SPAN>  
<span><update id="updateEmp" statementType="CALLABLE">
		{call
		updateEmp(#{empNo},#{ename},#{job},#{mrg},#{hireDate},#{sale},#{comm},#{depNo},#{message,
		mode=OUT,javaType=string,jdbcType=VARCHAR})}
	</update></span>

    測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestUpdateEmpCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         params.put("empNo"123);   
  5.         params.put("ename""testupdate");   
  6.         params.put("job""testjob2");   
  7.         params.put("mrg"123);   
  8.         params.put("hireDate"new Date());   
  9.         params.put("sale"8500);   
  10.         params.put("comm"1);   
  11.         params.put("depNo"20);   
  12.         sqlSession.selectOne("test.updateEmp", params);   
  13.         String result = (String) params.get("message");   
  14.         System.out.println(result);   
  15.     }</SPAN>  
<span>public void TestUpdateEmpCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		params.put("empNo", 123);
		params.put("ename", "testupdate");
		params.put("job", "testjob2");
		params.put("mrg", 123);
		params.put("hireDate", new Date());
		params.put("sale", 8500);
		params.put("comm", 1);
		params.put("depNo", 20);
		sqlSession.selectOne("test.updateEmp", params);
		String result = (String) params.get("message");
		System.out.println(result);
	}</span>

    Ibatis配置爲:

   

Java代碼  
  1. <SPAN><procedure id="updateEmp" parameterMap="empInfoMap">   
  2.        <![CDATA[{call updateEmp(?,?,?,?,?,?,?,?,?)}]]>   
  3.     </procedure></SPAN>  
<span><procedure id="updateEmp" parameterMap="empInfoMap">
       <![CDATA[{call updateEmp(?,?,?,?,?,?,?,?,?)}]]>
	</procedure></span>

    對應的測試方法爲:

  

Java代碼  
  1. <SPAN>public void updateEmpCallable(SqlMapClient sqlMapper)throws SQLException{   
  2.         Map params = new HashMap();   
  3.         params.put("empNo", 124L);   
  4.         params.put("ename""testupdate");   
  5.         params.put("job""testjob");   
  6.         params.put("mrg", 125L);   
  7.         params.put("hireDate"new Date());   
  8.         params.put("sale", 8500L);   
  9.         params.put("comm", 3L);   
  10.         params.put("depNo", 20L);   
  11.         params.put("message","");   
  12.         sqlMapper.update("test.updateEmp",params);   
  13.         System.out.println(params.get("message"));   
  14.     }</SPAN>  
<span>public void updateEmpCallable(SqlMapClient sqlMapper)throws SQLException{
		Map params = new HashMap();
		params.put("empNo", 124L);
		params.put("ename", "testupdate");
		params.put("job", "testjob");
		params.put("mrg", 125L);
		params.put("hireDate", new Date());
		params.put("sale", 8500L);
		params.put("comm", 3L);
		params.put("depNo", 20L);
		params.put("message","");
		sqlMapper.update("test.updateEmp",params);
		System.out.println(params.get("message"));
	}</span>

   下面是查詢操作,存儲過程爲:

   

Java代碼  
  1. <SPAN>create or replace package JUV is   
  2.   TYPE CUR_GETEMP IS REF CURSOR;   
  3. end JUV;   
  4.   
  5. create or replace procedure getAllEmp(empList out JUV.CUR_GETEMP)   
  6. as   
  7. begin   
  8. open empList for select * from emp;   
  9. end getAllEmp;   
  10. </SPAN>  
<span>create or replace package JUV is
  TYPE CUR_GETEMP IS REF CURSOR;
end JUV;

create or replace procedure getAllEmp(empList out JUV.CUR_GETEMP)
as
begin
open empList for select * from emp;
end getAllEmp;
</span>

   Mybatis配置爲:

  

Java代碼  
  1. <SPAN><select id="getAllEmp" statementType="CALLABLE">   
  2.         <![CDATA[{call getAllEmp(#{empList,mode=OUT,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=enameMap})}]]>   
  3.     </select></SPAN>  
<span><select id="getAllEmp" statementType="CALLABLE">
		<![CDATA[{call getAllEmp(#{empList,mode=OUT,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=enameMap})}]]>
	</select></span>

    測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestGetAllEmpsCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         sqlSession.selectOne("test.getAllEmp", params);   
  5.         List<EmpBean> beanList = (List<EmpBean>) params.get("empList");   
  6.         for (EmpBean empBean : beanList) {   
  7.             System.out.println(empBean);   
  8.         }   
  9.     }</SPAN>  
<span>public void TestGetAllEmpsCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		sqlSession.selectOne("test.getAllEmp", params);
		List<EmpBean> beanList = (List<EmpBean>) params.get("empList");
		for (EmpBean empBean : beanList) {
			System.out.println(empBean);
		}
	}</span>

     Ibatis配置爲:

    

Java代碼  
  1. <SPAN><procedure id="getEmps" parameterMap="searchParam" resultClass="bean.EmpBean">   
  2.        <![CDATA[{call getAllEmp(?)}]]>   
  3.     </procedure></SPAN>  
<span><procedure id="getEmps" parameterMap="searchParam" resultClass="bean.EmpBean">
       <![CDATA[{call getAllEmp(?)}]]>
	</procedure></span>

    對應的測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestEmpListsCallable(SqlMapClient sqlMapper) throws SQLException {   
  2.         List<EmpBean> list = sqlMapper.queryForList("test.getEmps");   
  3.         for (EmpBean empBean : list) {   
  4.             System.out.println(empBean);   
  5.         }   
  6.     }</SPAN>  
<span>public void TestEmpListsCallable(SqlMapClient sqlMapper) throws SQLException {
		List<EmpBean> list = sqlMapper.queryForList("test.getEmps");
		for (EmpBean empBean : list) {
			System.out.println(empBean);
		}
	}</span>

    最後是刪除操作,存儲過程爲:

   

Java代碼  
  1. <SPAN>create or replace procedure delEmp(u_id in varchar2, message out varchar2) is   
  2. begin   
  3.   delete emp where EMPNO = u_id;   
  4.   message := '刪除用戶表成功';   
  5.   commit;   
  6. EXCEPTION   
  7.   WHEN OTHERS THEN   
  8.     message := '刪除用戶表失敗';   
  9. end delEmp;   
  10. </SPAN>  
<span>create or replace procedure delEmp(u_id in varchar2, message out varchar2) is
begin
  delete emp where EMPNO = u_id;
  message := '刪除用戶表成功';
  commit;
EXCEPTION
  WHEN OTHERS THEN
    message := '刪除用戶表失敗';
end delEmp;
</span>

   Mybatis配置爲:

  

Java代碼  
  1. <SPAN><delete id="delEmp" statementType="CALLABLE">   
  2.         {call delEmp(#{id},#{message,   
  3.         mode=OUT,javaType=string,jdbcType=VARCHAR})}   
  4.     </delete></SPAN>  
<span><delete id="delEmp" statementType="CALLABLE">
		{call delEmp(#{id},#{message,
		mode=OUT,javaType=string,jdbcType=VARCHAR})}
	</delete></span>

   測試方法爲:

   

Java代碼  
  1. <SPAN>public void TestDelEmpCallable(SqlSessionFactory ssf2) {   
  2.         SqlSession sqlSession = ssf2.openSession();   
  3.         Map params = new HashMap();   
  4.         params.put("id"7844);   
  5.         sqlSession.selectOne("test.delEmp", params);   
  6.         String result = (String) params.get("message");   
  7.         System.out.println(result);   
  8.     }</SPAN>  
<span>public void TestDelEmpCallable(SqlSessionFactory ssf2) {
		SqlSession sqlSession = ssf2.openSession();
		Map params = new HashMap();
		params.put("id", 7844);
		sqlSession.selectOne("test.delEmp", params);
		String result = (String) params.get("message");
		System.out.println(result);
	}</span>

   Ibatis配置爲:

   

Java代碼  
  1. <SPAN><parameterMap id="delEmpMap" class="java.util.Map">   
  2.       <parameter property="empNo" jdbcType="NUMBER" javaType="java.lang.Long"  
  3.         mode="IN" />   
  4.       <parameter property="message" jdbcType="VARCHAR" javaType="java.lang.String"  
  5.         mode="OUT" />   
  6.    </parameterMap>   
  7.       
  8.     <procedure id="delEmp" parameterMap="delEmpMap">   
  9.        <![CDATA[{call delEmp(?,?)}]]>   
  10.     </procedure></SPAN>  
<span><parameterMap id="delEmpMap" class="java.util.Map">
	  <parameter property="empNo" jdbcType="NUMBER" javaType="java.lang.Long"
		mode="IN" />
	  <parameter property="message" jdbcType="VARCHAR" javaType="java.lang.String"
		mode="OUT" />
   </parameterMap>
   
	<procedure id="delEmp" parameterMap="delEmpMap">
       <![CDATA[{call delEmp(?,?)}]]>
	</procedure></span>

    對應的測試方法爲:

   

Java代碼  
  1. <SPAN>public void delEmpCallable(SqlMapClient sqlMapper)throws SQLException{   
  2.         Map params = new HashMap();   
  3.         params.put("empNo", 124L);   
  4.         params.put("message","");   
  5.         sqlMapper.update("test.delEmp",params);   
  6.         System.out.println(params.get("message"));   
  7.     }</SPAN>  
<span>public void delEmpCallable(SqlMapClient sqlMapper)throws SQLException{
		Map params = new HashMap();
		params.put("empNo", 124L);
		params.put("message","");
		sqlMapper.update("test.delEmp",params);
		System.out.println(params.get("message"));
	}</span>

    全文完。

     題外話:

     在測試的過程中,發現Mybatis在Number類型記錄不存在時候自動返回0,Ibatis直接報錯,不知道是不是Ibatis配置出錯了,另外,個人感覺Ibatis調用存儲過程應該有更簡潔的方法,歡迎各位指教,寫的不好的地方,請多包涵,另外,本文中的例子網上也要,個人只是把他們整合在一起。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章