【mybatis】mybatis调用sqlserver存储过程和表值函数

本文详细解析了存储过程和表值函数的区别,重点强调了两者在MyBatis调用方式上的不同。存储过程以pr开头,通常用于执行复杂的数据库操作并返回单一结果;而表值函数以fn开头,主要用来返回表结构的数据集。文章还提供了具体的XML配置示例,展示了如何在MyBatis中正确调用这两种数据库对象。

存储过程和表值函数的区别

最简单的区别是存储过程是pr开头的,而存储过程是fn开头的,表值函数返回的是一个表结构的结果。如果mybatis用调用存储过程的方式去调用表值函数,就会抛出以下的异常:

exception:不能调用'xxxxx',因为'xxxx'是表值函数对象。

调用存储过程

如果要调用一个叫做“pr_test_a”的存储过程,需要传入参数并且有返回值。如下所示,resultMap中存的是返回值的字段名和类型,在select中调用存储过程,传入对应的参数

<resultMap type="java.util.HashMap" id="resultMap">
	<result column="id" property="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
	<result column="code" property="code" javaType="java.lang.String" jdbcType="VARCHAR"/>
	<result column="name" property="name" javaType="java.lang.String" jdbcType="VARCHAR"/>
	<result column="modified_time" property="modifiedTime" javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"/>
</resultMap>

<select id="selectA" parameterType="java.util.HashMap" statementType="CALLABLE" resultMap="resultMap">
	{
    	call pr_test_a(
    	#{id,mode=IN,jdbcType=INTEGER},
    	#{card_no,mode=IN,jdbcType=VARCHAR}
	}
</select>

调用表值函数

就当做一张表来查询即可。如调用一个表值函数fn_test_b,返回结果到resultMap中。

<resultMap type="java.util.HashMap" id="resultMap">
    <result column="fullid" property="fullid" javaType="java.lang.String" jdbcType="VARCHAR"/>
    <result column="seq" property="seq" javaType="java.lang.String" jdbcType="VARCHAR"/>
    <result column="material_id" property="materialId" javaType="java.lang.Integer" jdbcType="INTEGER"/>
</resultMap>

<select id="fn_bom_decomposition" parameterType="java.util.HashMap" resultMap="resultMap">
    select * from fn_test_b(
        #{material_id,mode=IN,jdbcType=INTEGER},
        #{quantity,mode=IN,jdbcType=NUMERIC},
        #{start_time,mode=IN,jdbcType=TIMESTAMP}
    )
</select>
### 调用 SQL Server 存储过程MyBatis调用 SQL Server 的存储过程可以通过配置 `mapper` 文件来实现。为了成功执行并处理来自数据库的结果,需遵循特定的语法结构。 #### 配置 Mapper XML 文件 创建或编辑相应的 `mapper.xml` 文件以定义如何调用存储过程: ```xml <mapper namespace="com.example.BigScreenJobMapper"> <!-- 定义参数类型 --> <parameterMap id="proHbjtFundParams" type="java.util.Map"> <parameter property="paramName" javaType="String" jdbcType="VARCHAR"/> <parameter property="result" mode="OUT" javaType="String" jdbcType="VARCHAR"/> </parameterMap> <!-- 使用 call 语句调用存储过程 --> <select id="callProHbjtFund" parameterMap="proHbjtFundParams" statementType="CALLABLE"> { CALL pro_hbjt_fund(#{paramName}, #{result,mode=OUT,jdbcType=VARCHAR}) } </select> </mapper> ``` 上述代码展示了如何设置输入输出参数以及指定要调用的具体存储过程名称[^1]。 #### Java 接口方法声明 对应于上面的 XML 映射器,在接口类中添加相应的方法签名: ```java public interface BigScreenJobMapper { void callProHbjtFund(Map<String, Object> params); } ``` 此方法接受一个包含所有必要参数的地图作为其唯一参数,并且不返回任何值因为结果是从 OUT 参数获得[^4]。 #### 获取返回值 当从应用程序层面调用了这个映射函数之后,就可以像下面这样访问由存储过程产生的输出数据了: ```java // 准备传给存储过程的数据 Map<String, Object> map = new HashMap<>(); map.put("paramName", "someValue"); // 执行存储过程 bigScreenJobMapper.callProHbjtFund(map); // 取得存储过程中设定的结果 String result = (String) map.get("result"); System.out.println(result); ``` 这段程序片段说明了怎样准备输入参数、触发存储过程及其后的结果检索操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值