MySQL存儲過程動態SQL語句的生成


用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(?,?,?)}"      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM