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...