2016-07-01 2 views
1

JDBCTemplate query()를 사용하여 레코드를 가져오고 Map으로 매개 변수 바인딩을 전달하려고합니다. MySQL은 ArrayIndeOutOfBoundException을 던지고있다. 아래는 스택 추적입니다. 여기 Spring JDBCTemplate Mysql throwing MySQL 드라이버에서 ArrayIndxOutofBound

Exception in thread "main" org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [select * from customers where cid= :cid]; 

Invalid argument value: java.lang.ArrayIndexOutOfBoundsException; nested exception is java.sql.SQLException: Invalid argument value: 

java.lang.ArrayIndexOutOfBoundsException 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:777) 
    at com.jlcnindia.spring.jdbc.JdbcCustomerDAO.getCustomerByCid(JdbcCustomerDAO.java:32) 
    at com.jlcnindia.spring.jdbc.Lab58.main(Lab58.java:14) 
Caused by: java.sql.SQLException: Invalid argument value: java.lang.ArrayIndexOutOfBoundsException 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872) 
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3887) 
    at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3603) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:428) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:166) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:66) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:47) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:686) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) 
    ... 6 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 
    at com.mysql.jdbc.PreparedStatement.setBinaryStream(PreparedStatement.java:2871) 
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3884) 
    ... 14 more 

쿼리를

public CustomerTO getCustomerByCid(int cid) { 
    String sql="select * from customers where cid=:cid"; 

    Map<String,Object> parameters=new HashMap<String, Object>(); 
    parameters.put("cid", cid); 

    List<CustomerTO> list=jdbcTemp.query(sql, new CustomerRowMapper(),parameters); 
    if(null!=list && !list.isEmpty()) 
    return list.get(0); 
    return null; 
} 

CustomerTO 클래스

package com.jlcnindia.spring.jdbc; 

public class CustomerTO { 
private int cid; 
private String cname; 
private String email; 
private long phone; 
private String city; 


public CustomerTO(){} 

public CustomerTO(String cname, String email, long phone, String city) { 
    super(); 
    this.cname = cname; 
    this.email = email; 
    this.phone = phone; 
    this.city = city; 
} 




public int getCid() { 
    return cid; 
} 


public void setCid(int cid) { 
    this.cid = cid; 
} 


public String getCname() { 
    return cname; 
} 


public void setCname(String cname) { 
    this.cname = cname; 
} 


public String getEmail() { 
    return email; 
} 


public void setEmail(String email) { 
    this.email = email; 
} 


public long getPhone() { 
    return phone; 
} 


public void setPhone(long phone) { 
    this.phone = phone; 
} 


public String getCity() { 
    return city; 
} 


public void setCity(String city) { 
    this.city = city; 
} 

public String toString(){ 
    return cid+"\t"+cname+"\t"+email+"\t"+phone+"\t"+city; 
} 

} 
를 호출 내 RowMapper의 클래스

package com.jlcnindia.spring.jdbc; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import org.springframework.jdbc.core.RowMapper; 

public class CustomerRowMapper implements RowMapper<CustomerTO> { 

@Override 
public CustomerTO mapRow(ResultSet rs, int rn) throws SQLException { 
    System.out.println("mapping "); 
    CustomerTO cto=new CustomerTO(); 
    cto.setCid(rs.getInt(1)); 
    cto.setCname(rs.getString(2)); 
    cto.setEmail(rs.getString(3)); 
    cto.setPhone(rs.getLong(4)); 
    cto.setCity(rs.getString(5)); 
    return cto; 

} 

}

다오 방법입니다3210

내가 사용한다면? 대신 명명 된 매개 변수의 그것은 잘 작동하고 나에게 결과를주고있다

public CustomerTO getCustomerByCid(int cid) { 
    String sql="select * from customers where cid=?"; 
    List<CustomerTO> list=jdbcTemp.query(sql, new CustomerRowMapper(),cid); 
    if(null!=list && !list.isEmpty()) 
    return list.get(0); 
    return null; 
} 

다음과 같이 쿼리 PARAMATERS 대신에 CID를 통과하지만 난 매개 변수 맵을 전달하면 나는 예외가 위와 같이. 이해하기

수없는 이유

UPDATE

봄 JBDC 템플릿 구성

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
<property name="url" value="jdbc:mysql://localhost/jlcindiadb"/> 
<property name="username" value="****"/> 
<property name="password" value="***"/> 
</bean> 
<bean id="jdbcTemp" class="org.springframework.jdbc.core.JdbcTemplate"  autowire="constructor"> 
<constructor-arg ref="dataSource"/> 
</bean> 
<bean id="jdbcCustomerDAO" class="com.jlcnindia.spring.jdbc.JdbcCustomerDAO"/> 
+0

'PreparedStatement'가 어디에 있는지 알 수 없지만 0이나 1에서 매개 변수 색인을 시작하고 있습니까? (하나 여야합니다). –

+0

봄 jdbc 템플릿 기본 jdbc .. 봄 구성에 대한 위의 내 업데이트를 참조하십시오 – Zulfi

답변

2

JdbcTemplate을 명명 된 매개 변수를 지원하지 않습니다. 그게 ... NamedParameterJdbcTemplate이 필요합니다.

당신이 전화하는거야 방법은 that one입니다 :

당신이 보는대로, 인수로 매개 변수 값을 사용,
public <T> List<T> query(String sql, 
         RowMapper<T> rowMapper, 
         Object... args) 

. 따라서 실제로는 쿼리의 고유 인덱스 된 매개 변수로 Map을 전달하지만 쿼리에는 매개 변수 자리 표시자가 없으므로 예외가 발생합니다.

+0

덕분에 많이 .. Logged – Zulfi

관련 문제