使用mybatis调用存储过程(注解形式和配置文件形式)

时间:2024-03-12 13:11:37

最近在看资料中涉及到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);

}*/

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

测试结果:

 

  方式二:使用配置文件形式

配置文件:

<?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);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

测试类同方式一,把注解去掉即可。

测试结果:

以上就是本人做的两数相加的测试结果,当时注解形式不知道怎么获取存储过程的结果,其实只需传入map参数,在注解里稍做修改就可以了(

#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER}

)

--------------------  完  -------------------