1. 程式人生 > >Mybatis原始碼分析之儲存過程呼叫

Mybatis原始碼分析之儲存過程呼叫

這一篇部落格我們學習一下Mybatis呼叫儲存過程的使用和執行流程。首先我們先建立一個簡單的儲存過程

DELIMITER $
CREATE PROCEDURE mybatis.ges_user_count(IN age INT, OUT user_count INT)
BEGIN  
SELECT COUNT(*) FROM users WHERE users.age=age INTO user_count;
END 
$
這個儲存過程的含義其實比較簡單的,就是輸入age,然後執行select count(*) from users where users.age = age into user_count;獲得年齡等於age的人數賦值給user_count,還是比較簡單的。

接下來是儲存過程的呼叫,執行如下命令就可以完成儲存過程的呼叫。

接下來我們看看利用Mybatis是如何呼叫儲存過程的。

userMapper.xml新增儲存過程呼叫配置:

<select id="count" statementType="CALLABLE" parameterMap="getUserCountMap">
      CALL mybatis.ges_user_count(?,?)
</select>
Main函式:
public class Learn1Main {

	public static void main(String [] args){
		
		//mybatis的配置檔案
	    String resource = "learn/mybatis-config.xml";
	    //使用類載入器載入mybatis的配置檔案(它也載入關聯的對映檔案)
	    InputStream is = Learn1Main.class.getClassLoader().getResourceAsStream(resource);
	    //構建sqlSession的工廠
	    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	    SqlSession session = sessionFactory.openSession();
	    Map<String, Integer> parameterMap = new HashMap<String, Integer>();
	    parameterMap.put("age", 12);
	    parameterMap.put("user_count", -1);
	    session.selectOne("com.tianjunwei.learn.learn1.entity.User.count", parameterMap);
	    Integer result = parameterMap.get("user_count");
	    System.out.println(result);
	    
	}
}
執行結果:

其最終的執行過程在DefaultResultSetHandler中,呼叫普通的sql和儲存過程之間還是有所區別的,Sql語句的執行是使用CallableStatement。

  //
  // HANDLE OUTPUT PARAMETER
  //
  //呼叫儲存過程返回結果,將結果值放在引數中
  @Override
  public void handleOutputParameters(CallableStatement cs) throws SQLException {
    final Object parameterObject = parameterHandler.getParameterObject();
    final MetaObject metaParam = configuration.newMetaObject(parameterObject);
    final List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
	//迴圈處理每個引數
    for (int i = 0; i < parameterMappings.size(); i++) {
      final ParameterMapping parameterMapping = parameterMappings.get(i);
	  //判斷引數的模式
      if (parameterMapping.getMode() == ParameterMode.OUT || parameterMapping.getMode() == ParameterMode.INOUT) {
        if (ResultSet.class.equals(parameterMapping.getJavaType())) {
          handleRefCursorOutputParameter((ResultSet) cs.getObject(i + 1), parameterMapping, metaParam);
        } else {
          final TypeHandler<?> typeHandler = parameterMapping.getTypeHandler();
          metaParam.setValue(parameterMapping.getProperty(), typeHandler.getResult(cs, i + 1));
        }
      }
    }
  }

  private void handleRefCursorOutputParameter(ResultSet rs, ParameterMapping parameterMapping, MetaObject metaParam) throws SQLException {
    try {
      final String resultMapId = parameterMapping.getResultMapId();
      final ResultMap resultMap = configuration.getResultMap(resultMapId);
      final DefaultResultHandler resultHandler = new DefaultResultHandler(objectFactory);
      final ResultSetWrapper rsw = new ResultSetWrapper(rs, configuration);
      handleRowValues(rsw, resultMap, resultHandler, new RowBounds(), null);
      metaParam.setValue(parameterMapping.getProperty(), resultHandler.getResultList());
    } finally {
      // issue #228 (close resultsets)
      closeResultSet(rs);
    }
  }


相關推薦

Mybatis原始碼分析儲存過程呼叫

這一篇部落格我們學習一下Mybatis呼叫儲存過程的使用和執行流程。首先我們先建立一個簡單的儲存過程DELIMITER $ CREATE PROCEDURE mybatis.ges_user_count(IN age INT, OUT user_count INT) BEGI

Mybatis原始碼分析Spring與Mybatis整合MapperScannerConfigurer處理過程原始碼分析

        前面文章分析了這麼多關於Mybatis原始碼解析,但是我們最終使用的卻不是以前面文章的方式,編寫自己mybatis_config.xml,而是最終將配置融合在spring的配置檔案中。有了前面幾篇部落格的分析,相信這裡會容易理解些關於Mybatis的初始化及

mybatis原始碼學習執行過程分析(2)——config.xml配置檔案和mapper.xml對映檔案解析過程

在上一篇中跟蹤了SqlSessionFactory及SqlSession的建立過程。這一篇,主要跟蹤Mapper介面和XML檔案對映及獲取。 1.xml檔案的解析 1.1Mybatis-config.xml的解析 在SqlSessionFactor

精盡MyBatis原始碼分析 - SQL執行過程(一) Executor

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

精盡MyBatis原始碼分析 - SQL執行過程(二) StatementHandler

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

精盡MyBatis原始碼分析 - SQL執行過程(三) ResultSetHandler

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

精盡MyBatis原始碼分析 - SQL執行過程(四)延遲載入

> 該系列文件是本人在學習 Mybatis 的原始碼過程中總結下來的,可能對讀者不太友好,請結合我的原始碼註釋([Mybatis原始碼分析 GitHub 地址](https://github.com/liu844869663/mybatis-3)、[Mybatis-Spring 原始碼分析 GitHub 地址

SpringOauth2.0原始碼分析儲存(五)

1.概述 前面幾個章節所述內容如下: 本章節主要敘說Token的儲存情況。預設的情況下,SpringOauth2.0 提供4種方式儲存。第一種是提供了基於mysql的儲存,第二種是基於redis的儲存。第三種基於jvm的儲存,第四種基於Jwt的儲存方式。這裡我

elasticsearch原始碼分析啟動過程(二)

最近開始廣泛的使用elasticsearch,也開始寫一些java程式碼了,為了提高java程式碼能力,也為了更加深入一點了解elasticsearch的內部運作機制,所以開始看一些elasticsearch的原始碼了。對於這種廣受追捧的開源專案,細細品讀一定會受益匪淺,

MyBatis原始碼分析抽象工廠模式和建造者模式的應用

抽象工廠模式的應用 MyBatis原始碼的註釋不多,不過SqlSession倒是給了兩行註釋: /** * The primary Java interface for working with MyBatis. * Through this inter

Mybatis原始碼分析Select返回資料分析

Mybatis原始碼分析之Select返回資料分析 在之前的一篇文章中分析了@Select註解的使用方法,在查詢方法中我們知可以返回Map型別,也可以返回指標,或者是list集合,或是單條記錄,今天就對這幾種返回做一個原始碼分析。 Select查詢 在這裡就不需要再寫一

Mybatis原始碼分析結果封裝ResultSetHandler和DefaultResultSetHandler

(2)處理儲存過程執行後的輸出引數ResultSetHandler是一個介面,提供了兩個函式分別用來處理普通操作和儲存過程的結果,原始碼如下:/** * @author Clinton Begin */ public interface ResultSetHandler { <E> Li

MyBatis原始碼分析@ResultMap註解詳解

MyBatis原始碼分析之@ResultMap註解詳解 在前一篇文章講**@MapKey註解時,我原想將@ResultMap註解也一起拿出來說一下,但是發現@ResultMap解析載入原始碼非常多,想想就不在一篇文章中講了,分開單獨來說,這一篇就來徹底探索一下@ResultMap**

workerman原始碼分析啟動過程

PHP一直以來以草根示人,它簡單,易學,被大量應用於web開發,非常可惜的是大部分開發都在簡單的增刪改查,或者加上pdo,redis等客戶端甚至分散式,以及規避語言本身的缺陷。然而這實在太委屈PHP了。記得有一次問walker,PHP能做什麼?他說:什麼都能做啊!當時我就震驚了,這怎麼可能。。。直到後來一

MyBatis原始碼分析@SelectProvider註解使用詳解

MyBatis原始碼分析之@SelectProvider註解使用詳解 之前講了MyBatis的配置、plugin、Select查詢,還有@MapKey註解的使用與原理,還有返回@ResultMap等等,我原想直接從MyBatis的快取開始說起,但是想想還是得說一下MyBatis中的@

DataStage最佳實踐儲存過程呼叫

InfoSphere DataStage 是 IBM 統一資料整合平臺InfoSphere Information Server的重要元件,是業界主流的ETL(Extract, Transform, Load)軟體。 在之前的文章中,小編曾經介紹過DataStage不僅支援

Mybatis原始碼分析引數對映及處理ParameterHandler

ParameterHandler是用來設定引數規則的,當StatementHandler呼叫prepare方法之後,接下來就是呼叫它來進行設定引數。ParameterHandler介面:public interface ParameterHandler { Object

Memcached原始碼分析儲存機制Slabs(7)

文章列表: 《Memcached原始碼分析 - Memcached原始碼分析之總結篇(8)》前言 這一章我們重點講解Memcached的儲存機制Slabs。Memcached儲存Item的程式碼都是在slabs.c中來實現的。 在解讀這一章前,我們必須先了

mybatis原始碼分析:啟動過程

mybatis在開發中作為一個ORM框架使用的比較多,所謂ORM指的是Object Relation Mapping,直譯過來就是物件關係對映,這個對映指的是java中的物件和資料庫中的記錄的對映,也就是一個java物件對映資料庫中的一條記錄。瞭解了mybatis的背景及作用下面看mybatis的使用及從原始

死磕以太坊原始碼分析EVM如何呼叫ABI編碼的外部方法

> 死磕以太坊原始碼分析之EVM如何呼叫ABI編碼的外部方法 > > 配合以下程式碼進行閱讀:https://github.com/blockchainGuide/ > > 寫文不易,給個小關注,有什麼問題可以指出,便於大家交流學習。 > ![image-20210113