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