java - JDBI 插入问题

标签 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 个左右的参数可以为空或空白。值的顺序仍然是静态的(即,如果传递 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. 

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

最佳答案

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

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();

也就是说,最好按名称而不是使用索引来绑定(bind)每个参数。

关于java - JDBI 插入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21347091/

相关文章:

Java抽象类定义数组大小

mysql - 医患预约数据库结构

MySQL 多主复制多位置

java - "No mapper registered for java.util.Optional"使用 JDBI v2 和 java.util.Optional

java - Java/Android 的基本问题

java - Apache Lucene 中的单词关联搜索

java - 在 java 中序列化 Float 以供 C++ 应用程序读取的最佳方法?

mysql - 如何使用 ssh 从命令行执行 init 脚本

java - 在 java 中概括并记录 SQL 查询

java - @Bind 可以使用 JDBI 与枚举和其他任意类型一起使用吗?