mybaties存储过程使用

功能需求描述:

系统房屋管理页面要求输入某栋房的楼层和每层的层数,快速添加房屋信息,以方便用户添加房屋信息。如下图所示
在这里插入图片描述
存储过程如下

DROP PROCEDURE IF EXISTS proc_create_building;
DELIMITER $
CREATE PROCEDURE proc_create_building(v_room CHAR(10),v_floor CHAR(10),v_unit CHAR(20),v_build_id INT,v_area_id INT,v_office_id CHAR(64))
BEGIN
    DECLARE i INT DEFAULT 1; 
    DECLARE j INT DEFAULT 1;
    WHILE i<= CONVERT(v_floor,UNSIGNED) DO
           WHILE j<= CONVERT(v_room,UNSIGNED) DO
								INSERT INTO room_info(office_id,areaID,buildID,unit,floor,roomNumber,del_flag) 
		             VALUES (
												v_office_id,
												v_area_id,
												v_build_id,
												v_unit,
												CONCAT(i),
												CONCAT(j),
												'0'
	         	     ); 
                SET j = j+1;
           END WHILE;
        SET j = 1;
        SET i = i+1;
    END WHILE;
END $


使用mysql数据库,输入6个参数。DELIMITER $ 的意思是结束符设置为$,也可以设置为其它,如多个分号。传入参数v_floor和v_room,因代码中的bean申明为String类型,实际数据库中存放的都是数字,又需要根据它们循环,故需要使用 CONVERT(v_floor,UNSIGNED) 转换为数字类型。
需要注意的是,循环嵌套,内层循环执行完后,必须将内层循环的条件变量重置为初始值(代码块中的SET j = 1;),外层循环才会循环执行。mysql存储过程中的字符变量不能申明为varchar,只能使用char(xx),这点与Oracle不同。尝试使用varchar都报错,存储过程创建失败。
数据库调用语句如下:

CALL proc_create_building('30', '20', 'A', 100, 1, '1') ; 

mybaties的xml文件调用代码:

<!-- 自动创建房间信息 -->
	<insert id="autoCreateRoom" statementType="CALLABLE">
	   CALL proc_create_building(
							     #{roomNumber,jdbcType=VARCHAR,mode=IN},
							     #{floor,jdbcType=VARCHAR,mode=IN},
							     #{unit,jdbcType=VARCHAR,mode=IN},
							     #{buildID,jdbcType=INTEGER,mode=IN},
		                         #{areaID,jdbcType=INTEGER,mode=IN},
	                             #{officeId,jdbcType=VARCHAR,mode=IN}
	                            )
	
	</insert>

因为存储过程执行的insert语句,故节点选用insert。
java代码就不贴出来了,功能到此完成。
做数据库优化的时候,定会碰到数据量比较大的表,下面是一个插入数据的存储过程

DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=2000000 DO
        INSERT INTO dayFreeze(DevEUI,DeviceID,Reading,myStatus,myTime,sysTime)
             VALUES('AABBCCDDEEFF0123','1000001234567891','1','2',SYSDATE(),SYSDATE());
        SET i = i+1;
    END WHILE;
END $
CALL proc_initData();

猜你喜欢

转载自blog.csdn.net/weixin_43513644/article/details/84337425
今日推荐