最近在看资料中涉及到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 |
测试结果:
方式二:使用配置文件形式
配置文件:
|
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); } |
测试类同方式一,把注解去掉即可。
测试结果:
以上就是本人做的两数相加的测试结果,当时注解形式不知道怎么获取存储过程的结果,其实只需传入map参数,在注解里稍做修改就可以了(
#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER}
)
-------------------- 完 -------------------