mybatis getMapper()方法原始碼解析

2021-10-12 10:23:03 字數 2097 閱讀 4159

public

(class

type, sqlsession sqlsession)

trycatch

(exception e)

}

@override

public object invoke

(object proxy, method method, object[

] args)

throws throwable

else

if(method.

isdefault()

)else}}

catch

(throwable t)

(method)

;execute

(sqlsession, args)

;}

首先是通過反射判斷呼叫的是不是object 的方法,如果是,invoke object 的方法

再判斷是不是default 方法,介面的default方法

最後才是執行請求資料庫的方法

public object execute

(sqlsession sqlsession, object[

] args)

case update:

case delete:

case select:

//首先判斷是不是有返回值

if(method.

returnsvoid()

&& method.

hasresulthandler()

)else

if(method.

returnsmany()

)else

if(method.

returnsmap()

)else

if(method.

returnscursor()

)else

}break

;case flush:

result = sqlsession.

flushstatements()

;break

;default

:throw

newbindingexception

("unknown execution method for: "

+ command.

getname()

);}if

(result == null && method.

getreturntype()

.isprimitive()

&&!method.

returnsvoid()

)return result;

}

再execute 方法裡面,主要的就是乙個switch 對command.gettype() 進行區分

可以看到這裡的 case 包括 unknown, insert, update, delete, select, flush

接下來,以查詢舉例

case select:

//首先判斷是不是有返回值

if(method.

returnsvoid()

&& method.

hasresulthandler()

)else

if(method.

returnsmany()

)else

if(method.

returnsmap()

)else

if(method.

returnscursor()

)else

}break

;

判斷是不是返回值為多條,返回值是不是map,是不是游標,

如果說都不是,那就是 selectone ,然後執行到selectone 這個方法,而這個selectone方法是sqlsession呼叫的,

而這個 sqlsession 預設使用的執行器是 ******executor ,這樣依賴這個方法就與筆者《mybatis 核心流程原始碼分析》的流程關聯起來的,

具體後續請見《mybatis 核心流程原始碼分析》一文

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...