• 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中找到了这个方法。

     

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

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

  • 相关阅读:
    python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
    python打包为exe文件
    文件自定义扫描工具
    pandas 的常用方法
    cisco应用
    Cisco 模拟配置
    python 识别图片上的数字
    OpenSSL
    OpenSSL
    OpenSSL
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/12681222.html
Copyright © 2020-2023  润新知