Mybatis原始碼分析之Mapper註冊與繫結

2021-09-24 03:55:34 字數 3483 閱讀 9836

mybatis 是乙個「面向 sql」的持久層框架,它可實現動態拼裝 sql,極其靈活,同時避免了幾乎所有的 jdbc **和手動設定引數以及獲取結果集,其外掛程式機制允許在已對映語句執行過程中的某一點進行攔截呼叫等等,讓我忍不住想要擼一擼它的原始碼。

首先我們來看看用 mybatis 執行 sql 的兩種方法

sqlsession sqlsession = mybatissqlsessionfactory.getsqlsession();

try  finally }

sqlsession sqlsession = mybatissqlsessionfactory.getsqlsession();

try  finally }

id="finduserbyid"

resulttype="com.objcoding.mybatis.user">

select * from user where user_id=#

select>

public sqlsessionfactory sqlsessionfactory

()throws exception 

@overridepublic sqlsessionfactory getobject() throws exception   return this.sqlsessionfactory;}
public sqlsessionfactory getobject

()throws exception 

return

this.sqlsessionfactory;

}

@overridepublic void afterpropertiesset() throws exception 

public

void

afterpropertiesset

()throws exception 

configuration configuration;

// 此處省略部分**

sqlsessionfactory sqlsessionfactory =this.sqlsessionfactorybuilder.build(configuration);

// 此處省略部分**

// 此處省略部分**

try  catch (exception e)  finally 

// 此處省略部分**

return sqlsessionfactory;}

if (!configuration.isresourceloaded(resource)) 

parsependingresultmaps();

parsependingcacherefs();

parsependingstatements();}

try 

builderassistant.setcurrentnamespace(namespace);

cacherefelement(context.evalnode("cache-ref"));

cacheelement(context.evalnode("cache"));

// 解析 xml 中的 sql 片段 

buildstatementfromcontext(context.evalnodes("select|insert|update|delete"));

} catch (exception e) }

string namespace = builderassistant.getcurrentnamespace();

if (namespace != null)  catch (classnotfoundexception e) 

if (boundtype != null) }}}

(classtype)

boolean loadcompleted = false;

try  finally }}}

()()

@suppresswarnings("unchecked")

protected t newinstance

public t newinstance

(sqlsession sqlsession)}

public object invoke

(object proxy, method method, object args)

throws throwable  else

if (isdefaultmethod(method)) 

} catch (throwable t) 

}

public object execute(sqlsession sqlsession, object args)     case update:     case delete:     case select:      // 此處省略部分**  }  return result;}

object result;

switch (command.gettype()) 

case update: 

case delete: 

case select:

// 此處省略部分**

}  return result;

}

if (configuration.hasstatement(statementid))  else

return

null;

}    if (declaringclass.isassignablefrom(superinte***ce)) 

}}  return

null;}

string resource = type.tostring();

if (!configuration.isresourceloaded(resource)) 

} catch (incompleteelementexception e) 

}}  parsependingmethods();}

class> parametertypeclass = getparametertype(method);

// 載入註解 @lang 的 languagedriver

languagedriver languagedriver = getlanguagedriver(method);

/*** 從方法獲取 sql 資源類 

*/sqlsource sqlsource = getsqlsourcefromannotations(method, parametertypeclass, languagedriver);

if (sqlsource != null) }

從以上原始碼分析過程得出:mybatis 在生成乙個 sqlsessionfactory 的過程中,主要幹了兩件事情:

Mybatis 原始碼分析

mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...

Mybatis原始碼分析

我們都知道mybatis它是一款優秀的持久層框架,它支援定製化sql 儲存過程以及高階對映,幫我們節省了許多時間與精力,今天我們主要來對mybatis的底層原始碼進行分析,主要是以下4行 首先呼叫resources中的單個string引數的getresuorceasstream string res...

MyBatis 原始碼分析

sqlsession inte ce,代表乙個連線資料庫的會話,提供了乙個預設的 defaultsqlsession sqlsessionfactory inte ct,建立 sqlsessionfactory 的工廠,提供了預設的 defaultsqlsessionfactory建立 defaul...