mybatis核心元件之MapperMethod

2021-09-14 01:41:35 字數 3672 閱讀 7347

execute執行

執行sqlsessiontemplate中的方法

注釋:跟蹤sql語句的原始碼過程

// mybatis-spring
public object invoke(object proxy, method method, object args) throws throwable  catch (throwable var5) 

} else

}

先判斷執行的方法是不是object類的方法,比如tostringhashcode等方法,是的話則直接反射執行這些方法

// 根據方法從快取中獲取

// 不存在則建立乙個

// 放入快取

}}}判斷sql的執行型別,執行相應的方法

}抽出這一段**跟蹤一下原始碼

// 其他型別

param = this.method.convertargstosqlcommandparam(args);

result = sqlsession.selectone(this.command.getname(), param);

paramnameresolver.getnamedparams

public object convertargstosqlcommandparam(object args)
解析@param註解

namessortedmap,在建構函式中賦值的,判斷入參有沒有@param註解。

key是入參的順序,從0開始;value@param中的值

如果沒有@param註解,則value值為arg0arg1

將入參名與值匹配

public object getnamedparams(object args)  else 

}return param;

}} else

}

示例1:多個入參,沒有加@param註解

@select("select count(0) from es_inter_invokfaillog where rownum = # and invok_type=#")

public integer selectany(int num,string type);

這樣執行sql會報錯,找不到num,可以改為##

示例2:多個入參,加@param註解

示例3:多個入參,部分加@param註解,部分不加

提示:只有乙個入參時不存在這些問題,因為乙個入參直接返回的是它的值,是乙個string不是map這裡的sqlsession就是sqlsessiontemplate,mybatis與spring的整合之sqlsessiontemplate

public t selectone(string statement, object parameter)
sqlsessionproxy是動態**生成的,每一次執行方法時都會重新去new乙個defaultsqlsession,可以看下invoke方法部分**

// 獲取session,這裡有個事物的判斷

sqlsession sqlsession = sqlsessionutils.getsqlsession(sqlsessiontemplate.this.sqlsessionfactory, sqlsessiontemplate.this.executortype, sqlsessiontemplate.this.exceptiontranslator);

try

}

MyBatis核心元件Executor(一)

executor 是mybaits核心介面之一,定義了資料庫操作最基本的方法,sqlsession的功能都是基於它來實現的。這裡我們由上述executor類的query方法來了解下它的基礎實現類baseexecutor類 這裡它在查詢之前會先判斷是否設定了禁用一級快取,要是禁用的話,它在去快取之前會...

MyBatis核心之介面呼叫

在平時開發中,我們一般使用mybatis是這樣的 建立乙個介面 此處暫時忽略mybatis載入配置檔案的過程 public void update user user 配置乙個xml檔案 user name pass word where id 到這裡,就有乙個問題,介面是不能例項化的,那麼我們是怎...

NGUI核心元件之UIAtlas

uiatlas是乙個容器,他包含了許多sprite的座標資訊。如果你對這個概念不是很熟悉,你可以這樣理解 與使用很多小的貼圖來渲染ui相比,使用一張包含了所有小貼圖的大貼圖的效率要高許多。這些小的貼圖就被叫做sprite,這個大的貼圖就被叫做atlas。在使用ngui渲染任何東西之前,首先需要建立乙...