Java mybatis sqlserver存储过程

1 篇文章 0 订阅
1 篇文章 0 订阅

之前一直没有用mybatis调过sqlserver的存储过程,今天抽时间写代码测试了下。

首先在sqlserver建存储过程(简单的写个测试存储过程,输入两个参数,返回查询列表数据):

create PROCEDURE [dbo].[testPro]  
 @sc VARCHAR(20),   -----输入基金代码 
 @EndDate DATETIME  -----输入日期
AS  
BEGIN  
  
select s.SecuCode,s.SecuAbbr,t.EndDate,t.StatisticInterval,t.StockPickingAbility from MFE_FundRatingValueNew t,SecuMain s where t.InnerCode = s.InnerCode
and s.SecuCategory in (8,13) and s.SecuCode = @sc  and t.EndDate = @EndDate

END

然后在mybatis中的mapper映射文件中加入调用sqlserver存储过程的逻辑:

<select id="getFundTest" parameterMap="ParaMap_test" statementType="CALLABLE" resultMap="ResultMap_test,ResultMap_test2">
        {call testPro(#{sc},#{EndDate})}
	</select>
	<parameterMap type="hashmap" id="ParaMap_test">
        <parameter property="sc"   mode="IN"      javaType="java.lang.String"     jdbcType="VARCHAR"/>
        <parameter property="EndDate"   mode="IN"     javaType="java.lang.String"     jdbcType="VARCHAR"/>
    </parameterMap>
     <resultMap type="hashmap" id="ResultMap_test">
         <result property="fundCode"   column="SecuCode"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="fundName"   column="SecuAbbr"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="endDate"   column="EndDate"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="statisticInterval"   column="StatisticInterval"   javaType="java.lang.Integer"    jdbcType="INTEGER" />
         <result property="stockPickingAbility"   column="StockPickingAbility"   javaType="java.lang.Float"    jdbcType="FLOAT" />
     </resultMap>

select标签中parameterMap为入参map,对应id="ParaMap_test"这个集合,包括两个参数sc和EndDate;statementType="CALLABLE"为固定写法,表明是调用存储过程;resultMap="ResultMap_test"表示执行存储过程返回的结果集,对应id="ResultMap_test"这个集合,集合中包括五个参数,对应存储过程中查询结果集的五列数据; {call testPro(#{sc},#{EndDate})}为调用存储过程的语句,sc和EndDate为入参。

如果存错过程需要返回多个查询结果集,可以再resultMap中加多个返回map,下面测试下。首先修改下存储过程:

alter PROCEDURE [dbo].[testPro]  
 @sc VARCHAR(20),   -----输入基金代码
 @EndDate DATETIME  -----输入日期
AS  
BEGIN  
  
select s.SecuCode,s.SecuAbbr,t.EndDate,t.StatisticInterval,t.StockPickingAbility from MFE_FundRatingValueNew t,SecuMain s where t.InnerCode = s.InnerCode
and s.SecuCategory in (8,13) and s.SecuCode = @sc  and t.EndDate = @EndDate

select s.SecuCode,s.SecuAbbr,t.EndDate,t.StatisticInterval,t.DownBeta from MFE_FundRatingValueNew t,SecuMain s where t.InnerCode = s.InnerCode
and s.SecuCategory in (8,13) and s.SecuCode = @sc  and t.EndDate = @EndDate
  
END

其中增加了另外一个查询语句:

然后修改mybatis映射文件:

<select id="getFundTest" parameterMap="ParaMap_test" statementType="CALLABLE" resultMap="ResultMap_test,ResultMap_test2">
        {call testPro(#{sc},#{EndDate})}
	</select>
	<parameterMap type="hashmap" id="ParaMap_test">
        <parameter property="sc"   mode="IN"      javaType="java.lang.String"     jdbcType="VARCHAR"/>
        <parameter property="EndDate"   mode="IN"     javaType="java.lang.String"     jdbcType="VARCHAR"/>
    </parameterMap>
     <resultMap type="hashmap" id="ResultMap_test">
         <result property="fundCode"   column="SecuCode"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="fundName"   column="SecuAbbr"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="endDate"   column="EndDate"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="statisticInterval"   column="StatisticInterval"   javaType="java.lang.Integer"    jdbcType="INTEGER" />
         <result property="stockPickingAbility"   column="StockPickingAbility"   javaType="java.lang.Float"    jdbcType="FLOAT" />
     </resultMap>
     <resultMap type="hashmap" id="ResultMap_test2">
         <result property="fundCode"   column="SecuCode"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="fundName"   column="SecuAbbr"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="endDate"   column="EndDate"   javaType="java.lang.String"    jdbcType="VARCHAR" />
         <result property="statisticInterval"   column="StatisticInterval"   javaType="java.lang.Integer"    jdbcType="INTEGER" />
         <result property="downBeta"   column="DownBeta"   javaType="java.lang.Float"    jdbcType="FLOAT" />
     </resultMap>

select标签下的resultMap的值调整成"ResultMap_test,ResultMap_test2",增加了一个返回结果集,并在下面添加了这个集合

至此mybatis的映射文件已经书写完毕,下面把dao/service/controller层代码也列出来。首先是dao层:

package com.shjj.dao;

import java.util.List;
import java.util.Map;

public interface SqlServerDao {
	/**
	 * 测试存储过程
	 */
	List<Map<String,Object>> getFundTest(Map<String,Object> parameter);
}

然后是,service层:

package com.shjj.service;

import java.util.Map;

public interface ISqlServerService {
	/**
	 * 测试存储过程
	 */
	Object getFundTest(Map<String,Object> parameter);
}
package com.shjj.serviceimpl;

import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.shjj.config.datasource.TargetDataSource;
import com.shjj.dao.SqlServerDao;
import com.shjj.result.GlobalErrorInfoEnum;
import com.shjj.result.ResultBody;
import com.shjj.service.ISqlServerService;

@Service
public class SqlServerServiceImpl implements ISqlServerService {
	private Logger log =LoggerFactory.getLogger(FundServiceImpl.class);
	
	@Autowired
	private SqlServerDao sqlServerDao;
	
	@Override
	@TargetDataSource("ds1")
	public Object getFundTest(Map<String, Object> parameter) {
		// TODO Auto-generated method stub
		return sqlServerDao.getFundTest(parameter);
	}

}

最后是controller层:

package com.shjj.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONArray;
import com.shjj.result.GlobalErrorInfoEnum;
import com.shjj.result.GlobalErrorInfoException;
import com.shjj.service.IFundService;
import com.shjj.service.ISqlServerService;
import com.shjj.util.Util;

/**
 * @author GongSizhen
 * @Description 基金相关请求入口
 * @date 2021年3月10日下午2:26:37
 */
@RestController
@CrossOrigin
public class FundController {
	
	private Logger log =LoggerFactory.getLogger(FundController.class);
	
	@Autowired
	ISqlServerService sqlServerService;
	
	/**
	 * 存储过程测试
	 */
	@SuppressWarnings("rawtypes")
	@RequestMapping("/app/fundTest")
	public Object queryFundTest(HttpServletRequest req){
		String sc = req.getParameter("fundCode");
		String EndDate = req.getParameter("endDate");
		Map<String,Object> param = new HashMap<>();
		param.put("sc", sc);
		param.put("EndDate", EndDate);
		return sqlServerService.getFundTest(param);
	}
	
}

上面就是所有的代码,启动服务后,浏览器中输入地址:http://127.0.0.1/app/fundTest?fundCode=000001&endDate=20190630,可以正常返回接口数据:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以给你一些建议:首先,确保你的SpringBoot项目已经正确配置了MyBatisSQLServer的依赖;其次,使用MyBatis的`SqlSession.getMapper()`方法获取Mapper接口,然后调用Mapper接口中定义的存储过程方法。 ### 回答2: Spring Boot是一个开源的Java开发框架,而MyBatis是一个轻量级的持久化框架,可以与Spring Boot框架无缝集成。要在Spring Boot项目中调用SQL Server存储过程,可以按照以下步骤进行操作: 1. 在Spring Boot项目的pom.xml文件中添加对MyBatis和SQL Server驱动的依赖,例如: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.2.2.jre8</version> </dependency> ``` 2. 在application.properties或application.yml文件中配置SQL Server的连接信息,例如: ```yaml spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=mydatabase spring.datasource.username=sa spring.datasource.password=yourpassword spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver ``` 3. 创建一个可以调用存储过程的Mapper接口,例如: ```java @Mapper public interface MyProcedureMapper { @Options(statementType = StatementType.CALLABLE) @Select("{CALL my_procedure(#{param1, mode=IN})}") void callMyProcedure(@Param("param1") String param1); } ``` 4. 在需要调用存储过程的地方注入Mapper接口,并调用对应的方法,例如: ```java @Service public class MyService { @Autowired private MyProcedureMapper myProcedureMapper; public void doSomething() { myProcedureMapper.callMyProcedure("parameter value"); } } ``` 通过以上步骤,就可以在Spring Boot项目中调用SQL Server存储过程了。需要注意的是,根据实际情况修改SQL Server的连接信息和存储过程的调用方式。 ### 回答3: Spring Boot结合MyBatis调用SQL Server存储过程需要进行以下步骤: 1. 首先,在Spring Boot的pom.xml文件中引入MyBatis和SQL Server的驱动依赖: ```xml <dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!-- SQL Server --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.2.2.jre8</version> </dependency> </dependencies> ``` 2. 在Spring Boot的application.properties文件中配置SQL Server数据库连接信息: ```properties 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 ``` 3. 创建XML映射文件,配置调用存储过程的SQL语句。假设存储过程名称为"YourStoredProcedure",并且有一个输入参数"param1"和一个输出参数"param2": ```xml <!-- YourMapper.xml --> <mapper namespace="com.example.mapper.YourMapper"> <select id="callStoredProcedure" statementType="CALLABLE"> {call YourStoredProcedure(#{param1, mode=IN}, #{param2, mode=OUT, jdbcType=VARCHAR})} </select> </mapper> ``` 4. 创建接口YourMapper.java,定义调用存储过程的方法: ```java // YourMapper.java package com.example.mapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface YourMapper { void callStoredProcedure(@Param("param1") String param1, @Param("param2") String[] param2); } ``` 5. 在Spring Boot的Service类中注入YourMapper,并调用存储过程方法: ```java // YourService.java package com.example.service; import com.example.mapper.YourMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class YourService { private final YourMapper yourMapper; @Autowired public YourService(YourMapper yourMapper) { this.yourMapper = yourMapper; } public void callStoredProcedure(String param1, String[] param2) { yourMapper.callStoredProcedure(param1, param2); } } ``` 以上就是使用Spring Boot结合MyBatis调用SQL Server存储过程的基本步骤。根据实际情况,可以在存储过程中定义更多的输入和输出参数,并在映射文件和接口中进行相应的配置和调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值