繁体   English   中英

Java准备的语句查询返回错误,但是如果我将其打印并直接在数据库上执行,它将起作用

[英]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表,其中有两个名为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(")");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM