最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析Mybatis的缺陷問題

 更新時間:2016年10月30日 11:14:28   投稿:mrr  
Mybatis是業(yè)界非常流行的持久層框架,輕量級、易用,在金融IT領域完全是領軍地位,比Hibernate更受歡迎,優(yōu)勢非常多,也是非常值得我們學習的。這篇文章主要介紹了Mybatis的缺陷問題的相關資料,需要的朋友可以參考下

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

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

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

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

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

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

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

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

@Intercepts({ 
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class })
})
public class StatementHandlerInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}

然后,升級為3.4.0,結果呢,編譯一直正常,但是等到運行,卻拋出異常了。

4.Mybatis的緩存簡直就是雞肋,而且不管有沒有配置需要使用緩存、是否更新緩存,都要去計算CacheKey,不使用緩存、也不更新緩存的情況下,這種計算完全是浪費。

5.Mybatis的批量執(zhí)行,看下面的一個JDBC例子:

public void testJdbcBatch(Connection conn) throws Exception {try{
conn.setAutoCommit(false);
batchUpdate(conn);
clearTestData(conn);
conn.commit();
conn.setAutoCommit(true);
}catch(Exception e){
conn.rollback();
throw e;
}
}
private void clearTestData(Connection conn) throws SQLException {
PreparedStatement ps = null;
try{
ps = conn.prepareStatement("delete TABLE_NAME1 where FIELD_NAME1 = ? ");
ps.setString(1, "TEST");
int d = ps.executeUpdate();
System.out.println("delete counts : " + d);
}finally{
try{
ps.close();
}catch(Exception e){}
}
}
private void batchUpdate(Connection conn) throws SQLException {
PreparedStatement ps = null;
try{
String sql = "INSERT INTO TABLE_NAME2(FIELD_NAME1, FIELD_NAME2, FIELD_NAME2)VALUES(?,?,?)";
ps = conn.prepareStatement(sql);
for(int i = 0; i < 10; i++){
String random = RandomStringUtils.randomAlphabetic(8);
ps.setString(1, "TEST");//FIELD_NAME1
ps.setString(2, "數(shù)據(jù)" + random);//FIELD_NAME2
ps.setString(3, "參數(shù)" + random);//FIELD_NAME3
ps.addBatch();
}
int[] rs = ps.executeBatch();
}finally{
try{
ps.close();
}catch(Exception e){}
}
}

代碼沒有什么違和感,能夠執(zhí)行正常,也可以按預期的回滾,也就是說同一個事務中的同一個connection,可以同時運行普通sql和batch,但是你在同一個事務的SqlSession中試試,反饋給你的是——不能在同一個事務中切換執(zhí)行方式!

6、數(shù)據(jù)庫產(chǎn)品的兼容性:Mybatis把SQL的控制權交給了開發(fā)人員,于是從道德上占據(jù)了制高點——你寫的不兼容,那是你自己的水平不行!但,這是一個真正的優(yōu)秀框架的正確姿勢嗎?為什么就不能提供一些輔助性的兼容實施?比如說在Oracle中被奉為神明的DECODE函數(shù),是否可以在SqlMapper中提供一個<decode>標簽,在后面默默的修改成CASE WHEN?或者說,官方不提供沒有關系,但你得提供擴展方式啊,于是又回到了:擴展性非常差,擴展性非常差,擴展性非常差。重要的事說三遍,但,我已經(jīng)說六遍了。

以上所述是小編給大家介紹的Mybatis的缺陷問題,希望對大家有所幫助!

相關文章

  • MybatisPlus實現(xiàn)數(shù)據(jù)權限隔離的示例詳解

    MybatisPlus實現(xiàn)數(shù)據(jù)權限隔離的示例詳解

    Mybatis Plus對Mybatis做了無侵入的增強,非常的好用,今天就給大家介紹它的其中一個實用功能:數(shù)據(jù)權限插件,感興趣的可以跟隨小編一起了解下
    2024-04-04
  • idea打包不出現(xiàn)target的原因及解決

    idea打包不出現(xiàn)target的原因及解決

    文章主要介紹了在使用Maven進行項目打包時,`packaging` 屬性的重要性和配置方法,默認情況下,Maven會將項目打包成jar包,如果項目是父級項目,則`packaging`屬性應設置為`pom`,并通過`modules`標簽引入子項目,這樣可以確保項目的模塊化管理和正確的構建順序
    2024-11-11
  • JPA如何將查詢結果轉換為DTO對象

    JPA如何將查詢結果轉換為DTO對象

    這篇文章主要介紹了JPA如何將查詢結果轉換為DTO對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java異常詳解_動力節(jié)點Java學院整理

    Java異常詳解_動力節(jié)點Java學院整理

    異常是Java語言中的一部分,它代表程序中由各種原因引起的“不正?!币蛩?。下面通過本文給大家介紹java異常的相關知識,感興趣的朋友一起看看吧
    2017-06-06
  • Java中stream處理中map與flatMap的比較和使用案例

    Java中stream處理中map與flatMap的比較和使用案例

    這篇文章主要介紹了Java中stream處理中map與flatMap的比較和使用案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • SpringBoot跨域Jsonp和Cors的方法

    SpringBoot跨域Jsonp和Cors的方法

    這篇文章主要介紹了SpringBoot跨域Jsonp和Cors的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java8新特性之Lambda表達式淺析

    Java8新特性之Lambda表達式淺析

    這篇文章主要介紹了Java8新特性之Lambda表達式,本文著重講解了Lambda表達式的語法部份,需要的朋友可以參考下
    2014-06-06
  • 通過Java實現(xiàn)自己動手寫ls命令

    通過Java實現(xiàn)自己動手寫ls命令

    在前面的文章中,我們仔細的介紹了關于ls命令的使用和輸出結果,在本篇文章當中我們用Java代碼自己實現(xiàn)ls命令,更加深入的了解ls命令
    2022-10-10
  • java操作elasticsearch的案例解析

    java操作elasticsearch的案例解析

    這篇文章主要介紹了java操作elasticsearch的案例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • JWT令牌的工作原理詳解

    JWT令牌的工作原理詳解

    這篇文章主要介紹了JWT令牌的工作原理詳解,在認證的時候,當用戶用他們的的憑證成功登錄以后,一個JSON?Web?Token將會被返回,此后,用戶名和密碼就不再是用戶的憑證,而token是用戶用來訪問資源的新憑證了,需要的朋友可以參考下
    2023-08-08

最新評論

黄骅市| 普宁市| 抚顺市| 盖州市| 汕头市| 上虞市| 镇坪县| 红河县| 玉溪市| 六枝特区| 连江县| 长岛县| 孝感市| 威远县| 衡山县| 开封市| 昌江| 南郑县| 原阳县| 榆树市| 永寿县| 赤壁市| 丰城市| 内江市| 兴安盟| 高密市| 神木县| 汤原县| 泰和县| 莒南县| 汝阳县| 石狮市| 淮阳县| 巩义市| 合肥市| 巴东县| 孝感市| 伊春市| 留坝县| 咸丰县| 玉龙|