Mybatis是業(yè)界非常流行的持久層框架,輕量級、易用,在金融IT領(lǐng)域完全是領(lǐng)軍地位,比Hibernate更受歡迎,優(yōu)勢非常多,也是非常值得我們學(xué)習(xí)的。但Mybatis并不盡善盡美,其自身的設(shè)計、編碼也還有許多不足,甚至是缺陷,這篇文章來簡要討論一下這些缺陷:

1.Mybatis使用DTD作為XML配置文件的校驗文件,但是很明顯,DTD差不多是快被淘汰的技術(shù)了,功能非常有限,擴(kuò)展性非常差,擴(kuò)展性非常差,擴(kuò)展性非常差,可讀性也不好,Spring能夠從DTD到XSD華麗轉(zhuǎn)身,但Mybatis始終沒這個魄力。

2.版本兼容性做的不好,就拿3.3.0—>3.4.0來說,按業(yè)界通用規(guī)范,第2級版本號升級,可以添加功能,但是要保證向下兼容性,然而Mybatis的做法并不完全是這樣的,看一下關(guān)鍵接口StatementHandler的關(guān)鍵方法prepare:

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

// 3.3.0Statement prepare(Connection connection)      throws SQLException;// 3.4.0Statement prepare(Connection connection, Integer transactionTimeout)      throws SQLException;

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

這里沒有添加一個方法,而是直接在原方法中添加了一個參數(shù)!類似例子還有不少,就不一一列舉了。

3.Mybatis的插件,采用一個通用的Interceptor接口,配以@Intercepts、@Signature等注解,實現(xiàn)對多個組件的多種方法的攔截,看似非常靈活,在我看來其實是結(jié)構(gòu)不夠清晰,實際開發(fā)時,你會把對StatementHandler和ResultSetHandler的攔截增強(qiáng)放在一個類里面嗎?不會是吧(會?你當(dāng)單一職責(zé)原則、開閉原則都是狗屎嗎),那有什么必要強(qiáng)制使用同一個接口呢?

另外,使用@Signature注解來設(shè)別需要被攔截的組件方法,如果注解有錯,編譯也是不會報錯的,而只能等到運行時才能發(fā)現(xiàn),再看上面的例子:

假設(shè)我針對3.3.0版本實現(xiàn)了一個插件:

網(wǎng)友評論