如何从PreparedStatementSetter的setValues()方法获取字符串 [英] How to fetch String from setValues() method of PreparedStatementSetter

查看:26
本文介绍了如何从PreparedStatementSetter的setValues()方法获取字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从ItemPreparedStatementSettersetValues()方法中提取一个字符串,它是我的SQL字符串。我想使用ItemWriterStringintosetSql()方法。有没有人能帮我做到这一点。 下面是我的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;
}

推荐答案

好,您没有以正确的方式实现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);

}
}

现在,您的批处理配置应该如下声明此编写器。

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

}
}

希望天气晴朗。

问候

这篇关于如何从PreparedStatementSetter的setValues()方法获取字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆