MyBatis 接收存储过程多个结果集

发布于 2023-10-28 10:14:08 字数 3221 浏览 20 评论 0

MyBatis 可以非常方便地接收和使用存储过程返回的结果集。当你的存储过程返回多个结果集时,你需要在 MyBatis 的映射文件中(通常是一个 .xml 文件)为每个结果集创建一个 <resultMap> ,然后在 <select> 元素中通过 resultType 属性指定第一个结果集的映射。

以下是一个例子,假设你的存储过程返回两个结果集:

<select id="callMyStoredProcedure" statementType="CALLABLE" resultType="com.example.MyObject">
    {call my_stored_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=VARCHAR})}
</select>

<resultMap id="resultMapFirstSet" type="com.example.MyObject">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <!-- other mappings -->
</resultMap>

<resultMap id="resultMapSecondSet" type="com.example.OtherObject">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <!-- other mappings -->
</resultMap>

在上述代码中, callMyStoredProcedure 是调用存储过程的命令。这个映射指定了存储过程的名称和输入/输出参数。请注意 resultType 属性,它指定了第一个结果集的映射类型。

两个 <resultMap> 元素分别定义了两个结果集的映射。每一个 <resultMap> 定义了如何从数据库结果集中映射到你的 Java 对象。

然后在你的 Java 代码中,你可以像这样调用存储过程并处理结果:

String param1 = "some value";
CallableStatement stmt = conn.prepareCall("{call my_stored_procedure(?, ?)}", CallableStatement.RETURN_GENERATED_KEYS, Types.VARCHAR);
stmt.setString(1, param1);
stmt.registerOutParameter(2, Types.VARCHAR);
stmt.execute();

List<MyObject> resultSet1 = sqlSession.selectList("callMyStoredProcedure", param1);
List<OtherObject> resultSet2 = sqlSession.selectList("callMyStoredProcedure", param1);

在上述代码中,我们首先创建了一个 CallableStatement 并设置了输入参数。然后我们执行存储过程并获取返回的结果集。注意我们调用了两次 selectList ,分别指定了两个结果集的映射,从而获取了两个不同的结果集。


List<List<Map<String, Object>>> proc_qc_report_Summary_ErrKind_dept(@Param("hospCode") String hospCode,
  @Param("startDate") String startDate,
  @Param("endDate") String endDate,
  @Param("errorType") String errorType,
  @Param("dept") String dept,
  @Param("opCode") String opCode);
<?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="cn.uni.app.mapper.CardQualityInfoMapper">

    <resultMap type="java.util.HashMap" id="ares1"></resultMap>
    <resultMap type="java.util.HashMap" id="ares2"></resultMap>

<select id="proc_qc_report_Summary_ErrKind_dept" resultMap="ares1,ares2">
        <![CDATA[
          exec  proc_qc_report_Summary_ErrKind_dept
            #{hospCode,mode=IN,jdbcType=VARCHAR},
      #{startDate,mode=IN,jdbcType=TIMESTAMP},
      #{endDate,mode=IN,jdbcType=TIMESTAMP},
      #{errorType,mode=IN,jdbcType=TIMESTAMP},
      #{dept,mode=IN,jdbcType=TIMESTAMP},
      #{opCode,mode=IN,jdbcType=VARCHAR}
           ]]>
    </select>
</mapper>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文