mybatis學習五之原始碼分析學習1

2021-09-29 21:34:03 字數 3795 閱讀 3715

一、準備工作,環境搭建

1.1 mybatis 配置

<?xml version="1.0" encoding="utf-8" ?>

listfindall();

}<?xml version="1.0" encoding="utf-8"?>

1.3 測試類

public class demo 

private static sqlsession getsqlsession() throws ioexception

}

1.4 測試執行,可以正常查詢資料

user

user

user

user

二、debug跟蹤原始碼2.1 sqlsession的獲取mybatis在運算元據庫前首先會先獲取sqlsession,它是mybatis和db溝通的橋梁。sqlsession的獲取過程如下。

2.1.1 載入資源檔案流。

inputstream inputstream = resources.getresourceasstream(resource);
2.1.2 根據檔案流獲取獲取sqlsessionfactory,sqlsessionfactory再生產出sqlsession。

sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);

return sqlsessionfactory.opensession();

2.2 debug
public class defaultsqlsession implements sqlsession
}

} private configuration config;

this.config = config;

}} else catch (exception var5) }}

}if (type.isinte***ce())

boolean loadcompleted = false;

try finally }}

}}resolverutil> resolverutil = new resolverutil();

resolverutil.find(new isa(supertype), packagename);

while(i$.hasnext())

}}}

} else catch (exception var5) }}

}public t newinstance(sqlsession sqlsession) }

2.2.7 繼續debug,呼叫findall()方法

重要**如下:

private static final long serialversionuid = -6424540398559729838l;

private final sqlsession sqlsession;

public object invoke(object proxy, method method, object args) throws throwable catch (throwable var5)

} else }}

}} }

public object execute(sqlsession sqlsession, object args) else if (sqlcommandtype.update == this.command.gettype()) else if (sqlcommandtype.delete == this.command.gettype()) else

if (this.method.returnsvoid() && this.method.hasresulthandler()) else if (this.method.returnsmany()) else if (this.method.returnsmap()) else }}

2.2.9 繼續f8 進入executeformany

判斷是否需要分頁,然後又把查詢的任務委託給了sqlsession的selectlist()繼續查詢。

private object executeformany(sqlsession sqlsession, object args)  else 

if (!this.method.getreturntype().isassignablefrom(result.getclass())) else

}

2.2.10 f7進入sqlsession的預設實現方法deafaultsession類中部分原始碼如下。首先deafaultsession物件從configuration中獲取到指定的statement,然後deafaultsession又將任務委託了executor介面物件的query()方法去執行。

public listselectlist(string statement, object parameter) 

public listselectlist(string statement, object parameter, rowbounds rowbounds) catch (exception var10) finally

return var6;

}

2.2.11 executor的query()方法

做的三件事情,1、繫結sql引數;2、建立快取key;3、執行query()方法。

boundsql boundsql = ms.getboundsql(parameterobject);

cachekey key = this.createcachekey(ms, parameterobject, rowbounds, boundsql);

return this.query(ms, parameterobject, rowbounds, resulthandler, key, boundsql);

}2.2.12 進入query方法。

進入的是executor的實現類baseexecutor的query()方法。然後呼叫呼叫的是queryfromdatabase()方法,該方法又進入了doquery()方法。後續就是一些類似於jdbc的複雜操作,進行connection、prepare、resultset之類的操作,不再跟蹤,太複雜了,後面再慢慢學習。

this.localcache.putobject(key, executionplaceholder.execution_placeholder);

list list;

try finally

this.localcache.putobject(key, list);

if (ms.getstatementtype() == statementtype.callable)

return list;

}

mybatis之原始碼閱讀記錄

使用mybatis已經有幾年了,之前只是在專案中配置和使用,但是沒有去追究它的內部實現的細節,後來也償試去學習原始碼,看過一些文章,但是不得入門。後來在mybatis官網的入門指引找找到了靈感,終於對mybatis的實現有了一定的理解 在mybatis的官網上介紹了我們在不依賴spring類容器的情...

(一) Mybatis 原始碼解析之原始碼概述

原始碼結構圖 基礎支撐層 技術元件專注於底層技術實現,通用性較強無業務含義 核心處理層 業務元件專注 mybatis 的業務流程實現,依賴於基礎支撐層 介面層 mybatis 對外提供的訪問介面,面向 sqlsession 程式設計 原始碼腦圖結構 原始碼結構圖 建議和腦圖一起看,了解每個包存在的意...

Linux學習之原始碼安裝

步驟 以nginx為例 2.檢視原始碼 我們看到,src目錄下都是.c或者是.h的檔案,是c語言的原始碼 src下的內容為 3.準備安裝環境 我們看到其原始碼是c語言,那麼我們要安裝gcc等工具 我們首先通過yum進行查詢yum grouplist 找到development tools然後檢視這個...