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>
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » mybatis调用sqlserver存储过程并接收return值
发表评论 取消回复