我有以下和平代码,它试图从 XML 文件创建查询并将其添加到批处理中,以便我可以执行大批量执行,但它对我不起作用,因为我不断收到错误,所以我尝试了在不进行批处理的情况下执行准备好的语句并不断收到错误消息:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dept_no, dept_name VALUES ('d009', 'Customer Service')' at line 1"
虽然当我调试代码时,我发现准备好的语句中的查询是 INSERT INTO Department dept_no, dept_name VALUES ('d009', 'Customer Service')
我不知道发生了什么有人可以建议并帮助我使其大批量执行吗?
这是我有的方法:
public void invokePreparedStatement(QueryBuilder queryBuilder) {
queryRunner = new QueryRunner();
StringBuilder query = new StringBuilder();
query.append("INSERT INTO " + queryBuilder.getTableName());
QName columns;
String values;
for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
columns = (queryBuilder.getColumns().get(i));
query.append(" " + columns.toString());
if (i != queryBuilder.getColumns().size() - 1)
query.append(", ");
else
query.append(" VALUES (");
}
for (int i = 0; i < queryBuilder.getValues().size(); i++) {
query.append("?");
if (i != queryBuilder.getValues().size() - 1)
query.append(", ");
else
query.append(")");
}
try {
PreparedStatement preparedStatement = connection.prepareStatement(query.toString());
StringBuilder s = new StringBuilder();
preparedStatement = buildQuery(queryBuilder, preparedStatement);
preparedStatement.execute();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public PreparedStatement buildQuery(QueryBuilder queryBuilder, PreparedStatement ps) throws SQLException {
StringBuilder query = new StringBuilder("INSERT INTO ");
query.append(queryBuilder.getTableName() + " (");
QName columns;
String values;
int counter;
for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
getCoulmnAndValue(queryBuilder, query, i);
if (i != queryBuilder.getColumns().size() - 1)
query.append(", ");
else
query.append(") VALUES (");
}
for (int i = 0; i < queryBuilder.getValues().size(); i++) {
values = (queryBuilder.getValues().get(i));
query.append(values);
if (i != queryBuilder.getValues().size() - 1)
query.append(", ");
else
query.append(")");
counter = i + 1;
ps.setObject(counter, values);
}
return ps;
}
最佳答案
假设您的 queryBuilder
有名为 T
的表,有两列名为 A
和B
。那么生成的SQL是:
INSERT INTO T A, B VALUES (?, ?)
这不是有效的语法,因为列名必须位于 ()
中:
INSERT INTO T (A, B) VALUES (?, ?)
这正是错误消息所说的内容,它说问题接近 A
,因为 (
就在那里丢失了。不仅仅是“附近”,而是就在那里。
而不是测试 size - 1
,我建议编码如下:
StringBuilder query = new StringBuilder();
query.append("INSERT INTO ")
.append(queryBuilder.getTableName())
.append(" (");
for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
if (i != 0)
query.append(", ");
query.append(queryBuilder.getColumns().get(i));
}
query.append(") VALUES (");
for (int i = 0; i < queryBuilder.getValues().size(); i++) {
if (i != 0)
query.append(", ");
query.append("?");
}
query.append(")");
关于java 准备好的语句查询返回错误,但如果我打印它并直接在数据库上执行,它就可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43932860/