我把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()返回字符串,包含英语(从左到右)和波斯语(从右到左)。
当我的querydata.get(i).getContext()返回“دانلودکرکبازیghost recon”时,我的Stringbuilder添加了它。我的结果如下所示。
INSERT IGNORE INTO查询(上下文,类别,通用性,新鲜度,TokenCount,类型)值(‘پخشزندهفوتبال’,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)。
发布于 2012-12-31 20:32:00
就我看来,字符串的内容在逻辑顺序上没有什么问题,可能会让您感到困惑的是,打印双向文本时呈现它的方式。如果您将鼠标拖到字符串上,您可以通过选择跳转的方式来查看哪些文本串正在以哪种主要方向呈现。
如果我用换行符分隔这些值集,我会得到
INSERT IGNORE INTO查询(上下文、类别、通用性、新鲜度、TokenCount、类型)值
(‘پخشزندهفوتبال’,2,1.0,0.0,2,1),
(‘عکسهایجشنوارهفیلمفجر’,2,1.0,0.0,2,1),
我不确定您在浏览器中看到了什么,但在我的浏览器中,它将INSERT INTO ... VALUES行视为LTR,然后将后续行视为主要是RTL,但不包括包含ghost recon的行。下面是在波斯语脚本部分周围插入了Unicode从左到右标记(U+200E)的相同字符串,以强制将引号和括号视为LTR:
INSERT IGNORE INTO查询(上下文、类别、通用性、新鲜度、TokenCount、类型)值
(‘عکسهایجشنوارهفیلمفجر’,2,1.0,0.0,2,1),
(‘نتایجلیگبرتر’,2,1.0,0.0,2,1),
(‘دانلودکرکبازی幽灵侦察’,2,1.0,0.0,2,1)。
但我也同意this answer的观点,即您应该考虑使用PreparedStatement而不是使用StringBuilder构建SQL,以防止SQL注入攻击(或模糊错误),以防您的任何上下文字符串包含撇号(这种情况比您认为的更常见)。
发布于 2012-12-31 20:04:00
我不确定你的问题到底是问什么,但你真的应该考虑使用批插入工具来做这么大的插入。它在内存、速度和安全性方面都会更好。看看SpringSource的JdbcTemplate和它的batchUpdate方法。下面是取自谷歌搜索的一个简单的例子。
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();
}
});
}https://stackoverflow.com/questions/14101265
复制相似问题