JDBI插入问题

时间:2014-01-25 05:34:47

标签: java mysql jdbi

我正在使用JDBI将一些数据插入到具有自动增量主键的mysql表中。我使用索引来插入。代码如下所示:

public void insertWorkout(String[] values) {
    String insertString = "insert into workouts(<column_names>) values(:0,: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)";
    Update pUpdate = handle.createStatement(insertString);

    for(int i=0; i<vals.length;i++) {
        pUpdate.bind(i, vals[i]);
    }

    pUpdate.execute();
}

这一段时间以来一直运行正常,因为values[]始终是正确的计数(32)并且参数始终处于相同的顺序。现在虽然它必须处理传递一个较小的数组(18,19或20)并仍然正确插入;最后14个左右的args可以为空或空白。值的顺序仍然是静态的(即,如果传递18列,则它是表中的前18列),最后20列是int(11)列。

现在当它传递一个小于32的数组时,会出现如下错误:

org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: Unable to execute, no named parameter matches "20" and no positional param for place 20 (which is 21 in the JDBC 'start at 1' scheme) has been set. 

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

只要列排序是静态的并且缺少的列都是数据库中的int类型,您应该能够为每个剩余的缺失参数绑定一个null。这样的事情应该有效:

String insertString = "insert into workouts....."
Update pUpdate = handle.createStatement(insertString);

for(int i=0; i<vals.length;i++) {
        pUpdate.bind(i, vals[i]);
}

if (values.length < 32) {
    for(int i =(32 - values.length); i<32;i++) {
        pUpdate.bindNull(i, java.sql.Types.INTEGER);
    }
}

pUpdate.execute();

这就是说最好按名称绑定每个参数而不是使用索引。