[英]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.