1. 程式人生 > 其它 >【Java】【Mybatis】如何呼叫儲存過程和儲存函式

【Java】【Mybatis】如何呼叫儲存過程和儲存函式

https://www.jb51.net/article/230756.htm

Mybatis呼叫儲存過程

MyBatis支援使用儲存過程的配置。當使用儲存過程時,需要設定一個引數“mode”,其值有IN(輸入引數)、OUT(輸出引數)和INOUT(輸入/輸出引數)。

Mybatis定義儲存過程如下:

<!-- 儲存過程 -->
<select id="selectSomeThing" statementType="CALLABLE" parameterType="hashmap" resultType="com.pjb.mybatis.po.User">
    {CALL PROC_FOR_INPUT(#{information,mode=IN,jdbcType=VARCHAR})}
</select>

示例1

建立儲存過程,實現分頁查詢使用者列表,並返回資料總數和總頁數,通過MyBatis呼叫該儲存過程。

(1)在MySQL資料庫中建立使用者資訊表(tb_user)。

-- 建立“使用者資訊”資料表
CREATE TABLE IF NOT EXISTS tb_user
( 
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '使用者編號',
    user_name VARCHAR(50) NOT NULL COMMENT '使用者姓名',
    sex CHAR(2) DEFAULT '' COMMENT '性別
' ) COMMENT = '使用者資訊表';

(2)建立儲存過程,實現分頁查詢使用者列表,並返回資料總數和總頁數。

 1 -- 將結束標誌符更改為$$
 2 DELIMITER $$
 3  
 4 /*
 5   -- 儲存過程:分頁查詢使用者列表,並返回資料總數和總頁數
 6   -- 輸入引數:page_index:當前頁碼
 7   -- 輸入引數:page_size:分頁大小
 8   -- 輸出引數:total_count:資料總數
 9   -- 輸出引數:total_page:總頁數
10 */
11 CREATE PROCEDURE proc_search_user(IN page_index INT
,IN page_size INT, OUT total_count INT, OUT total_page INT) 12 BEGIN 13 DECLARE begin_no INT; 14 SET begin_no = (page_index-1)*page_size; 15 16 -- 分頁查詢列表 17 SELECT * FROM tb_user 18 WHERE id >= ( 19 SELECT id FROM tb_user 20 ORDER BY id ASC 21 LIMIT begin_no,1 22 ) 23 ORDER BY id ASC 24 LIMIT page_size; 25 26 -- 計算資料總數 27 SELECT COUNT(1) INTO total_count FROM tb_user; 28 29 -- 計算總頁數 30 SET total_page = FLOOR((total_count + page_size - 1) / page_size); 31 END$$ 32 33 -- 將結束標誌符更改回分號 34 DELIMITER ;
proc_search_user

(3)建立使用者資訊持久化類(User.java)。

 1 package com.pjb.mybatis.po;
 2  
 3 /**
 4  * 使用者資訊的持久化類
 5  * @author pan_junbiao
 6  **/
 7 public class User
 8 {
 9     private int id; //使用者編號
10     private String userName; //使用者姓名
11     private String sex; //性別
12  
13     //省略getter與setter方法...
14 }

(4)編寫SQL對映配置。

1 <!-- 儲存過程:分頁查詢使用者列表,並返回資料總數和總頁數 -->
2 <select id="proc_search_user" statementType="CALLABLE" parameterType="hashmap" resultType="com.pjb.mybatis.po.User">
3     {CALL proc_search_user(#{page_index,mode=IN,jdbcType=INTEGER},
4       #{page_size,mode=IN,jdbcType=INTEGER},
5       #{total_count,mode=OUT,jdbcType=INTEGER},
6       #{total_page,mode=OUT,jdbcType=INTEGER})}
7 </select>

(5)編寫執行方法。

 1 /**
 2  * 使用MyBatis呼叫儲存過程:分頁查詢使用者列表,並返回資料總數和總頁數
 3  * @author pan_junbiao
 4  */
 5 @Test
 6 public void procSearchUser()
 7 {
 8     DataConnection dataConnection = new DataConnection();
 9     SqlSession sqlSession = dataConnection.getSqlSession();
10     //封裝查詢引數
11     Map params = new HashMap();
12     params.put("page_index",2);  //輸入引數:當前頁碼
13     params.put("page_size",10);  //輸入引數:分頁大小
14     params.put("total_count",0); //輸出引數:資料總數
15     params.put("total_page",0);  //輸出引數:總頁數
16     //呼叫儲存過程
17     List<User> userList = sqlSession.selectList("test.proc_search_user",params);
18     System.out.println("查詢第"+ params.get("page_index") +"頁的資料,每頁共"+params.get("page_size")+"條資料");
19     //遍歷使用者列表
20     for (User user : userList)
21     {
22         System.out.println("編號:" + user.getId() +" 姓名:" + user.getUserName() + " 性別:" + user.getSex());
23     }
24     //獲取輸出引數
25     System.out.println("資料總數:" + params.get("total_count"));
26     System.out.println("總頁數:" + params.get("total_page"));
27     sqlSession.close();
28 }
procSearchUser

示例2

建立儲存過程,實現新增使用者資訊,並返回自增主鍵,通過MyBatis呼叫該儲存過程

(1)建立儲存過程。

 1 -- 將結束標誌符更改為$$
 2 DELIMITER $$
 3  
 4 /*
 5   -- 儲存過程:新增使用者資訊,返回自增主鍵
 6   -- 輸入引數:user_name:使用者姓名
 7   -- 輸入引數:sex:性別
 8   -- 輸出引數:user_id:自增主鍵
 9 */
10 CREATE PROCEDURE proc_add_user(IN user_name VARCHAR(50),IN sex CHAR(2), OUT user_id INT)
11 BEGIN
12     -- 新增使用者
13     INSERT INTO tb_user(user_name,sex) VALUE (user_name,sex);
14     
15     -- 獲取自增主鍵
16     SELECT LAST_INSERT_ID() INTO user_id;
17 END$$
18  
19 -- 將結束標誌符更改回分號
20 DELIMITER ;
proc_add_user

(2)編寫SQL對映配置。

1 <!-- 儲存過程:新增使用者資訊,返回自增主鍵 -->
2 <insert id="proc_add_user" statementType="CALLABLE" parameterType="com.pjb.mybatis.po.User">
3   {CALL proc_add_user(#{userName,mode=IN,jdbcType=VARCHAR},
4     #{sex,mode=IN,jdbcType=CHAR},
5     #{id,mode=OUT,jdbcType=INTEGER})}
6 </insert>

(3)編寫執行方法。

 1 /**
 2  * 使用MyBatis呼叫儲存過程:新增使用者資訊,返回自增主鍵
 3  * @author pan_junbiao
 4  */
 5 @Test
 6 public void procAddUser()
 7 {
 8     DataConnection dataConnection = new DataConnection();
 9     SqlSession sqlSession = dataConnection.getSqlSession();
10     //新增的使用者物件
11     User user = new User();
12     user.setUserName("pan_junbiao的部落格");
13     user.setSex("男");
14     //呼叫儲存過程執行新增
15     int reuslt = sqlSession.insert("test.proc_add_user",user);
16     sqlSession.commit();
17     //列印結果
18     System.out.println("執行結果:"+reuslt);
19     System.out.println("自增主鍵:"+user.getId());
20     sqlSession.close();
21 }

執行結果:

  其實,新增資料後,獲取自增主鍵是可以使用MyBatis提供的<selectKey>標籤,SQL對映配置如下:

1 <!-- 儲存過程:新增使用者資訊,返回自增主鍵 -->
2 <insert id="proc_add_user" statementType="CALLABLE" parameterType="com.pjb.mybatis.po.User">
3   <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
4       SELECT LAST_INSERT_ID()
5   </selectKey>
6   {CALL proc_add_user(#{userName,mode=IN,jdbcType=VARCHAR},
7     #{sex,mode=IN,jdbcType=CHAR})}
8 </insert>

但上述示例是為了能讓該儲存過程擁有一個返回的引數。

MyBatis 呼叫儲存過程

【示例2】

建立儲存函式,根據使用者編號,獲取使用者名稱稱,通過MyBatis呼叫該儲存函式。

(1)建立儲存函式,根據使用者編號,獲取使用者名稱稱。

 1 -- 將結束標誌符更改為$$
 2 DELIMITER $$
 3  
 4 /*
 5   -- 儲存函式:根據使用者編號,獲取使用者名稱稱
 6   -- 輸入引數:in_id:使用者編號
 7   -- 返回結果:使用者名稱稱
 8 */
 9 CREATE FUNCTION func_get_user_name(in_id INT)
10 RETURNS VARCHAR(50)
11 BEGIN
12     -- 定義返回變數
13     DECLARE out_name VARCHAR(50);
14  
15     -- 查詢使用者資訊,獲取使用者名稱稱
16     SELECT user_name INTO out_name FROM tb_user WHERE id = in_id;
17  
18     -- 返回結果
19     RETURN out_name;
20 END$$
21  
22 -- 將結束標誌符更改回分號
23 DELIMITER ;
func_get_user_name

(2)編寫SQL對映配置。

1 <!-- 儲存函式:根據使用者編號,獲取使用者名稱稱 -->
2 <select id="func_get_user_name" statementType="CALLABLE" parameterType="hashMap" >
3     {#{userName,mode=OUT,jdbcType=VARCHAR} = CALL func_get_user_name(#{userId,mode=IN,jdbcType=INTEGER})}
4 </select>

(3)編寫執行方法。

 1 /**
 2  * 使用MyBatis呼叫儲存函式:根據使用者編號,獲取使用者名稱稱
 3  * @author pan_junbiao
 4  */
 5 @Test
 6 public void funcGetUserName()
 7 {
 8     DataConnection dataConnection = new DataConnection();
 9     SqlSession sqlSession = dataConnection.getSqlSession();
10     //封裝引數
11     Map userMap = new HashMap();
12     userMap.put("userName","");
13     userMap.put("userId",8);
14     sqlSession.selectOne("test.func_get_user_name",userMap);
15     System.out.println("使用者名稱稱:" + userMap.get("userName"));
16     sqlSession.close();
17 }