java 准备好的语句查询返回错误,但如果我打印它并直接在数据库上执行,它就可以工作

标签 java mysql prepared-statement

我有以下和平代码,它试图从 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 的表,有两列名为 AB 。那么生成的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/

相关文章:

java - MySQL JDBC 驱动程序中的客户端仿真准备语句

java - H2 DB 校对

java - Android 应用程序通过不可靠的网络处理写入请求

php - 更新超过三行时mysqli stmt错误?

mysql - 创建临时表后表不存在

php - 准备好的语句 - 行数

prepared-statement - Couchbase 的准备语句的正确语法是什么?

java - Hibernate Spring JPA javax.persistence.TransactionRequiredException : No transactional EntityManager available

java - Servlet的OnClick > 需要从数据库中取出特定人的数据并显示在JSP上

php - 如何在 PHP/MYSQL 中将两个 mysql 查询作为一个执行?