MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率:
现在有要求如下:根据输入的年份、国家、节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率方面,表现方面并不是很理想,因此我选择使用拼接SQL语句来完成这个查询(因为有可能数据为空,所以一开始我选择使用的方式拼接字符串)
SQL语句如下:
(这是在Navicat上编辑的,可以直接写SQL其他的由Navicat自动生成)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 和 @ 一定要用@**/ <br>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;<br>/**这里可以写上 select * from @tempsql 来检查你的SQL拼接是否正确,运行时把它注释就好。但是如果字符串太长的话,可能就看不到了**/ prepare stmt from @tempsql;/**预编译SQL**/ EXECUTE stmt;/**执行SQL**/ END |
输入参数设置:
1 2 | IN `country` varchar (50), IN `type` varchar (255), IN `_year` int /**注意 varchar 类型的数据一定要设置大小**/ |
那么Java调用是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 | 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(?,?,?)}" |
本文原创作者:劲西风,转载请注明原文链接:https://www.cnblogs.com/kingkangstudy/p/6146374.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构