zoukankan      html  css  js  c++  java
  • 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(?,?,?)}"      
    
  • 相关阅读:
    Hibernate_一对多映射_2
    Hibernate框架_1 单表映射 _2
    JS
    Hibernate框架_1 单表映射
    Spring_1
    Javabean
    JAVA注解(JDK1.5开始)
    JAVA方法的反射
    JAVA-Reflect(反射)1
    Android初学:Gradle 'HelloWorld' project refresh failed
  • 原文地址:https://www.cnblogs.com/kingkangstudy/p/6146374.html
Copyright © 2011-2022 走看看