mybatis调用sqlserver存储过程并接收return值

druid配置了wall过滤器导致无法执行多语句块。

整个过程记录如下,希望能帮助到你。如发现博文有问题,请在评论区留言。

存储过程示例如下:

create PROCEDURE [dbo].[p_test]
  
AS
BEGIN
     RETURN 1
END

解决方案应该是有两种:
1、关闭druid连接池wall过滤器

        #filters: stat,wall,slf4j
        filters: stat,slf4j

在这里插入图片描述
2、增加执行多语句块的支持(mysql可以直接再数据库连接上加&allowMultiQueries=true)

主要讲述一下尝试方案二过程中遇到的问题和最终的解决方案。

尝试过程中遇到的问题:
1、配置文件不变

Caused by: java.sql.SQLException: sql injection violation, dbType sqlserver, druid-version 1.2.8, multi-statement not allow : DECLARE @ReturnValue INT;

2、增加multi-statement-allow: true
有尝试直接修改druid.wall.multiStatementAllow=true未解决问题

Caused by: java.sql.SQLException: sql injection violation, dbType sqlserver, druid-version 1.2.8, class com.alibaba.druid.sql.ast.statement.SQLDeclareStatement not allow : DECLARE @ReturnValue INT;

3、继续增加none-base-statement-allow: true
获取到正常结果
在这里插入图片描述

总结一下,具体解决方案如下:

1、修改bootstrap.yml配置文件,增加如下配置

#dynamic 我这用了动态数据源,没有这一层可以去掉
spring:
 datasource:
   dynamic:
     druid:
       wall:
         none-base-statement-allow: true
         multi-statement-allow: true

2、mapper.xml 语句块定义如下

<select id="t"  resultType="java.lang.Long"> 
    DECLARE @ReturnValue INT; 
    EXEC @ReturnValue = p_test;
    SELECT @ReturnValue
</select>

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部