最近在看资料中涉及到mybatis,突然想到mysql中的视图、存储过程、函数。现将在使用mybatis调用mysql的存储过程使用总结下:
使用的环境:mybatis3.4.6,mysql 5.6,数据库视图工具sqlyog(可也以使用其他的),springboot
1、创建存储过程,代码如下
DROP PROCEDURE IF EXISTS add_; DELIMITER // CREATE PROCEDURE add_(IN a INT,IN b INT,OUT c INT) BEGIN SELECT a+b INTO c; END // |
2、测试:创建好存储过程add_后,执行以下语句,可以看到执行后的结果为8
SET @c = 0;
CALL add_(3,5,@c);
SELECT @c;
3、使用mybatis调用存储过程,这里有两种方式:
方式一:注解形式(不用写配置文件),使用注解形式,mybatis版本要3.4以上
package com.example.demo.dao;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.StatementType;
import java.util.Map;
@Mapper public interface CallMapper {
/** * 注解形式调用存储过程 * @param map */ @Select("call add_(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})") @Options(statementType=StatementType.CALLABLE) void callProcedure(@Param("map")Map map);
/** * 使用配置文件形式调用存储过程 * @param map */ // void callProcedure2(Map map); } |
测试类:
@RunWith(SpringRunner.class) @SpringBootTest public class CallMapperTest {
@Resource private CallMapper callMapper;
@Test public void testProcedure(){ Map<String,Object> map = new HashMap<>(); map.put("a",2); map.put("b",3); map.put("d",-1); callMapper.callProcedure(map); System.out.println(map); }
/*@Test public void testProcedure2(){ Map<String,Object> map = new HashMap<>(); map.put("a",2); map.put("b",3); map.put("c",-1); callMapper.callProcedure2(map); System.out.println(map);
}*/
} |
测试结果:
![](https://i-blog.csdnimg.cn/blog_migrate/dc0df3626bdfc9d612f5c937c4e1c6bf.png)
方式二:使用配置文件形式
配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.example.demo.dao.CallMapper" > <select id="callProcedure2" statementType="CALLABLE" parameterMap="paraMap" resultType="java.lang.Integer"> call add_(?,?,?) </select>
<parameterMap type="java.util.Map" id="paraMap"> <parameter property="a" mode="IN" jdbcType="INTEGER"/> <parameter property="b" mode="IN" jdbcType="INTEGER"/> <parameter property="c" mode="OUT" jdbcType="INTEGER"/> </parameterMap>
</mapper> |
mapper接口:
package com.example.demo.dao;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.StatementType;
import java.util.Map;
@Mapper public interface CallMapper {
/** * 注解形式调用存储过程 * @param map */ // @Select("call add_(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})") // @Options(statementType=StatementType.CALLABLE) // void callProcedure(@Param("map")Map map);
/** * 使用配置文件形式调用存储过程 * @param map */ void callProcedure2(Map map); } |
测试类同方式一,把注解去掉即可。
测试结果:
![](https://i-blog.csdnimg.cn/blog_migrate/5d9490c50229db36d23469539fdfa710.png)
以上就是本人做的两数相加的测试结果,当时注解形式不知道怎么获取存储过程的结果,其实只需传入map参数,在注解里稍做修改就可以了(
#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER}
)
-------------------- 完 -------------------