Mybatis 調用sqlserver 存儲過程,使用Map傳參數 mark一下

service層
query爲查詢實體類,
new一個Map集合存放 query對象 map
調用 personSalaryDao.CallSalaryExport(map) 參入map參數

@Override
	public XSSFWorkbook exportExcelByQuery(PersonSalaryQuery query) {

		System.out.println("導出excel查詢實體:" + JSON.toJSONString(query));
		if (query == null) {
			query = new PersonSalaryQuery();
		}
		Map<String, Object> map = new HashMap<>();
		map.put("gradeCode", query.getGradeCode());
		map.put("personCode", query.getPersonCode());
		map.put("year", query.getYear());
		map.put("month", query.getMonth());
		// 執行存儲函數
		synchronized (this) {
			personSalaryDao.CallSalaryExport(map);
		}

Mapper 映射.xml 文件
說明:我這裏只用到了入參 mode=IN
參數類型 parameterMap 傳id就行 通過存在map集合中的key 去
調用存儲過程 call APC_SalaryExport(???)

<parameterMap type="java.util.Map" id="PersonMap">    
       <parameter property="gradeCode" jdbcType="VARCHAR"  javaType="java.lang.String" mode="IN"/>
       <parameter property="personCode" jdbcType="VARCHAR"  javaType="java.lang.String" mode="IN"/>
       <parameter property="year" jdbcType="VARCHAR"  javaType="java.lang.String"  mode="IN"/>
       <parameter property="month" jdbcType="VARCHAR"  javaType="java.lang.String" mode="IN"/>
</parameterMap> 
<select id="CallSalaryExport" parameterMap="PersonMap" statementType="CALLABLE">
	{
		call [UFDATA_002_2018].[dbo].APC_SalaryExport(?,?,?,?)
	}
</select>

存儲過程:

if exists (SELECT 1 FROM sysobjects WHERE TYPE='P' and name='APC_SalaryExport')
	-- 刪除存儲過程
	drop procedure [dbo].[APC_SalaryExport]
	
GO
	CREATE PROCEDURE APC_SalaryExport
	(
		@gradeCode varchar(50),
		@personCode varchar(50),
		@year  int ,
		@month int
	)
		AS
	BEGIN
		-- 判斷臨時動態字段表是否存在
		if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#columnNames'))
			drop table #columnNames;
		
		-- 定義動態查詢SQL語句及動態列名字符串
		DECLARE @sql nvarchar(4000) = ''
		declare @columns nvarchar(3000) = 'cGZGradeNum AS ''工資類別'',cPsn_Name AS ''用戶名'',cPsn_Num As 用戶編碼,iyear AS ''年份'',imonth AS ''月份'''

		-- 獲取動態列名數據
		SELECT 'F_'+CAST(tbSet.iGZItem_id AS VARCHAR(30)) as itemId,tbSet.cSetGZItemName as itemName
		INTO #columnNames
		FROM [UFDATA_002_2018].[dbo].WA_GZtblset tbSet INNER JOIN 
		(SELECT replace(name,'F_','') as itemId FROM [UFDATA_002_2018].[dbo].syscolumns 
		WHERE id=Object_Id('WA_GZData') and name like 'F_%' 
		and name not in ('F_1','F_2','F_3')) tbId
		ON  tbSet.iGZItem_id = tbId.itemId 
		WHERE 1=1 
		ORDER BY tbSet.iSetGZItemProp,itemId;
		
		-- 項目字段名 項目名稱
		declare @item nvarchar(32)
		DECLARE @itemName nvarchar(100)
		-- 定義項目循環遊標
		declare item_cursor cursor
		-- 遍歷動態列名字段表
		for(SELECT itemId,itemName FROM #columnNames)
			open item_cursor
				fetch next from item_cursor into @item,@itemName
				while @@FETCH_STATUS = 0
				begin           
					-- 拼接動態列名 
					SET @columns = @columns+','+'ISNULL('+@item+',0) AS '''+@itemName+''''
		    
					fetch next from item_cursor into @item,@itemName
				end    
			close item_cursor  --關閉遊標
			deallocate item_cursor   --釋放遊標
			
		set @columns = @columns + ',F_1 AS ''應發數'',F_2 AS ''應扣數'',F_3 AS ''實際發放'''

		-- 刪除動態列名最後一個逗號
		-- SET @columns = LEFT(@columns,len(@columns)-1)

		-- 導出工資結果數據表
		if object_id(N'gz_result',N'U') is not null
			DROP TABLE gz_result 

		-- 設置當前動態SQL語句
		
		--SET @sql = 'SELECT '+@columns + ' INTO gz_result FROM WA_GZDATA WHERE iyear = '+@year
		SET @sql = 'SELECT '+@columns + ' INTO gz_result FROM [UFDATA_002_2018].[dbo].WA_GZDATA where 1=1'
	----gradeCode":"001","month":"10","personCode":"hutt","year":"2018"	
		if(@gradeCode is not null)
			set @sql = @sql + ' and cGZGradeNum = ' + @gradeCode
		if(@personCode is not null)
			set @sql = @sql + ' and cPsn_Num  = '''+ @personCode +''''
		if(@year is not null)
			set @sql = @sql + ' and iYear = '+ convert(varchar,@year)
		if(@month is not null)
			set @sql = @sql + ' and iMonth = ' +  convert(varchar,@month)
		print @sql

		-- 執行動態SQL語句,將結果寫入到到處結果數據表
		EXEC(@sql);
		
	END;

EXEC [UFDATA_002_2018].[dbo].[APC_SalaryExport] null,hutt,2018,10;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章