mybatis调用mysql存储过程(返回参数,单结果集,多结果集)

一、接收一个返回值

使用Map接收返回参数,output参数放在传入的param中

创建表

DROP TABLE IF EXISTS `demo`;
CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of demo
-- ----------------------------
INSERT INTO `demo` VALUES ('1', '测试');

创建存储过程

DROP PROCEDURE IF EXISTS pro;
CREATE PROCEDURE pro (
	IN userId INT,
	OUT userCount INT
)
BEGIN

DECLARE user_name VARCHAR (64);
SELECT NAME FROM demo WHERE id = userId INTO user_name;
INSERT INTO demo (NAME) VALUES (user_name);
SELECT COUNT(*) FROM demo INTO userCount;

END;

mapper.xml

<select id="procedureTest" parameterMap="pm" statementType="CALLABLE">
        CALL pro(#{userId,mode=IN},#{userCount,mode=OUT,jdbcType=INTEGER});
    </select>

    <parameterMap id="pm" type="java.util.Map">
        <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
        <parameter property="userCount" jdbcType="INTEGER" mode="OUT"></parameter>
    </parameterMap>

service

@Override
    public void procedureTest() {
        Map<String, Object> param = new HashMap<>();
        param.put("userId", "1");
        demoMapper.procedureTest(param);
        System.out.println("输出结果是:"+param.get("userCount"));
    }

输出结果

参数名不一定和存储过程一样,只和传参顺有关,使用下图配置同样可以获取结果

System.out.println("输出结果是:"+param.get("userCount_2"));

注意事项:

(来源:https://blog.csdn.net/hj7jay/article/details/75334581?utm_source=copy

1、  存储过程的参数和名称无关,只和顺序有关系

2、  存储过程的output参数,只能通过传入的map获取

3、  存储过程返回的结果集可直接用返回的map接收

4、  存储过程的return结果需要使用?=call procName(?,?)的第一个参数接收,需要指定对应的mode为OUT类型

5、  存储过程对应的数据类型为枚举类型,需要使用大写,如VARCHAR

output是在存储过程中的参数的返回值(输出参数),而ReturnValue是存储过程返回的值(使用return关键字),一个存储过程可以有任意多个依靠参数返回的值,但只有一个ReturnValue。

 

存储过程主要分成三类:

1、返回记录集的存储过程:执行结果是一个记录集,例如,从数据库中检索出符合某一个或几个条件的记录。

2、返回数值得的存储过程(也可称为标量存储过程),其执行完后返回一个值,例如数据库中执行一个有返回值的函数或命令。

3、行为存储过程,用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

二、接收list结果集

使用list接收

@Override
    public void procedureTest() {
        Map<String, Object> param = new HashMap<>();
        param.put("userId", "1");
        List<?> list = demoMapper.procedureTest(param);
        System.out.println("输出结果是:" + param.get("userCount_2"));
        System.out.println("输出集合:" + list.size());
    }
 <select id="procedureTest" parameterMap="pm" statementType="CALLABLE" resultMap="rm">
        CALL pro(#{userId,mode=IN},#{userCount_2,mode=OUT,jdbcType=INTEGER});
    </select>

    <parameterMap id="pm" type="java.util.Map">
        <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
        <parameter property="userCount_2" jdbcType="INTEGER" mode="OUT"></parameter>
    </parameterMap>

    <resultMap id="rm" type="com.csstj.srm.entity.procedureTestEntity">
        <result column="id" property="id"></result>
        <result column="name" property="userName"></result>
    </resultMap>

三、返回多个结果集

四、第二种配置也可以

CALL s_generatePlan_new (
#{organizationId, mode=IN,jdbcType=VARCHAR},
#{gradeId, mode=IN,jdbcType=VARCHAR},
#{semesterId, mode=IN,jdbcType=VARCHAR},
#{className, mode=IN,jdbcType=VARCHAR},
#{employeeCode, mode=IN,jdbcType=VARCHAR},
#{courseName, mode=IN,jdbcType=VARCHAR},
#{classroomName, mode=IN,jdbcType=VARCHAR},
#{approverId, mode=IN,jdbcType=VARCHAR},
#{createBy, mode=IN,jdbcType=VARCHAR},
#{total,mode=OUT ,jdbcType=VARCHAR})
  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在Spring Boot + MyBatis调用MySQL 8的存储过程,需要遵循以下步骤: 1. 在MySQL 8中创建存储过程。例如: ```sql CREATE PROCEDURE example_procedure(IN param1 VARCHAR(20), OUT result INT) BEGIN -- 存储过程主体 END; ``` 2. 在Spring Boot项目中引入MySQL 8的JDBC驱动和MyBatis框架的相关依赖。 3. 编写MyBatis的Mapper接口,用于调用存储过程。例如: ```java @Mapper public interface ExampleProcedureMapper { @Options(statementType = StatementType.CALLABLE) @Select("{CALL example_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{result, mode=OUT, jdbcType=INTEGER})}") void exampleProcedure(@Param("param1") String param1, @Param("result") Integer result); } ``` 其中,@Mapper注解用于标识该接口为MyBatis的Mapper接口,@Options注解用于设置SQL语句的类型为存储过程调用,@Select注解用于定义调用存储过程名称和参数列表。 4. 在Spring Boot的配置文件中配置数据源和MyBatis的相关配置。例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/example_db?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis相关配置 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity ``` 其中,url、username、password和driver-class-name分别为MySQL 8的连接信息,mapper-locations用于指定Mapper接口和SQL语句的XML文件位置,type-aliases-package用于指定实体类的包名。 5. 在代码中调用Mapper接口的方法,即可执行存储过程并获取返回值。例如: ```java @Service public class ExampleService { @Autowired private ExampleProcedureMapper exampleProcedureMapper; public Integer exampleProcedure(String param1) { Integer result = null; exampleProcedureMapper.exampleProcedure(param1, result); return result; } } ``` 其中,ExampleService为业务逻辑层的类,ExampleProcedureMapper为MyBatis的Mapper接口,exampleProcedure方法用于调用存储过程返回结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值