mybatis調用mysql存儲過程(返回參數,單結果集,多結果集)
一、接收一個返回值
使用Map接收返回參數,output參數放在傳入的param中
創建表
DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of demo -- ---------------------------- INSERT INTO `demo` VALUES ('1', '測試');
創建存儲過程
DROP PROCEDURE IF EXISTS pro; CREATE PROCEDURE pro ( IN userId INT, OUT userCount INT ) BEGIN DECLARE user_name VARCHAR (64); SELECT NAME FROM demo WHERE id = userId INTO user_name; INSERT INTO demo (NAME) VALUES (user_name); SELECT COUNT(*) FROM demo INTO userCount; END;
mapper.xml
<select id="procedureTest" parameterMap="pm" statementType="CALLABLE"> CALL pro(#{userId,mode=IN},#{userCount,mode=OUT,jdbcType=INTEGER}); </select> <parameterMap id="pm" type="java.util.Map"> <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter> <parameter property="userCount" jdbcType="INTEGER" mode="OUT"></parameter> </parameterMap>
service
@Override public void procedureTest() { Map<String, Object> param = new HashMap<>(); param.put("userId", "1"); demoMapper.procedureTest(param); System.out.println("輸出結果是:"+param.get("userCount")); }
輸出結果
參數名不一定和存儲過程一樣,隻和傳參順有關,使用下圖配置同樣可以獲取結果
System.out.println("輸出結果是:"+param.get("userCount_2"));
註意事項:
1、 存儲過程的參數和名稱無關,隻和順序有關系
2、 存儲過程的output參數,隻能通過傳入的map獲取
3、 存儲過程返回的結果集可直接用返回的map接收
4、 存儲過程的return結果需要使用?=call procName(?,?)的第一個參數接收,需要指定對應的mode為OUT類型
5、 存儲過程對應的數據類型為枚舉類型,需要使用大寫,如VARCHAR
output是在存儲過程中的參數的返回值(輸出參數),而ReturnValue是存儲過程返回的值(使用return關鍵字),一個存儲過程可以有任意多個依靠參數返回的值,但隻有一個ReturnValue。
存儲過程主要分成三類:
1、返回記錄集的存儲過程:執行結果是一個記錄集,例如,從數據庫中檢索出符合某一個或幾個條件的記錄。
2、返回數值得的存儲過程(也可稱為標量存儲過程),其執行完後返回一個值,例如數據庫中執行一個有返回值的函數或命令。
3、行為存儲過程,用來實現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操作。
二、接收list結果集
使用list接收
@Override public void procedureTest() { Map<String, Object> param = new HashMap<>(); param.put("userId", "1"); List<?> list = demoMapper.procedureTest(param); System.out.println("輸出結果是:" + param.get("userCount_2")); System.out.println("輸出集合:" + list.size()); }
<select id="procedureTest" parameterMap="pm" statementType="CALLABLE" resultMap="rm"> CALL pro(#{userId,mode=IN},#{userCount_2,mode=OUT,jdbcType=INTEGER}); </select> <parameterMap id="pm" type="java.util.Map"> <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter> <parameter property="userCount_2" jdbcType="INTEGER" mode="OUT"></parameter> </parameterMap> <resultMap id="rm" type="com.csstj.srm.entity.procedureTestEntity"> <result column="id" property="id"></result> <result column="name" property="userName"></result> </resultMap>
三、返回多個結果集
四、第二種配置也可以
CALL s_generatePlan_new ( #{organizationId, mode=IN,jdbcType=VARCHAR}, #{gradeId, mode=IN,jdbcType=VARCHAR}, #{semesterId, mode=IN,jdbcType=VARCHAR}, #{className, mode=IN,jdbcType=VARCHAR}, #{employeeCode, mode=IN,jdbcType=VARCHAR}, #{courseName, mode=IN,jdbcType=VARCHAR}, #{classroomName, mode=IN,jdbcType=VARCHAR}, #{approverId, mode=IN,jdbcType=VARCHAR}, #{createBy, mode=IN,jdbcType=VARCHAR}, #{total,mode=OUT ,jdbcType=VARCHAR})
到此這篇關於mybatis調用mysql存儲過程(返回參數,單結果集,多結果集)的文章就介紹到這瞭,更多相關mybatis調用mysql存儲過程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL中存儲過程的詳細詳解
- Mybatis結果集映射與生命周期詳細介紹
- MyBatis延遲加載策略深入探究
- mybatis 如何利用resultMap復雜類型list映射
- Mybatis使用@one和@Many實現一對一及一對多關聯查詢