开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

mybatis+ojdbc6.jar的一个奇怪问题记录

简介:
+关注继续查看

使用以下代码、配置时,发生异常。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface IRowPropSubInfoMapper {
    /**
     * 将数据写入行基础信息子表中
     *
     * @author 團長
     * @since 2013-12-19
     * @param row
     *            行基础信息。
     * @return 插入的行数
     * @throws SQLException
     *             数据库操作发生异常时将抛出此异常。
     * @deprecated 2013-12-19 改用批量操作
     */
    @Deprecated
    public int insertRowPropSubInfo(IRowPropSubInfoModel row)
            throws SQLException;
}


mybatis的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<settings>
    <!-- 全局映射器启用缓存 -->
    <setting name="cacheEnabled" value="true" />
    <!-- 查询时,关闭关联对象即时加载以提高性能 纳闷,加上这一行会报错。 <setting name="lazyLoadingEnabled"
        value="true" /> -->
    <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
    <setting name="aggressiveLazyLoading" value="true" />
    <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
    <setting name="multipleResultSetsEnabled" value="true" />
    <!-- 允许使用列标签代替列名 -->
    <setting name="useColumnLabel" value="true" />
    <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
    <setting name="useGeneratedKeys" value="true" />
    <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
    <setting name="autoMappingBehavior" value="FULL" />
    <!-- 对于批量更新操作缓存SQL以提高性能 -->
    <setting name="defaultExecutorType" value="REUSE" />
    <!-- 数据库超过25000毫秒仍未响应则超时 -->
    <setting name="defaultStatementTimeout" value="25000" />
</settings>


sql语句配置(sql语句中配置的参数个数,即values中的参数个数,小于等于7个时则可以正常执行;大于7个时将抛出异常。异常信息见后续。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<insert id="insertRowPropSubInfo"
    parameterType="com.sinosig.evaluation.fcff.model.dto.IRowPropSubInfoModel">
    insert into
    t_eva_fcff_row_property values
    (#{fcffid,jdbcType=INTEGER},
    #{code,jdbcType=VARCHAR},
    #{name,jdbcType=VARCHAR},
    #{description,jdbcType=VARCHAR},
    #{isshow,jdbcType=VARCHAR},
    #{currentPremethodCode,    jdbcType=VARCHAR},
    #{currentPreValue, jdbcType=VARCHAR},
    #{currentScaleBase,    jdbcType=VARCHAR},
    #{warningDescription, jdbcType=VARCHAR})
</insert>


spring类配置:

1
2
3
4
5
<bean id="RowPropSubInfoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"
    parent="BaseMybatisDao">
    <property name="mapperInterface"
        value="com.sinosig.evaluation.fcff.dao.IRowPropSubInfoMapper" />
</bean>


数据源配置:

1
2
3
4
5
6
7
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@10.10.164.115:1521:ceshidb" />
    <property name="username" value="atip" />
    <property name="password" value="atip" />
</bean>


测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
public void testInsert() {
    List<IRowPropSubInfoModel> rowList = initRowList();
    try {
        int count = 1;
        for (IRowPropSubInfoModel iRowSubInfoModel : rowList) {
            System.out.println(count++);
            System.out.println("fcffid = " + iRowSubInfoModel.getFcffid());
            System.out.println("code = " + iRowSubInfoModel.getCode());
            System.out.println("name = " + iRowSubInfoModel.getName());
            System.out.println("description = "
                    + iRowSubInfoModel.getDescription());
            System.out.println("isshow = " + iRowSubInfoModel.getIsshow());
            System.out.println("currentPremethodCode = "
                    + iRowSubInfoModel.getCurrentPremethodCode());
            System.out.println("currentPreValue = "
                    + iRowSubInfoModel.getCurrentPreValue());
            System.out.println("currentScaleBase = "
                    + iRowSubInfoModel.getCurrentScaleBase());
            System.out.println("warningDescription = "
                    + iRowSubInfoModel.getWarningDescription());
            mapper.insertRowPropSubInfo(iRowSubInfoModel);
        }
    catch (SQLException e) {
        e.printStackTrace();
        fail();
    }
}


异常信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: java.lang.ArrayIndexOutOfBoundsException: 9
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
    at $Proxy5.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:236)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:79)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
    at $Proxy31.insertRowPropSubInfo(Unknown Source)
    at test.com.sinosig.evaluation.fcff.dao.RowPropSubInfoMapperTest.testInsert(RowPropSubInfoMapperTest.java:69)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: java.lang.ArrayIndexOutOfBoundsException: 9
    at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:91)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:54)
    at org.apache.ibatis.executor.ReuseExecutor.prepareStatement(ReuseExecutor.java:73)
    at org.apache.ibatis.executor.ReuseExecutor.doUpdate(ReuseExecutor.java:46)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:108)
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:145)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:134)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)
    ... 29 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 9
    at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
    at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)
    at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1212)
    at oracle.jdbc.driver.T4CPreparedStatement.<init>(T4CPreparedStatement.java:28)
    at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3140)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3042)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5890)
    at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:508)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:400)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53)
    at $Proxy32.prepareStatement(Unknown Source)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:65)
    at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:82)
    ... 41 more


改用ojdbc14-10.2.0.1.0.jar则不会出现上述问题。



本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/winters1224/1357930,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java学习路线-60:spring 整合 mybatis
Java学习路线-60:spring 整合 mybatis
15 0
Java学习路线-60:spring 整合 mybatis
Java学习路线-60:spring 整合 mybatis
19 0
Java学习路线-65:整合 SSM-Spring+SpringMVC+MyBatis
Java学习路线-65:整合 SSM-Spring+SpringMVC+MyBatis
8 0
Java学习路线-60:spring 整合 mybatis
Java学习路线-60:spring 整合 mybatis
13 0
Java学习路线-60:spring 整合 mybatis
Java学习路线-60:spring 整合 mybatis
24 0
Java学习路线-60:spring 整合 mybatis
Java学习路线-60:spring 整合 mybatis
14 0
Java编程——如何用Maven搭建SpringMVC+Spring+MyBatis框架
  先说说三大框架整合过程 。个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助。不过,如果用都不会,谈思想就变成纸上谈兵了!!! 先技术,再思想。
1789 0
JavaEE Mybatis使用
1. Mybatis官网 下载地址 解压之后的内容: 图1.png Mybatis框架结构: 图2.png 简要概述: SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
938 0
SSM-Spring-22:Spring+Mybatis+JavaWeb的整合
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     众所周知,框架Spring来整合别的框架,但是Mybatis出现的晚,Spring就没有给他提供支持,那怎么办呢?Mybatis说,我吃点亏,我给你提供整合的jar,所以那个整合的jar包就叫mabatis-spring。
1245 0
mybatis学习教程(一)JDBC到mybatis
     定义: 写作时间:2015年8月27日11:15:50 mybatis是一个java持久层框架,java中操作关系型 数据库用的是jdbc,mybatis是对jdbc的一个封装。
1518 0
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载