今天在看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>
入口类
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配置文件和具体的实体类就不贴了,不影响我表达。
从日志里面可以看到是在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中找到了这个方法。
现在关于这个错误的追踪终于告一段落了。
现在看起来排查错误是一件很简单的事情,实际上当时都累死了。