【Mybatis学习】Mybatis学习之调用Mysql存储过程(1传入2输出)

来源:互联网 发布:数据字典的编写方法 编辑:程序博客网 时间:2024/06/17 16:11

Mybatis调用MySql中的存储过程(1传入2输出)

1.定义存储过程

目标数据库表结构:

存储过程:直接用语句执行总出现错误,暂时没解决,大致如下:
CREATE OR REPLACE PROCEDURE findByUname(uname VARCHAR(255),OUT sid INT,OUT rname VARCHAR(255))BEGINSELECT id,real_name into sid,rnameFROM 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时的参数形式