用Mysql存儲過程來完成動態SQL語句,使用存儲過程有很好的執行效率:
現在有要求如下:根據輸入的年份、國家、節假日類型查詢一個節假日,我們可以使用一般的SQL語句嵌入到Java代碼中,但是執行效率方面,表現方面並不是很理想,因此我選擇使用拼接SQL語句來完成這個查詢(因為有可能數據為空,所以一開始我選擇使用的方式拼接字符串)
SQL語句如下:
(這是在Navicat上編輯的,可以直接寫SQL其他的由Navicat自動生成)
BEGIN set @country = country;/**輸入的country參數**/ set @type = type;/**輸入的節假日類型參數**/ set @_year = _year;/**輸入的年份參數**/ set @tempsql = 'SELECT lh.lh_id,wp.location_id,wp.country,lh.starttime,lh.endtime,lh.type from workplace AS wp,legalholiday as lh WHERE wp.location_id=lh.location_id'; /**拼接SQL語句的字符串,注意,這里用SET 和 @ 一定要用@**/
IF(country<>'') THEN SET @tempsql=CONCAT(@tempsql,' and wp.country = ''',@country,''''); END IF; IF(type<>'') THEN SET @tempsql=CONCAT(@tempsql,' and lh.type=''',@type,''''); END IF; IF(_year<>'') THEN IF(_year<>0) THEN SET @tempsql=CONCAT(@tempsql,' and year(lh.starttime)=',@_year,' and year(lh.endtime)=',@_year); END IF; END IF;
/**這里可以寫上select * from @tempsql 來檢查你的SQL拼接是否正確,運行時把它注釋就好。但是如果字符串太長的話,可能就看不到了**/ prepare stmt from @tempsql;/**預編譯SQL**/ EXECUTE stmt;/**執行SQL**/ END
輸入參數設置:
IN `country` varchar(50),IN `type` varchar(255),IN `_year` int /**注意varchar類型的數據一定要設置大小**/
那么Java調用是這樣的:
call(String sql,Object...args){ java.sql.CallableStatement call = connection.prepareCall(sql);//調用准備 if (args!=null) { for (int i = 0; i < args.length; i++) { call.setObject(i+1, args[i]);//設置參數 } } } //調用該方法: call("{call selectHolidayByNameYearCountry(?,?,?)}"