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

11 篇文章 1 订阅
2 篇文章 0 订阅

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>
### 回答1: 可以使用Mybatis的XML映射文件来调用SQL Server存储过程,具体步骤如下: 1. 在XML映射文件中声明存储过程: <select id="callMyProcedure" statementType="CALLABLE"> {call myProcedure(#{parameter1, mode=IN, jdbcType=VARCHAR}, #{parameter2, mode=OUT, jdbcType=VARCHAR})} </select> 2. 在对应的mapper接口中定义方法: public void callMyProcedure(String parameter1, String parameter2); 3. 在对应的mapper.xml文件中定义对应的SQL语句: <select id="callMyProcedure" statementType="CALLABLE" parameterType="map"> {call myProcedure(#{parameter1, mode=IN, jdbcType=VARCHAR}, #{parameter2, mode=OUT, jdbcType=VARCHAR})} </select> 4. 在Service层调用存储过程: @Autowired private MyMapper myMapper; public void callMyProcedure(String parameter1, String parameter2) { myMapper.callMyProcedure(parameter1, parameter2); } ### 回答2: 在Spring Boot中调用SQL Server存储过程,需要进行如下几个步骤。 首先,需要在pom.xml文件中添加依赖项,包括Spring Boot和MyBatis相关的依赖。 接下来,在Spring Boot的主配置文件application.properties或application.yml中,配置SQL Server数据库连接信息,包括数据库驱动类、数据库URL、用户名和密码等。 然后,创建一个用于访问数据库的Mapper接口,使用注解@Mapper标识该接口为MyBatis的Mapper接口,编写调用存储过程的方法。例如: @Mapper public interface MyMapper { @Select("EXECUTE your_procedure_name #{param1}, #{param2}") List<Map<String, Object>> callProcedure(@Param("param1") String param1, @Param("param2") int param2); } 在上述代码中,通过@Select注解指定了调用存储过程的SQL语句,通过#{}占位符传入参数。 最后,在Service或Controller层中注入Mapper接口,调用存储过程的方法,获取返回结果。例如: @Autowired private MyMapper myMapper; public List<Map<String, Object>> callProcedure(String param1, int param2) { return myMapper.callProcedure(param1, param2); } 通过以上步骤,我们就可以在Spring Boot项目中成功调用SQL Server存储过程了。当然,在实际项目中,可能还需要做一些异常处理、日志记录等额外的工作,以保证代码的健壮性和可靠性。 ### 回答3: 在Spring Boot中使用MyBatis调用SQL Server存储过程,可以按照以下步骤进行操作: 第一步,首先在Spring Boot项目的pom.xml文件中添加MyBatis和SQL Server的依赖。 ``` <dependencies> ... <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.2.0.jre11</version> </dependency> ... </dependencies> ``` 第二步,创建数据库连接配置文件application.properties,配置SQL Server的连接信息。 ``` spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=your_database_name spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver ``` 第三步,创建存储过程对应的实体类和Mapper接口。假设有一个存储过程名为"procedure_name",实体类名为"ProcedureEntity",Mapper接口名为"ProcedureMapper"。 ProcedureEntity.java ```java public class ProcedureEntity { private String param1; private int param2; // 省略getter和setter方法 } ``` ProcedureMapper.java ```java public interface ProcedureMapper { @Options(statementType = StatementType.CALLABLE) @Select("{call procedure_name(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=IN, jdbcType=INTEGER})}") void callProcedure(ProcedureEntity entity); } ``` 第四步,使用@Autowired注解将ProcedureMapper注入到需要调用存储过程的类中。 ```java @Autowired private ProcedureMapper procedureMapper; ``` 第五步,通过调用ProcedureMapper中的方法来执行存储过程。 ```java ProcedureEntity entity = new ProcedureEntity(); entity.setParam1("value1"); entity.setParam2(2); procedureMapper.callProcedure(entity); ``` 通过以上步骤,我们就可以在Spring Boot中使用MyBatis调用SQL Server存储过程了。根据实际情况,需要调整存储过程的参数和输出结果对应的实体类和Mapper接口中的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值