mybatis調用存儲過程非常的方便,下面開始學習Mybatis/Ibatis 2如何調用Oracle的存儲過程。先學習一個簡單輸出文本的例子:
- <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>
<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調用配置如下:
- <SPAN><select id="testOutput" statementType="CALLABLE" parameterType="hashmap">
- <![CDATA[ {call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR})}]]>
- </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>
測試方法如下:
- <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>
<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配置如下:
- <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>
<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>
測試方法爲:
- <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>
<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:
- <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>
<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
- <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>
<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記錄的例子,對應的存儲過程爲:
- <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>
<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配置如下:
- <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>
<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>
測試方法爲:
- <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>
<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配置爲:
- <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>
<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測試方法爲:
- <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>
<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>
下面學習使用存儲過程進行普通的增刪改查操作,首先是新增,新建存儲過程
- <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>
<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配置如下:
- <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>
<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>
測試方法爲:
- <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>
<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配置爲:
- <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>
<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>
對應的測試方法爲:
- <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>
<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>
下面是修改,存儲過程如下:
- <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>
<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匹配爲:
- <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>
<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>
測試方法爲:
- <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>
<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配置爲:
- <SPAN><procedure id="updateEmp" parameterMap="empInfoMap">
- <![CDATA[{call updateEmp(?,?,?,?,?,?,?,?,?)}]]>
- </procedure></SPAN>
<span><procedure id="updateEmp" parameterMap="empInfoMap">
<![CDATA[{call updateEmp(?,?,?,?,?,?,?,?,?)}]]>
</procedure></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>
<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>
下面是查詢操作,存儲過程爲:
- <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>
<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配置爲:
- <SPAN><select id="getAllEmp" statementType="CALLABLE">
- <![CDATA[{call getAllEmp(#{empList,mode=OUT,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=enameMap})}]]>
- </select></SPAN>
<span><select id="getAllEmp" statementType="CALLABLE">
<![CDATA[{call getAllEmp(#{empList,mode=OUT,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=enameMap})}]]>
</select></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>
<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配置爲:
- <SPAN><procedure id="getEmps" parameterMap="searchParam" resultClass="bean.EmpBean">
- <![CDATA[{call getAllEmp(?)}]]>
- </procedure></SPAN>
<span><procedure id="getEmps" parameterMap="searchParam" resultClass="bean.EmpBean">
<![CDATA[{call getAllEmp(?)}]]>
</procedure></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>
<span>public void TestEmpListsCallable(SqlMapClient sqlMapper) throws SQLException {
List<EmpBean> list = sqlMapper.queryForList("test.getEmps");
for (EmpBean empBean : list) {
System.out.println(empBean);
}
}</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>
<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配置爲:
- <SPAN><delete id="delEmp" statementType="CALLABLE">
- {call delEmp(#{id},#{message,
- mode=OUT,javaType=string,jdbcType=VARCHAR})}
- </delete></SPAN>
<span><delete id="delEmp" statementType="CALLABLE">
{call delEmp(#{id},#{message,
mode=OUT,javaType=string,jdbcType=VARCHAR})}
</delete></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>
<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配置爲:
- <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>
<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>
對應的測試方法爲:
- <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>
<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調用存儲過程應該有更簡潔的方法,歡迎各位指教,寫的不好的地方,請多包涵,另外,本文中的例子網上也要,個人只是把他們整合在一起。