• Mybatis-Plus 通过 Map 接收多个结果集


    效果

    1、结果集的大小代表返回多少个数据表记录,例如在存储过程中有两个 SELECT * 语句,则结果集大小为 2 。

    2、结果集中的每一个数据表作为一个 List,每一条记录为一个 Object 泛型。

    3、存储过程中输出的参数 Msg Out 也可以通过 Map 读取。

    数据表

    1. # use Mysql 8.0
    2. CREATE TABLE `TestUser` (
    3. `id` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    4. `username` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    5. PRIMARY KEY (`id`) USING BTREE
    6. )
    7. COLLATE='utf8mb4_0900_ai_ci'
    8. ENGINE=InnoDB
    9. ;
    10. CREATE TABLE `TestRight` (
    11. `id` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    12. `userId` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    13. `userRight` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    14. PRIMARY KEY (`id`) USING BTREE
    15. )
    16. COLLATE='utf8mb4_0900_ai_ci'
    17. ENGINE=InnoDB
    18. ;

    1、创建用户表

    2、创建用户权限表

    3、往数据表写入模拟数据

    存储过程

    1. CREATE DEFINER=`root`@`%` PROCEDURE `MyBatisTestPro`(
    2. IN `UserId` VARCHAR(50),
    3. OUT `Msg` VARCHAR(50)
    4. )
    5. LANGUAGE SQL
    6. NOT DETERMINISTIC
    7. CONTAINS SQL
    8. SQL SECURITY DEFINER
    9. COMMENT '返回多个结果集'
    10. BEGIN
    11. SELECT * FROM `demo`.`TestRight` WHERE userId = UserId;
    12. SELECT * FROM `demo`.`TestUser` WHERE id = UserId;
    13. SELECT 'OK' INTO Msg;
    14. END

    1、返回用户信息

    2、返回用户权限信息

    3、返回响应参数 Msg

    主要 POM 依赖

    1. <dependency>
    2. <groupId>org.mybatis.spring.boot</groupId>
    3. <artifactId>mybatis-spring-boot-starter</artifactId>
    4. <version>2.2.2</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.baomidou</groupId>
    8. <artifactId>mybatis-plus</artifactId>
    9. <version>3.4.3.1</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>mysql</groupId>
    13. <artifactId>mysql-connector-java</artifactId>
    14. <version>8.0.17</version>
    15. </dependency>

    1、mybatis-plus 启动依赖和核心依赖

    2、mysql 依赖

    yml 配置

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://localhost:3307/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    4. username: root
    5. password: 123456789
    6. driver-class-name: com.mysql.cj.jdbc.Driver
    7. mybatis:
    8. mapper-locations: classpath:mapper/*.xml

    1、配置数据源

    2、配置 mybatis 映射文件

    MybatisConfig

    1. package com.example.demo.config;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.context.annotation.Configuration;
    4. @Configuration
    5. @MapperScan("com.example.demo.dao")
    6. public class MybatisConfig {
    7. }

    1、扫描 mapper 文件

    Mapper

    1. package com.example.demo.dao;
    2. import org.apache.ibatis.annotations.Mapper;
    3. import java.util.List;
    4. import java.util.Map;
    5. @Mapper
    6. public interface TestDao {
    7. /**
    8. * 调用 SP 测试,通过 List 接收多个结果集
    9. * 外层List代表有 N 个结果集
    10. * 里层List代表第 X 个结果集有 M 条数据
    11. * ?代表泛型,按 Object 接收,可以替换成 Map
    12. * @param map
    13. * @return
    14. */
    15. List>> sptest(Map map);
    16. }

    1、测试 SP 接口

    XML

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.example.demo.dao.TestDao">
    4. <resultMap id="Map1" type="java.util.HashMap">
    5. resultMap>
    6. <resultMap id="Map2" type="java.util.HashMap">
    7. resultMap>
    8. <select id="sptest" resultType="java.util.List" resultMap="Map1,Map2" parameterType="Map" statementType="CALLABLE" >
    9. {CALL MyBatisTestPro(#{UserId,mode=IN,jdbcType=VARCHAR},#{Msg,mode=OUT,jdbcType=VARCHAR})}
    10. select>
    11. mapper>

    1、调用存储过程,注意结果集由 HashMap 接收 ,多个结果集则需要多个 Map 接收

    2、注意传入参数为 Map ,通过 key value 键值对去匹配存储过程的参数

    3、注意 statementType 为 CALLABLE 表明调用的是存储过程

    4、对于存储过程的参数需要指定 mode 为 IN 还是为 OUT

    ServiceImpl

    1. package com.example.demo.service.impl;
    2. import com.example.demo.dao.TestDao;
    3. import com.example.demo.service.TestService;
    4. import com.example.demo.utils.JacksonUtil;
    5. import org.springframework.stereotype.Service;
    6. import javax.annotation.Resource;
    7. import java.io.IOException;
    8. import java.nio.charset.StandardCharsets;
    9. import java.nio.file.Files;
    10. import java.nio.file.Paths;
    11. import java.time.LocalDateTime;
    12. import java.util.ArrayList;
    13. import java.util.HashMap;
    14. import java.util.List;
    15. import java.util.Map;
    16. @Service("testService")
    17. public class TestServiceImpl implements TestService {
    18. @Resource
    19. private TestDao testDao;
    20. @Override
    21. public void testsp() throws IOException {
    22. System.out.println(LocalDateTime.now().toString());
    23. Map map = new HashMap();
    24. map.put("UserId", "51fce378-4e93-11ed-b86f-0242ac110002");
    25. System.out.println("===> 执行存储过程:" + LocalDateTime.now().toString());
    26. List>> sptest = testDao.sptest(map);
    27. System.out.println("===> 结果集大小:" + sptest.size());
    28. System.out.println("结果集:");
    29. for (List> objects : sptest) {
    30. //System.out.println(JacksonUtil.toJsonString(objects));
    31. if (objects.size() > 1) {
    32. for (Map obj : objects) {
    33. System.out.println(JacksonUtil.toJsonString(obj));
    34. }
    35. }
    36. }
    37. System.out.println("===> 通用响应参数");
    38. System.out.println("Msg :" + map.get("Msg").toString());
    39. }
    40. }

    1、存储过程参数 UserID 由 Map 传入

    2、参数类型为 Out 的不需要显示声明,在执行完存储过程后,可直接从 Map 中获取返回值

    使用 SQL SERVER

    SP

    1. SET QUOTED_IDENTIFIER ON
    2. SET ANSI_NULLS ON
    3. GO
    4. CREATE PROCEDURE MyBatisTestSP
    5. @UID varchar(50),@Res varchar(50) OUT,@Msg varchar(50) OUT
    6. AS
    7. SET NOCOUNT ON;
    8. SELECT * FROM TestUser WHERE UserName = @UID
    9. SELECT * FROM TestRight WHERE UserName = @UID
    10. SELECT @Res = 'OK',@Msg = '=> OK'
    11. GO

    POM

    1. com.microsoft.sqlserver
    2. sqljdbc4
    3. 4.0

    1、新增 sql server 依赖

    yml 

    1. spring:
    2. datasource:
    3. url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestDB
    4. username: root
    5. password: root
    6. driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    7. mybatis:
    8. mapper-locations: classpath:mapper/*.xml

    XML

  • 相关阅读:
    kafka-生产者源码解析
    让代码变美的第一天 - 观察者模式
    独孤思维:不要计较眼前得失,因为你会失去更多
    使用了lua-resty-http库进行 爬虫
    【UE】刀光粒子效果——part2 材质函数部分
    CRDB-事务层知识点
    Android Compose 入门,深入底层源码分析
    Django DRF 自动生成接口文档
    Python快速刷题网站——牛客网 数据分析篇(十)
    为什么拖拽式表单设计器受欢迎?
  • 原文地址:https://blog.csdn.net/weixin_47560078/article/details/127384685