【Mybatis學習】Mybatis學習之調用Mysql存儲過程(1傳入2輸出)

Mybatis調用MySql中的存儲過程(1傳入2輸出)

1.定義存儲過程

目標數據庫表結構:

存儲過程:直接用語句執行總出現錯誤,暫時沒解決,大致如下:
CREATE OR REPLACE PROCEDURE findByUname(uname VARCHAR(255),OUT sid INT,OUT rname VARCHAR(255))
BEGIN
	SELECT 
		id,real_name into sid,rname
	FROM t_student 
	WHERE username = uname;
END
利用數據庫管理工具進行保存存儲過程結果如下:

2.Mybatis調用存儲過程

參數以Map形式傳入。添加CALLABLE屬性。
    <parameterMap id="map1" type="java.util.Map">
        <parameter property="uname" jdbcType="VARCHAR"  javaType="java.lang.String" mode="IN"/>
        <parameter property="sid"  jdbcType="INTEGER"  javaType="java.lang.Integer" mode="OUT"/>
        <parameter property="rname" jdbcType="VARCHAR"  javaType="java.lang.String" mode="OUT"/>
    </parameterMap>
    <select id="findByUname" parameterMap="map1" statementType="CALLABLE">
        <![CDATA[
          {call findByUname(?,?,?)}
        ]]>
    </select>

3.JAVA執行方法

Mapper接口方法:
void findByUname(Map<String,Object> map );
ServiceImpl:
public void findByUname(Map<String, Object> map) {
       studentDao.findByUname(map);
}
Controller:
        Map<String, Object> map = new HashMap<String,Object>();
        map.put("uname","1234");
        map.put("sid",null);
        map.put("rname","");
        studentService.findByUname(map);
        System.out.println(map.get("sid").toString()+"__"+map.get("rname"));
運行結果:


4.注意與總結

  1. 執行語句被CDATA包裹
  2. 傳入、傳出參數注意jdbcType類型需要與Mybatis中的typeHandler一致,否則報錯
  3. 傳入、傳出參數帶有mode屬性,可用IN、OUT、INOUT
  4. Mysql傳入、出的參數如果是VARCHAR需要附帶字段長度,否則報錯
  5. JAVA調用時注意傳入Map時的參數形式


發佈了54 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章