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;