gpt4 book ai didi

java - JDBI 插入问题

转载 作者:行者123 更新时间:2023-11-29 03:36:10 33 4
gpt4 key购买 nike

我正在使用 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com