Spring batch 如何从PreparedStatementSetter的setValues()方法获取字符串
我想从Spring batch 如何从PreparedStatementSetter的setValues()方法获取字符串,spring-batch,Spring Batch,我想从ItemPreparedStatementSetter的setValues()方法中获取一个字符串,它是我的SQL字符串。我想将这个字符串用于ItemWriter的setSql()方法。有人能帮我做到这一点吗。 下面是我的PreparedStatementSetter类: public class PreparedStatementSetter implements ItemPreparedStatementSetter<Object>{ public static
ItemPreparedStatementSetter
的setValues()
方法中获取一个字符串,它是我的SQL
字符串。我想将这个字符串
用于ItemWriter
的setSql()
方法。有人能帮我做到这一点吗。
下面是我的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实现
ItemPreparedStatementSetter{
公共静态最终整数=4;
公共静态最终整型字符串=12;
公共void集合值(对象项,PreparedStatement ps)
抛出SQLException{
@SuppressWarnings({“rawtypes”,“unchecked”})
映射映射=(LinkedHashMap)项;
int i=0;
字符串列类型;
字符串sql=“”;
字符串final_-sql;
试一试{
sql=generateSql();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
int len=map.size();
对于(int k=0;kOK),您没有以正确的方式实现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);
}
}
公共类MyItemWrtier扩展JdbcBatchItemWriter实现初始化Bean{
@凌驾
public void afterPropertieSet()引发异常{
//设置SQL
String SQL=“更新MYTABLE,其中FIELD1=?和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());
}
}
@组件(“myPreparedStatementSetter”)
公共类MyPreparedStatementSetter实现ItemPreparedStatementSetter{
public void setValues(MyDomainObj obj,PreparedStatement ps)抛出SQLException{
ps.setString(1,obj.getsometing());
ps.setString(2,obj.getsometingElse());
}
}
希望这是清楚的
prepare语句是一个表示预编译SQL语句的对象。基本上,您不应该在ItemPreparedStatementSetter中生成SQL;在任何插入之前在ItemWriter上设置SQL,或者如果无法实现,请在ItemPreparedStatementSetter之外生成SQL,那么您不应该像这样生成SQL如何设置值ifMyDomainObj
有一个另一个域对象类型的List
,需要的是INSERT
这个一对多映射的所有值,也就是说,我必须为列表中的每个对象设置ps
,并从MyDomainObj
中设置几个值。使用普通的jdbc,我曾经迭代列表并使用>添加batch
方法并最终执行batch。如何在此处执行?