2013-03-19 5 views
1

Я хочу получить строку из setValues() метода ItemPreparedStatementSetter, которая является моей строкой SQL. Я хочу использовать этот String в setSql() метод ItemWriter. Может ли кто-нибудь помочь мне в этом. Ниже мой PreparedStatementSetter класс:Как получить String из метода setValues ​​() PreparedStatementSetter

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

Оператор подготовки представляет собой объект, представляющий предкомпилированную инструкцию SQL. в основном вы не должны генерировать sql в ItemPreparedStatementSetter; установите sql в ItemWriter перед любой вставкой или если это невозможно достичь, сгенерируйте его за пределами ItemPreparedStatementSetter, imho вы не должны генерировать sql, как это – user1121883

ответ

0

ОК, вы не реализуете ваш PreparedStatementSetter правильный путь.

Все, что вам нужно сделать, это объявить ваш SQL в конфигурации ItemWriter или в реализации itemWriter.

Я предполагаю, что вы используете 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); 

} 
} 

Теперь ваша партия конфигурации должен объявить этот писатель, как это.

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

И, наконец,

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

} 
} 

Надеется, что это ясно.

С уважением

+0

Как установить значения, если 'MyDomainObj' имеет« Список »другого типа объекта домена« MyDomainObj2 » 'и нужно, чтобы' INSERT' все значения для этого от одного до многих, т. е. мне нужно установить 'ps' для каждого объекта в этом списке и несколько значений из' MyDomainObj'. С простым jdbc я использовал для перебора списка и использовал метод 'addBatch' и, наконец, выполнил пакет. Как это сделать здесь? –

Смежные вопросы