2014-01-25 11 views
2

JDBI를 사용하여 일부 데이터를 자동 증가 기본 키가있는 mysql 테이블에 삽입하고 있습니다. 삽입을하기 위해 색인을 사용했습니다. 코드는 다음과 같습니다 :이 잠시 때문에 values[]을 위해 잘 작동하고있다JDBI 삽입 문제

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

항상 정확한 수 (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. 

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

0

열 순서가 정적이고 누락 된 열이 모두 DB에있는 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(); 

그런데 인덱스를 사용하는 대신 이름별로 각 인수를 바인딩하는 것이 가장 좋습니다.