我在java中与StringBuilder混淆了。 我的代码在这里:
StringBuilder cmdB = new StringBuilder(
"INSERT IGNORE INTO Query ( context, category, generality, freshness, TokenCount, type) VALUES ");
for (int i = 0; i < querydata.size(); i++) {
if (i == 0)
cmdB.append("('");
else
cmdB.append(",('");
cmdB.append(querydata.get(i).getContext() + "',"
+ querydata.get(i).getCategory() + ","
+ querydata.get(i).getGenerality() + ","
+ querydata.get(i).getFreshness() + ","
+ querydata.get(i).getTokenCount() + ","
+ querydata.get(i).getType());
cmdB.append(")");
}
cmdB.append(";");
我有Mysql作为数据库,想要创建插入1000行的字符串。 querydata.get(i).getContext()返回String并包含英语(左向右)和波斯语(从右到左语言)。
当我的querydata.get(i).getContext()返回“دانلودکرکبازیghost recon”时,我的Stringbuilder将其添加到其中。我的结果如下所示。
INSERT IGNORE INTO Query(上下文,类别,一般性,新鲜度,TokenCount,类型)VALUES('پخشزندهفوتبال',2,1.0,0.0,2,1),('عکسهایجشنوارهفیلمفجر',2,1.0 ,0.0,2,1),('نتایجلیگبرتر',2,1.0,0.0,2,1),('دانلودکرکبازیghost recon',2,1.0,0.0,2,1)。
答案 0 :(得分:2)
根据逻辑顺序,字符串的内容没有任何实际问题,据我所知,你可能会感到困惑的是你在呈现双向文本的方式打印出来。如果您将鼠标拖到字符串上,您可以通过选择的方式看到正在呈现哪些文本行以及哪个主要方向性。
如果我使用换行符分隔值集合
INSERT IGNORE INTO Query(上下文,类别,通用性,新鲜度,TokenCount,类型)VALUES
('پخشزندهفوتبال',2,1.0,0.0,2,1),
('عکسهایجشنوارهفیلمفجر',2,1.0,0.0,2,1),
('نتایجلیگبرتر',2,1.0,0.0,2,1),
('دانلودکرکبازیghost recon',2,1.0,0.0,2,1)。
我不确定您在浏览器中看到了什么,但在我的浏览器中将INSERT INTO ... VALUES
行视为LTR,然后是后续行,但不包括以ghost recon
为主的RTL。这是与波斯语脚本部分周围插入的Unicode从左到右标记(U+200E
)的相同字符串,以强制将周围的引号和括号视为LTR:
INSERT IGNORE INTO Query(上下文,类别,通用性,新鲜度,TokenCount,类型)VALUES
('پخشزندهفوتبال',2,1.0,0.0,2,1),
('عکسهایجشنوارهفیلمفجر',2,1.0,0.0,2,1),
('نتایجلیگبرتر',2,1.0,0.0,2,1),
('دانلودکرکبازیghost recon',2,1.0,0.0,2,1)。
换句话说 - 不用担心,数据库将包含正确的东西。
但我同意this answer您应该考虑使用PreparedStatement
而不是使用StringBuilder
构建SQL,以防止SQL注入攻击(或模糊错误),以防任何你的上下文字符串包含撇号(这种情况比你认为的更频繁)。
答案 1 :(得分:1)
我不确定你在问题中究竟是什么问题,但你应该考虑使用批量插入工具来做这么大的插入。它在内存,速度和安全性方面会更好。查看SpringSource的JdbcTemplate及其batchUpdate方法。以下是从google搜索中获取的简单示例...
public void insertBatch(final List<Customer> customers){
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Customer customer = customers.get(i);
ps.setLong(1, customer.getCustId());
ps.setString(2, customer.getName());
ps.setInt(3, customer.getAge() );
}
@Override
public int getBatchSize() {
return customers.size();
}
});
}