mybatis調(diào)用mysql存儲過程(返回參數(shù),單結(jié)果集,多結(jié)果集)
一、接收一個(gè)返回值
使用Map接收返回參數(shù),output參數(shù)放在傳入的param中
創(chuàng)建表
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', '測試');
創(chuàng)建存儲過程
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("輸出結(jié)果是:"+param.get("userCount")); }
輸出結(jié)果
參數(shù)名不一定和存儲過程一樣,只和傳參順有關(guān),使用下圖配置同樣可以獲取結(jié)果
System.out.println("輸出結(jié)果是:"+param.get("userCount_2"));
注意事項(xiàng):
1、 存儲過程的參數(shù)和名稱無關(guān),只和順序有關(guān)系
2、 存儲過程的output參數(shù),只能通過傳入的map獲取
3、 存儲過程返回的結(jié)果集可直接用返回的map接收
4、 存儲過程的return結(jié)果需要使用?=call procName(?,?)的第一個(gè)參數(shù)接收,需要指定對應(yīng)的mode為OUT類型
5、 存儲過程對應(yīng)的數(shù)據(jù)類型為枚舉類型,需要使用大寫,如VARCHAR
output是在存儲過程中的參數(shù)的返回值(輸出參數(shù)),而ReturnValue是存儲過程返回的值(使用return關(guān)鍵字),一個(gè)存儲過程可以有任意多個(gè)依靠參數(shù)返回的值,但只有一個(gè)ReturnValue。
存儲過程主要分成三類:
1、返回記錄集的存儲過程:執(zhí)行結(jié)果是一個(gè)記錄集,例如,從數(shù)據(jù)庫中檢索出符合某一個(gè)或幾個(gè)條件的記錄。
2、返回?cái)?shù)值得的存儲過程(也可稱為標(biāo)量存儲過程),其執(zhí)行完后返回一個(gè)值,例如數(shù)據(jù)庫中執(zhí)行一個(gè)有返回值的函數(shù)或命令。
3、行為存儲過程,用來實(shí)現(xiàn)數(shù)據(jù)庫的某個(gè)功能,而沒有返回值,例如在數(shù)據(jù)庫中的更新和刪除操作。
二、接收list結(jié)果集
使用list接收
@Override public void procedureTest() { Map<String, Object> param = new HashMap<>(); param.put("userId", "1"); List<?> list = demoMapper.procedureTest(param); System.out.println("輸出結(jié)果是:" + 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>
三、返回多個(gè)結(jié)果集
四、第二種配置也可以
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})
到此這篇關(guān)于mybatis調(diào)用mysql存儲過程(返回參數(shù),單結(jié)果集,多結(jié)果集)的文章就介紹到這了,更多相關(guān)mybatis調(diào)用mysql存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis調(diào)用PostgreSQL存儲過程實(shí)現(xiàn)數(shù)組入?yún)鬟f
- Mybatis調(diào)用MySQL存儲過程的簡單實(shí)現(xiàn)
- Mybatis應(yīng)用mysql存儲過程查詢數(shù)據(jù)實(shí)例
- 關(guān)于Mybatis 中使用Mysql存儲過程的方法
- 前端傳參數(shù)進(jìn)行Mybatis調(diào)用mysql存儲過程執(zhí)行返回值詳解
- mybatis調(diào)用mysql存儲過程并獲取返回值方式
- Mybatis調(diào)用SQL?Server存儲過程的實(shí)現(xiàn)示例
相關(guān)文章
Struts2學(xué)習(xí)教程之Action類如何訪問WEB資源
這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之Action類如何訪問WEB資源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04JAVA 生成隨機(jī)數(shù)并根據(jù)后臺概率靈活生成的實(shí)例代碼
本篇文章主要介紹了JAVA 生成隨機(jī)數(shù)并根據(jù)后臺概率靈活生成的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Java Servlet線程中AsyncContext異步處理Http請求
這篇文章主要介紹了Java Servlet線程中AsyncContext異步處理Http請求及在業(yè)務(wù)中應(yīng)用,AsyncContext是Servlet 3.0使Servlet 線程不再需要一直阻塞,直到業(yè)務(wù)處理完畢才能再輸出響應(yīng),最后才結(jié)束該Servlet線程2023-03-03SpringMVC中@ModelAttribute與@RequestBody的區(qū)別及說明
這篇文章主要介紹了SpringMVC中@ModelAttribute與@RequestBody的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11關(guān)于@RequestParam的使用所遇到的404問題
這篇文章主要介紹了關(guān)于@RequestParam的使用所遇到的404問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08詳解springboot?springsecuroty中的注銷和權(quán)限控制問題
這篇文章主要介紹了springboot-springsecuroty?注銷和權(quán)限控制,賬戶注銷需要在SecurityConfig中加入開啟注銷功能的代碼,權(quán)限控制要導(dǎo)入springsecurity和thymeleaf的整合依賴,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-03-03SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟
這篇文章主要介紹了SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11