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

)

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

使用mybatis调用存储过程(注解形式和配置文件形式)的更多相关文章

  1. MyBatis基础:MyBatis调用存储过程(6)

    1. 存储过程准备 CREATE PROCEDURE sp_task ( IN userId INT ) BEGIN SELECT * FROM task WHERE user_id = userId ...

  2. Mybatis调用存储过程报错

    Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...

  3. mybatis调用存储过程(@Select方式)

    存储过程还不会写的同学可以参考我另一篇文章:https://www.cnblogs.com/liuboyuan/p/9375882.html 网上已经有很多用mybatis调用的教程了,但是大部分是x ...

  4. 关于用mybatis调用存储过程时的入参和出参的传递方法

    一.问题描述 a)         目前调用读的存储过程的接口定义一般是:void  ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...

  5. mybatis 调用存储过程 返回游标 实例

    存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...

  6. MyBatis——调用存储过程

    原文:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 ...

  7. Mybatis 调用存储过程,使用Map进行输入输出参数的传递

    做个记录,以备后用 java代码: public String texuChange() throws Exception {        try {                         ...

  8. mybatis调用存储过程,获取返回的游标

    将调用存储过程参数放入map中,由于返回的游标中包含很多参数,所以再写一个resultmap与之对应,类型为hashmap.设置返回的jdbcType=CURSOR,resultMap设置为id对应的 ...

  9. MyBatis调用存储过程,含有返回结果集、return参数和output参数

    Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...

随机推荐

  1. 基于PI+QT实现OpenCV图像处理操作(基本环境搭建)

    这篇博客就是在PI上直接写出来的!cheers!! PI3的性能已经非常强劲,而作为一个能够独立运行的运算单元,使用它来做图像处理,将是非常适合的.为了挖掘机器的最大潜能,我没有采用比较常见的pyth ...

  2. [LspTrace]ReadAccConfig returns false! QT

    当qt运行出现以下信息时 [LspTrace]ReadAccConfig returns false! [LspTrace]FindMatchingProvider: inInfo is one of ...

  3. iOS开发 -------- transform属性(形变)

      一 transform属性 在OC中,通过transform属性可以修改对象的平移,比例和旋转角度 常用的创建transform结构体的方法分两大类 (1) 创建"基于控件初始位置&qu ...

  4. flutter登录页部分内容

    import 'package:flutter/material.dart'; class MyIdPage extends StatelessWidget { @override Widget bu ...

  5. 第十届蓝桥杯2019年C/C++ 大学B组省赛试题

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  6. P3649 [APIO2014]回文串

    思路 回文自动机 回文自动机的fail[i]就是编号为i的这个字符串的最长的回文后缀的编号,然后len[i]表示编号为i的回文串的长度,cnt[i]表示编号为i的回文串的出现次数 然后trans边就是 ...

  7. 同事在使用shiro后遇到的异常

    一切配置按照demo来的,给他讲了一遍捋顺了.然后之前他做的demohim按照他网络摘抄的shiro博客看的. 然后注册了,正常,登录,提示密码不匹配. 问题出在注册的密码加密次数是2, 而shiro ...

  8. springboot2.0 最大上传文件大小遇到的错误Failed to bind properties under 'spring.servlet.multipart.max-file-size'

    错误: 解决: 把100Mb改为100MB

  9. C# --- ??(空接合操作符)的一个案例

    Nullable<Int32> x = null; Nullable<Int32> y = null; Nullable<Int32> z = null; Int3 ...

  10. 安装Go插件遇到的问题及解决方法

    1. 问题:在 Windows 平台下使用 go get 安装sqlite3 驱动时报错 The remote end hung up unexpectedly ? 原因及解决方法: 原因可能有两种: ...