MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract

今天在看MyBatis时,准备写一个Demo来验证看完TypHandler源码后的想法,可是demo刚一跑起来就报下面的错了。

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第1张图片

 

 

 

 随手在网上搜了一遍,都说是版本不匹配;就是不明白怎么个不匹配法;可是好奇心驱使我就想看看怎么个不匹配法。

先把我自己的代码贴在这。

 maven依赖:

 1  
 2             mysql
 3             mysql-connector-java
 4             8.0.18
 5         
 6 
 7         
 8             com.oracle
 9             ojdbc14
10             10.2.0.4.0
11         
12         
17 
18         
19             org.mybatis
20             mybatis
21             3.5.3
22         
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 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.

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第2张图片

 

resultSet是指向OracleResultSetImpl.java这个类的(准确的说是类对象),我们先点isClosed()方法,让他直接跳转到定义出。

 

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第3张图片

 

 

 

 直接跳转到了JDK的ResultSet.java中了,看来是有继承了。继续点isClosed()左侧的向下继承的箭头。

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第4张图片

 

 

 我们发现isClosed()这个方法没有在OracleResultSetImpl类中去继承和实现这个方法。

从上面的图中就能看到在Oracle的驱动程序里面根本就没有任何一个类实现了isClosed()这个方法。

所以运行到此处自然抛异常。

 

接下来吧oracle的依赖换成如下:

<dependency>
            <groupId>com.oraclegroupId>
            <artifactId>ojdbc6artifactId>
            <version>1.0version>
        dependency>

 

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第5张图片

 

 从调试界面可以看到resultSet指向ForwardOnluResultSet这个类。

MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第6张图片

 

 这个类中依然没有isClosed()这个方法,猜测可能是从父类中继承过来的。

从下图右侧的依次往上面找,终于在OracleResultSet.clss中找到了这个方法。

 MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract_第7张图片

 

 

现在关于这个错误的追踪终于告一段落了。

现在看起来排查错误是一件很简单的事情,实际上当时都累死了。

你可能感兴趣的:(MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract)