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

MySQL存储过程动态SQL语句的生成的更多相关文章

  1. mysql创建存储过程动态SQL语句

    DROP PROCEDURE IF EXISTS x.`wk`; DELIMITER $$ CREATE PROCEDURE `x`.`wk`() BEGIN ); ); SET t = CONCAT ...

  2. oracle 存储过程 动态sql语句

    一.在oracle项目开发中越到问题: 在利用ODP向oracle中插入数据时,如果这样写:   insert into clobTable (id, story) values(1,'....'); ...

  3. MySQL基础----动态SQL语句

    尊重原创:http://blog.csdn.net/abc19900828/article/details/39501643   动态sql语句基本语法 1 :普通SQL语句可以用Exec执行 eg: ...

  4. mysql 存储过程 动态sql例子

    proc:BEGIN ; ; ; ) DEFAULT ''; ) DEFAULT ''; ) DEFAULT '';#插入日志的表,一个活动一张表 #将局部变量转换成会话变量 #动态sql语言只接受会 ...

  5. MySQL 存储过程常用SQL语句收集

    1,select curdate() /*2016-10-08*/ 2,select date_sub(curdate(), INTERVAL 6 DAY) /*2016-10-02*/ 3,case ...

  6. 动态SQL语句:定义(一)

    文章系列 动态SQL语句:定义(一) 静态SQL与动态SQL 静态SQL:程序运行前,具有固定的形式和结构的SQL. 动态SQL:程序运行时,能够动态改变形式或结构的SQL. 一些思考和想法 在实际的 ...

  7. mysql 存储过程中使用动态sql语句

    Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值 这里介绍两种在存储过程中的动态sql: set sql = (预处理的sql语句,可以是用concat拼接的 ...

  8. 存储过程中执行动态Sql语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  9. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

随机推荐

  1. cocos2d-x事件EventListenerTouchOneByOne没反应

    今天写了 cocos2d-x事件EventListenerTouchOneByOne,发现死活没反应,原代码复制到新工程没问题啊, 后来发现cocostudio用的基础容器(ccui.Layout:c ...

  2. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord

    对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html><ht ...

  3. Shiro-集成Spring

    集成Spring 加入Spring 和Shiro的jar 包 配置Spring 及SpringMVC 参照:1.3.2\shiro-root-1.3.2-source-release\shiro-ro ...

  4. win7里边使用telnet命令为什么提示telnet不是内部或外部命令,也不是可运行的程序或批处理文件

    Win7默认没有安装telnet功能,所以你直接用telnet命令是用不了的:你可以去“控制面板”-->“程序”(在左下角)--->“打开或关闭Windows功能”,勾上“telnet客户 ...

  5. Smarty模版引擎的原理

    Smarty是一个使用php写出来的模版引擎,用来将原本与html代码混杂在一起PHP代码逻辑分离,实现前后端分离. Smarty模板优点: 1. 速度:采用Smarty编写的程序可以获得最大速度的提 ...

  6. set和enum类型的用法和区别

    mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值.   1 2 3 ...

  7. Dubbo项目demo搭建

    项目参考: http://dubbo.io/User+Guide-zh.htm https://my.oschina.net/superman158/blog/466637 项目使用 maven+id ...

  8. Spring MVC学习笔记——引入静态文件

    1.在user-servlet.xml中加入以下代码,才能使得对静态文件的请求不被Controller捕获,而映射到一个固定的地址 <!-- 将静态文件指定到某个特殊的文件夹中统一处理 --&g ...

  9. display:none显示和隐藏

    <html> <head> <title>显示和隐藏问题</title> <meta charset="utf-8"/> ...

  10. 【Redis安装学习】

    1.Redis 中文官网地址:http://www.redis.net.cn/download/ 这里只是简单的安装了下.具体的官网有详细的介绍和安装:跳转 如何安装 下载,解压,编译: $ wget ...