一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 深入淺析Mybatis的缺陷問題

深入淺析Mybatis的缺陷問題

2020-06-28 12:04java教程網 JAVA教程

Mybatis是業界非常流行的持久層框架,輕量級、易用,在金融IT領域完全是領軍地位,比Hibernate更受歡迎,優勢非常多,也是非常值得我們學習的。這篇文章主要介紹了Mybatis的缺陷問題的相關資料,需要的朋友可以參考下

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

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

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

?
1
2
3
4
5
6
// 3.3.0
Statement prepare(Connection connection)
throws SQLException;
// 3.4.0
Statement prepare(Connection connection, Integer transactionTimeout)
throws SQLException;

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

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

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

假設我針對3.3.0版本實現了一個插件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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的批量執行,看下面的一個JDBC例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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, "數據" + random);//FIELD_NAME2
ps.setString(3, "參數" + random);//FIELD_NAME3
ps.addBatch();
}
int[] rs = ps.executeBatch();
}finally{
try{
ps.close();
}catch(Exception e){}
}
}

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 乳环贵妇堕落开发调教番号 | 欧美亚洲国产另类 | 99爱在线精品视频免费观看9 | 喜欢老头吃我奶躁我的动图 | 国产中文字幕 | 男人j进女屁股视频在线观看 | 日韩国产成人精品视频人 | 厨房play黄瓜进入 | 亚洲另类老妇videos | 三级理论在线播放大全 | 免费高清在线观看 | 国产免费小视频 | 掰开逼操| 精品国产91久久久久久久 | 久久不射视频 | 性色香蕉AV久久久天天网 | 欧美日韩一区二区综合在线视频 | 亚洲AV午夜福利精品香蕉麻豆 | 欧美香蕉 | 男人猛戳女人下部30分钟 | 91亚洲专区 | 9999网站| 欧美日韩一区二区中文字幕视频 | 国语对白做受xxxx | 99久精品 | 无码一区国产欧美在线资源 | 国产久视频 | 免费免费啪视频在线观播放 | 日本视频在线观看 | 91tv在线观看 | 日韩欧美国产一区二区三区 | 99这里只有精品66视频 | 婷婷网址 | 精品亚洲欧美中文字幕在线看 | 久久综合狠狠综合狠狠 | 日本不卡一区二区三区在线观看 | 日韩在线一区二区三区免费视频 | 欧美日韩国产手机在线观看视频 | 从后面撕开老师的丝袜动态图 | 亚洲欧美国产在线 | 人禽l交视频在线播放 视频 |