2013-03-19 4 views
1

setValues() 메서드 ItemPreparedStatementSetter의 문자열 인 SQL 문자열을 가져 오려고합니다. 이 StringItemWritersetSql() 방법에 사용하고 싶습니다. 누군가가이 일을 성취하도록 도와 줄 수 있습니까?PreparedStatementSetter의 setValues ​​() 메서드에서 문자열을 가져 오는 방법

public class PreparedStatementSetter implements 
    ItemPreparedStatementSetter<Object>{ 

public static final int INT = 4; 
public static final int STRING = 12; 

public void setValues(Object item, PreparedStatement ps) 
     throws SQLException{ 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    Map<String, Object> map = (LinkedHashMap) item; 
    int i = 0; 
    String columnType; 
    String sql=""; 
    String final_sql; 

    try { 
     sql=generateSql(); 

    } catch (ParserConfigurationException e) { 

     e.printStackTrace(); 
    } catch (SAXException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

    int len=map.size(); 

    for(int k=0 ; k<len ; k++) 
    { 
     sql=sql+","+"?"; 
    } 
    sql=sql+")"; 

    // i want to use this final_sql string in setsql() method of itemwriter 

    final_sql=sql.replaceFirst("," , " "); 

    for (Map.Entry<String, Object> entry : map.entrySet()) { 

     i++; 
     columnType = entry.getKey().substring(0, 
       (entry.getKey().indexOf("_"))); 

     switch (Integer.parseInt(columnType)) { 
      case INT: { 
        ps.setInt(i, (Integer) (entry.getValue())); 
        break; 
      } 
      case STRING: { 
        ps.setString(i, (String) (entry.getValue())); 
        break; 
      } 
     } 
    } 
} 

private String generateSql() 
throws ParserConfigurationException, SAXException, IOException 
{  
    String sql=""; 
    Insert insert; 
    String table=""; 
    try 
    { 
     File is = new File("C:/Users/AMDecalog.Trainees/workspace/SpringJobExecuter/config/input1.xml"); 
     JAXBContext context = JAXBContext.newInstance(Insert.class); 
     Unmarshaller unmarshaller = context.createUnmarshaller(); 
     insert = (Insert) unmarshaller.unmarshal(is);    
     Insert in = insert; 
     List<String> into = in.getInto().getTablename(); 

     for(String s : into) 
     { 
      table = table+s; 
      System.out.println(table); 
     } 

     sql = "insert into" + " " + table + " " + "values("; 
     System.out.println(sql); 
    } 
    catch (JAXBException e) 
    { 
     e.printStackTrace(); 
    } 
    return sql; 
} 
+1

prepare 문은 미리 컴파일 된 SQL 문을 나타내는 개체입니다. 기본적으로 ItemPreparedStatementSetter에서 SQL을 생성하면 안됩니다. 삽입하기 전에 ItemWriter에 sql을 설정하십시오. 그렇지 않으면 달성 할 수없는 경우 ItemPreparedStatementSetter 외부에서 생성하십시오. imho와 같은 sql을 생성하면 안됩니다. – user1121883

답변

0

OK, 당신은 당신의 PreparedStatementSetter 올바른 방법을 구현하지 않습니다 다음은 내 PreparedStatementSetter 클래스입니다.

당신이해야 할 일은 ItemWriter 구성이나 itemWriter 구현에서 SQL을 선언하는 것뿐입니다.

난 당신이 JdbcBatchItemWriter를 사용하는 가정합니다 :

public class MyItemWrtier extends JdbcBatchItemWriter<MyDomainObj> implements InitializingBean{ 



@Override 
public void afterPropertiesSet() throws Exception { 
     // set the SQL 

    String SQL= "UPDATE MYTABLE WHERE FIELD1 = ? AND FIELD2 = ?" 

    super.setSql(SQL); 

} 
} 

지금, 당신의 배치 설정은 다음과 같이이 작가를 선언해야한다.

@Component("myPreparedStatementSetter") 
public class MyPreparedStatementSetter implements ItemPreparedStatementSetter<MyDomainObj> { 



public void setValues(MyDomainObj obj, PreparedStatement ps) throws SQLException { 
    ps.setString(1, obj.getsometing()); 
    ps.setString(2, obj.getsometingElse()); 

} 
} 

<bean id="myItemWriter" class="xxx.yyy.MyItemWriter"> 
    <property name="dataSource" ref="dataSourceIemt" /> 
    <property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" /> 
</bean> 

그리고 마지막으로, 그것은 분명하다 바랍니다.

감사합니다.

+0

'MyDomainObj'가 다른 도메인 객체 유형의'List'를 갖는 경우 값 설정 방법은 무엇입니까? MyDomainObj2 '이 매핑을 위해 모든 값을 INSERT하는 것이 필요합니다. 즉, 그 목록에있는 각 객체에 대해'ps'를 설정하고'MyDomainObj'에서 값을 거의 설정하지 않아야합니다. 일반 jdbc에서는 목록을 반복하고'addBatch' 메서드를 사용하여 마지막으로 batch를 실행했습니다. 어떻게 할 수 있니? –

관련 문제