kagowu opened a new issue #2122: mybatis 多个参数的insert报错
URL: https://github.com/apache/incubator-shardingsphere/issues/2122
 
 
   ## Bug Report
   
   ### 1.版本?
                <dependency>
                        <groupId>io.shardingsphere</groupId>
                        
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                        <version>3.1.0</version>
                </dependency>
   
   mysql-connect-java 5.1.41
   mybatis 3.4.0
   
   ###2. 现象
   我使用的是mybatis 
   数据库是 mysql 
   mybatis的java mapper代码:
   int saveSyncPropertys(@Param("propertys") List<Property> 
propertys,@Param("updatedTime") Date updatedTime);
   
   mybatis的xml 配置文件(此处省略了其他字段):
   <insert id="saveSyncPropertys">
           insert into ms_property(companyUuid,createdTime) VALUES
           <foreach collection="propertys" item="obj" index="index" 
separator=",">
               (#{obj.companyUuid},
               ,#{updatedTime})
           </foreach>
           ON DUPLICATE KEY UPDATE
           updatedTime=**#{updatedTime},**
       </insert>
   ### 报错
   Caused by: java.sql.SQLException: No value specified for parameter 149
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
        at 
com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2211)
        at 
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2191)
        at 
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2121)
        at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1162)
        at 
com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493)
        at 
io.shardingsphere.shardingjdbc.executor.SQLExecuteCallbackFactory$2.executeSQL(SQLExecuteCallbackFactory.java:63)
        at 
io.shardingsphere.shardingjdbc.executor.SQLExecuteCallbackFactory$2.executeSQL(SQLExecuteCallbackFactory.java:59)
        at 
io.shardingsphere.core.executor.sql.execute.SQLExecuteCallback.execute0(SQLExecuteCallback.java:72)
        at 
io.shardingsphere.core.executor.sql.execute.SQLExecuteCallback.execute(SQLExecuteCallback.java:61)
        at 
io.shardingsphere.core.executor.ShardingExecuteEngine.syncGroupExecute(ShardingExecuteEngine.java:175)
        at 
io.shardingsphere.core.executor.ShardingExecuteEngine.groupExecute(ShardingExecuteEngine.java:152)
        at 
io.shardingsphere.core.executor.sql.execute.SQLExecuteTemplate.executeGroup(SQLExecuteTemplate.java:71)
        at 
io.shardingsphere.core.executor.sql.execute.SQLExecuteTemplate.executeGroup(SQLExecuteTemplate.java:54)
        at 
io.shardingsphere.shardingjdbc.executor.AbstractStatementExecutor.executeCallback(AbstractStatementExecutor.java:114)
        at 
io.shardingsphere.shardingjdbc.executor.PreparedStatementExecutor.execute(PreparedStatementExecutor.java:148)
        at 
io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.execute(ShardingPreparedStatement.java:137)
        at 
io.opentracing.contrib.jdbc.TracingPreparedStatement.execute(TracingPreparedStatement.java:177)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
   ### 换种写法
   <insert id="saveSyncPropertys">
           insert into ms_property(companyUuid,createdTime) VALUES
           <foreach collection="propertys" item="obj" index="index" 
separator=",">
               (#{obj.companyUuid},
               ,#{updatedTime})
           </foreach>
           ON DUPLICATE KEY UPDATE
           updatedTime=**CURRENT_DATE**
       </insert>
   
   就没有问题了。
   
   
   所以关键是最后这个@Param("updatedTime") 莫名其妙丢失了。
   
   检查了底层的方法
   
com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2211)
   
   batchedParameterStrings.length=149 
   但是第149个元素是null:
   batchedParameterStrings[148]=null
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to