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

本文介绍如何使用MyBatis调用SQL Server存储过程,包括处理输入参数、输出参数及返回结果集的方法,并提供了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程:

use base_passport

go

 

create proc yhj_test

    @input_a int,

    @input_b int,

    @output_c int out

as

begin

    select * from config.city;

    set @output_c = @input_a*@input_b;

    return @input_a+@input_b;

end

 

Mybats配置:

    <resultMap type="java.util.HashMap" id="resultMap">

       <result column="city_key" property="cityKey"javaType="java.lang.Integer" jdbcType="INTEGER"/>

       <result column="province_key" property="provinceKey"javaType="java.lang.Integer" jdbcType="INTEGER"/>

       <result column="city_name" property="cityName"javaType="java.lang.String" jdbcType="VARCHAR"/>

    </resultMap>

   

    <select id="testByProc" statementType="CALLABLE"parameterType="java.util.HashMap" resultMap="resultMap">

       <![CDATA[

           {#{d,mode=OUT,jdbcType=INTEGER}=call dbo.yhj_test(

              #{a,mode=IN,jdbcType=INTEGER},

              #{b,mode=IN,jdbcType=INTEGER},

              #{c,mode=OUT,jdbcType=INTEGER}

           )}    

       ]]>

    </select>

 

Java代码

Map<String, Object> paramMap = new HashMap<String, Object>();

       paramMap.put("a", 2);

       paramMap.put("b", 3);

       List<City> citys = (List<City>) getTemplate().selectList(getNameSpaceAndMethod("testByProc"), paramMap);

       return citys;

通过以上代码我们即可获取对应的结果集,return参数和output参数。其中return参数和output参数放在传入的paramMap中,运行结果如下:

 

c是存储过程的output参数,而dreturn参数。

需要注意的事项:

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

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

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

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

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

 

### 如何在 Spring Boot 中调用 SQL Server 的存储过程并以 Map 形式返回结果 在 Spring Boot 应用程序中,可以通过多种方式调用 SQL Server 的存储过程并将结果作为 `Map` 返回。以下是基于 MyBatis 原生 JdbcTemplate 的两种常见方法。 #### 方法一:使用 MyBatis 调用存储过程返回 Map 结果 MyBatis 提供了灵活的方式来处理存储过程结果。通过定义 Mapper 接口中的方法以及配置 XML 文件,可以轻松实现这一目标。 ##### 1. 定义 Mapper 接口 ```java @Mapper public interface BigScreenJobMapper { @Options(statementType = StatementType.CALLABLE) void proHbjtFund(@Param("map") Map<String, Object> map); } ``` ##### 2. 实现逻辑代码 在服务层或控制器中调用该方法,并从传入的 `Map` 获取返回值。 ```java @Service public class StorageProcedureService { @Autowired private BigScreenJobMapper bigScreenJobMapper; public Map<String, Object> callStoredProcedure(Map<String, Object> inputParams) { bigScreenJobMapper.proHbjtFund(inputParams); // 执行存储过程 String result = (String) inputParams.get("result"); // 获取返回值 return Collections.singletonMap("output", result); // 将结果封装到新的 Map 中 } } ``` 上述代码展示了如何通过 MyBatis 调用存储过程,并将输出参数存入输入 `Map` 中[^2]。 --- #### 方法二:使用 JdbcTemplate 调用存储过程返回 Map 结果 如果不想依赖第三方框架(如 MyBatis),可以直接利用 Spring JDBC 提供的功能完成此操作。 ##### 1. 使用 SimpleJdbcCall 处理存储过程 Spring JDBC 提供了一个名为 `SimpleJdbcCall` 的工具类,用于简化存储过程调用流程。 ###### 示例代码: ```java @Configuration public class DataSourceConfig { @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean public SimpleJdbcCall simpleJdbcCall(JdbcTemplate jdbcTemplate) { return new SimpleJdbcCall(jdbcTemplate).withProcedureName("your_stored_procedure_name"); } } @Service public class StoredProcedureService { @Autowired private SimpleJdbcCall simpleJdbcCall; public Map<String, Object> executeStoredProcWithOutput(String paramValue) { SqlParameterSource in = new MapSqlParameterSource() .addValue("input_param", paramValue); Map<String, Object> resultMap = simpleJdbcCall.execute(in); // 调用存储过程 return resultMap; } } ``` 在此示例中,`execute()` 方法会自动解析存储过程的输出参数,并将其放入返回的 `Map` 中[^1]。 --- #### 方法三:动态构建 SQL 并执行存储过程存储过程名称及其参数可能变化时,可以选择动态拼接 SQL 字符串的方式。这种方式更加灵活,但也需要注意安全性问题(如防止 SQL 注入攻击)。 ###### 示例代码: ```java @Service public class DynamicStoredProcedureService { @Autowired private JdbcTemplate jdbcTemplate; public Map<String, Object> dynamicExecuteStoredProc(Map<String, Object> params) throws Exception { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("EXEC ").append(params.get("method")).append(" "); int size = params.size() - 1; // 假设第一个键为 method int index = 0; for (Map.Entry<String, Object> entry : params.entrySet()) { if (!entry.getKey().equals("method")) { if (index++ != 0) { sqlBuilder.append(", "); } if (StringUtils.isEmpty(entry.getValue())) { sqlBuilder.append("NULL"); } else { sqlBuilder.append("'").append(entry.getValue()).append("'"); } } } List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sqlBuilder.toString()); return resultList.stream().findFirst().orElse(Collections.emptyMap()); // 如果有多个结果,则取第一条记录 } } ``` 这段代码实现了动态生成 SQL 并调用存储过程的功能[^4]。 --- ### 总结 以上三种方法分别适用于不同的场景需求: - **MyBatis 方式**适合已有复杂业务逻辑且希望保持代码简洁的情况; - **JdbcTemplate/SimpleJdbcCall 方式**更适合轻量级项目或者不需要额外引入外部库的情形; - **动态 SQL 构建方式**则提供了更高的灵活性,但需注意潜在的安全隐患。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值