Springboot中使用mysql存储过程

  • 存储过程简介
  • 简介
  • 存储过程优点
  • 存储过程缺点
  • 创建存储过程
  • 创建语法
  • 举例
  • Springboot中使用存储过程
  • xml文件中
  • Mapper文件中


存储过程简介

简介

MySQL 5.0 版本开始支持存储过程。

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

存储过程优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

存储过程缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

创建存储过程

创建语法

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
 
characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
 
routine_body:
  Valid SQL routine statement
 
[begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

举例

DROP PROCEDURE IF EXISTS fun_fun_name;
delimiter $$	//结束符定义为$$
create procedure fun_fun_name(in start_day date)	//	个人习惯:存储过程名称方式fun_'存储过程名称',输入参数-开始时间
begin
	--  定义变量
    declare s int DEFAULT 0;
    declare res_t_cnt int default 0;
    declare t_name varchar(15);
    declare var_name varchar(50);
    declare var_age int;
    declare var_sex varchar(5);
    declare var_mobile varchar(11);
    --  定义游标
    declare res_user CURSOR FOR select name,age,sex,mobile  from sys_user;
	-- 声明当游标遍历完后将标志变量置成某个值
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
    -- 打开游标
    open res_user;
    	-- 将游标中的值赋值给变量,变量名称与表名不能相同
    	fetch res_user into var_name,var_age,var_sex,var_mobile;
    	while s <> 1 do
    		--	临时保存变量,是否存在当前表
    		SELECT COUNT(*) into res_t_cnt FROM information_schema.`TABLES` WHERE TABLE_NAME= concat('t_', var_mobile);
    		--	动态表名
    		set t_name = concat('t_', var_mobile);
    		if (res_t_cnt > 0) then 
    			--  当前表存在,执行数据插入,拼接SQL注意空格及引号
    			set @sqlStr = concat('insert into t_result select name, age,"', var_mobile,'","', var_sex, '" from ', t_name, ' where create_date = ?');
    			set @search_date = date_format(start_day, '%Y-%m-%d');
    			PREPARE stmt from @sqlStr;
    			EXECUTE stmt using @search_date;
    		end if;
    		-- 游标移动
    		fetch res_user into var_name,var_age,var_sex,var_mobile;
    	end while;
    	close res_pipe;
end $$
delimiter ;

上述代码创建了存储过程,并有一个日期类型的入参,存储过程中使用游标存储查询结果,并在之后的代码中循环使用。之后动态拼接SQL,并传入参数执行动态拼接的SQL。

Springboot中使用存储过程

xml文件中

<select id="insertDxData" statementType="CALLABLE">
        {
            call fun_fun_name(
                #{startDay, jdbcType = DATE}
            )
        }
    </select>

Mapper文件中

void insertDxData(@Param("startDay") Date startDay);