1. 程式人生 > >MyBatis調用MySQL存儲過程

MyBatis調用MySQL存儲過程

map 業務 varchar rpad ase per mysql存儲過程 state bat

業務背景:

機構ID:省(360000),市級(360100),區縣級(360101)

輸入一個機構ID(可能是區,也可能是市)在sys_ability_warning_rule表中查詢對應機構ID,

如:輸入360305(區縣級),

如果表中有對應ID,則直接返回360305,

如果沒有對應ID,則查詢有沒有市級ID(360300),如果有,則返回360300,

如果市級ID也沒有,則查詢省級ID(360000),如果有,則返回360000,

如果省級ID也沒有,則返回(000000)

方法一:循環法

CREATE PROCEDURE `getSchWarnRule`(IN organiz VARCHAR(20),OUT organiz_rule VARCHAR
(20)) BEGIN DECLARE sqlStr VARCHAR(4000) DEFAULT ‘‘; DECLARE leg INT DEFAULT 6; REPEAT SET sqlStr = CONCAT("select count(*) into @count from sys_ability_warning_rule wr where wr.organiz = ", organiz, ""); SET @sql2 = sqlStr; PREPARE stat1 FROM @sql2; EXECUTE
stat1; IF @count = 0 THEN SET leg = leg - 2; SET organiz = RPAD(LEFT(organiz,leg),6,0); END IF; UNTIL @count>=1 OR leg = 0 END REPEAT; SET organiz_rule = organiz; END

方法二:遞歸法

DROP PROCEDURE IF EXISTS `getSchWarnRule2`;
-- organiz 機構 
-- organiz_rule 有效機構
CREATE PROCEDURE getSchWarnRule2(IN organiz VARCHAR(20),OUT organiz_rule VARCHAR(20)) BEGIN DECLARE sqlStr VARCHAR(4000) DEFAULT ‘‘; DECLARE organiz_rule2 VARCHAR(20) DEFAULT ‘‘; DECLARE organiz2 VARCHAR(20) DEFAULT RPAD(organiz,6,0); IF organiz2!=000000 THEN SET sqlStr = CONCAT("select count(*) into @count from sys_ability_warning_rule wr where wr.organiz = ", organiz2, ""); SET @sql2 = sqlStr; PREPARE stat1 FROM @sql2; EXECUTE stat1; IF @count=0 THEN call getSchWarnRule2(LEFT(organiz,CHAR_LENGTH(organiz)-2), organiz_rule2); SET organiz_rule = organiz_rule2; ELSEIF @count>=1 THEN SET organiz_rule = organiz; END IF; END IF; END;

MyBatis調用:

WarnRuleMapper.java 接口

public interface WarnRuleMapper extends BaseMapper<SysAbilityWarningRule> {
    public String getSchWarnRule(Map map);
}

WarnRuleMapper.xml

<select id="getSchWarnRule" parameterType="java.util.Map" resultType="java.lang.String" statementType="CALLABLE" >
    {
        call getSchWarnRule(
            #{organiz,mode=IN,jdbcType=VARCHAR},
            #{organiz_rule,mode=OUT,jdbcType=VARCHAR}
        )
    }
</select>

然後再用Service層調用就OK了。

MyBatis調用MySQL存儲過程