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时的参数形式