今天在看MyBatis時,準備寫一個Demo來驗證看完TypHandler源碼後的想法,但是demo剛一跑起來就報下面的錯了。java
隨手在網上搜了一遍,都說是版本不匹配;就是不明白怎麼個不匹配法;但是好奇心驅使我就想看看怎麼個不匹配法。mysql
先把我本身的代碼貼在這。sql
maven依賴:mybatis
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>
入口類oracle
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 }
至於mybatis配置文件和具體的實體類就不貼了,不影響我表達。app
從日誌裏面能夠看到是在DefaultResultSetHandler.java的352行處報錯。maven
管他三七二一,直接點擊報錯處撒個斷點,而後跑一下demo.ide
resultSet是指向OracleResultSetImpl.java這個類的(準確的說是類對象),咱們先點isClosed()方法,讓他直接跳轉到定義出。ui
直接跳轉到了JDK的ResultSet.java中了,看來是有繼承了。繼續點isClosed()左側的向下繼承的箭頭。spa
咱們發現isClosed()這個方法沒有在OracleResultSetImpl類中去繼承和實現這個方法。
從上面的圖中就能看到在Oracle的驅動程序裏面根本就沒有任何一個類實現了isClosed()這個方法。
因此運行到此處天然拋異常。
接下來吧oracle的依賴換成以下:
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>1.0</version> </dependency>
從調試界面能夠看到resultSet指向ForwardOnluResultSet這個類。
這個類中依然沒有isClosed()這個方法,猜想多是從父類中繼承過來的。
從下圖右側的依次往上面找,終於在OracleResultSet.clss中找到了這個方法。
如今關於這個錯誤的追蹤終於告一段落了。
如今看起來排查錯誤是一件很簡單的事情,實際上當時都累死了。