[英]java prepared statement query is returning an error but If I print it and execute on the database directly it works
我有以下代码宁静的代码,它们试图从XML文件创建查询并将其添加到批处理中,因此我可以执行大批量执行,但由于不断收到错误而对我不起作用,因此我尝试执行未经批处理的preparestatement,并且不断收到错误消息:
“您的SQL语法有错误;请在与MySQL服务器版本相对应的手册中找到在第1行'dept_no,dept_name VALUES('d009','客户服务')'附近使用的正确语法”
尽管当我调试代码时,我得到的是准备好的语句中的查询是INSERT INTO departments 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(")");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.