首先我們來看看用 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...