MyBatis+Oracle時出現的錯誤: Method oracle/jd…

2020-04-11 16:05:18來源:博客園 閱讀 ()

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

MyBatis+Oracle時出現的錯誤: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract

今天在看MyBatis時,準備寫一個Demo來驗證看完TypHandler源碼后的想法,可是demo剛一跑起來就報下面的錯了。

 

 

 

 隨手在網上搜了一遍,都說是版本不匹配;就是不明白怎么個不匹配法;可是好奇心驅使我就想看看怎么個不匹配法。

先把我自己的代碼貼在這。

 maven依賴:

 1  <dependency>
 2             <groupId>mysql</groupId>
 3             <artifactId>mysql-connector-java</artifactId>
 4             <version>8.0.18</version>
 5         </dependency>
 6 
 7         <dependency>
 8             <groupId>com.oracle</groupId>
 9             <artifactId>ojdbc14</artifactId>
10             <version>10.2.0.4.0</version>
11         </dependency>
12         <!--<dependency>
13             <groupId>com.oracle</groupId>
14             <artifactId>ojdbc6</artifactId>
15             <version>1.0</version>
16         </dependency>-->
17 
18         <dependency>
19             <groupId>org.mybatis</groupId>
20             <artifactId>mybatis</artifactId>
21             <version>3.5.3</version>
22         </dependency>
View Code

入口類

 1 public static void main(String[] args) throws Exception{        
 2         test2();
 3     }
 4 
 5 private static void test2() throws Exception{
 6         SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
 7         SqlSessionFactory sqlSessionFactory=builder.build(Resources.getResourceAsStream("mybatis-oracle-config.xml"),"dev");
 8         SqlSession sqlSession=sqlSessionFactory.openSession();
 9         IUserMapper userMapper=sqlSession.getMapper(IUserMapper.class);
10         List<User> list=userMapper.getUserList();
11         for (User user1 : list) {
12             System.out.println(user1.toString());
13         }
14         sqlSession.close();
15     }
View Code

至于mybatis配置文件和具體的實體類就不貼了,不影響我表達。

從日志里面可以看到是在DefaultResultSetHandler.java的352行處報錯。

管他三七二一,直接點擊報錯處撒個斷點,然后跑一下demo.

 

resultSet是指向OracleResultSetImpl.java這個類的(準確的說是類對象),我們先點isClosed()方法,讓他直接跳轉到定義出。

 

 

 

 

 直接跳轉到了JDK的ResultSet.java中了,看來是有繼承了。繼續點isClosed()左側的向下繼承的箭頭。

 

 

 我們發現isClosed()這個方法沒有在OracleResultSetImpl類中去繼承和實現這個方法。

從上面的圖中就能看到在Oracle的驅動程序里面根本就沒有任何一個類實現了isClosed()這個方法。

所以運行到此處自然拋異常。

 

接下來吧oracle的依賴換成如下:

<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
        </dependency>

 

 

 從調試界面可以看到resultSet指向ForwardOnluResultSet這個類。

 

 這個類中依然沒有isClosed()這個方法,猜測可能是從父類中繼承過來的。

從下圖右側的依次往上面找,終于在OracleResultSet.clss中找到了這個方法。

 

 

 

現在關于這個錯誤的追蹤終于告一段落了。

現在看起來排查錯誤是一件很簡單的事情,實際上當時都累死了。


原文鏈接:https://www.cnblogs.com/guoyansi19900907/p/12681222.html
如有疑問請與原作者聯系

標簽:forSQL版本COMPSgroup

版權申明:本站文章部分自網絡,如有侵權,請聯系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點,本站所提供的攝影照片,插畫,設計作品,如需使用,請與原作者聯系,版權歸原作者所有

上一篇:不了解jdbc,何談Mybatis的源碼解析?

下一篇:萬字長文帶你入門Zookeeper!!!

宅男午夜福利美女来袭