java prepared语句查询返回一个错误,但如果我打印它并直接在数据库上执行,它就会工作
我有下面的代码,它试图从XML文件创建查询并将其添加到批处理中,这样我就可以执行大批量执行,但它对我不起作用,因为我一直收到一个错误,因此我尝试在不进行批处理的情况下执行preparedstatement,并一直收到一个错误,即: “您的SQL语法有错误;请检查以下手册: 对应于您的MySQL服务器版本,以便使用正确的语法 第行“部门编号、部门名称值('d009’、'Customer Service')”附近 1“ 虽然调试代码时,我发现准备好的语句中的查询是java prepared语句查询返回一个错误,但如果我打印它并直接在数据库上执行,它就会工作,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,我有下面的代码,它试图从XML文件创建查询并将其添加到批处理中,这样我就可以执行大批量执行,但它对我不起作用,因为我一直收到一个错误,因此我尝试在不进行批处理的情况下执行preparedstatement,并一直收到一个错误,即: “您的SQL语法有错误;请检查以下手册: 对应于您的MySQL服务器版本,以便使用正确的语法 第行“部门编号、部门名称值('d009’、'Customer Service')”附近 1“ 虽然调试代码时,我发现准备好的语句中的查询是插入到departments dep
插入到departments dept\u no,dept\u name value('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;
}
public void invokePreparedStatement(QueryBuilder QueryBuilder){
queryRunner=新的queryRunner();
StringBuilder查询=新建StringBuilder();
append(“插入到”+queryBuilder.getTableName());
QName列;
字符串值;
对于(int i=0;i
假设您的queryBuilder
有一个名为T
的表,有两列名为A
和B
。生成的SQL是:
插入到T A,B值(?,)
这是无效的语法,因为列名必须位于()
:
插入T(A,B)值(?,)
这正是错误消息所说的,当它说问题在A
附近时,因为A(
就在那里缺失了。不仅是“附近”,而且就在那里
与其测试大小-1
,我建议按如下方式编码:
StringBuilder查询=新建StringBuilder();
query.append(“插入到”)
.append(queryBuilder.getTableName())
.附加(“(”);
对于(int i=0;i
假设您的queryBuilder
有一个名为T
的表,其中有两列名为A
和B
。生成的SQL是:
插入到T A,B值(?,)
这是无效的语法,因为列名必须位于()
:
插入T(A,B)值(?,)
这正是错误消息所说的,当它说问题在A
附近时,因为A(
就在那里缺失了。不仅是“附近”,而且就在那里
与其测试大小-1
,我建议按如下方式编码:
StringBuilder查询=新建StringBuilder();
query.append(“插入到”)
.append(queryBuilder.getTableName())
.附加(“(”);
对于(int i=0;i
在哪里绑定参数?在哪里/何时设置位置参数?我没有看到任何setXXX
调用,例如setInteger
或setString
etc@javadba您可以在第二个for循环末尾的buildQuery方法中找到,我怀疑这一行,但想不出更好的方法以动态方式设置定位参数的方法,因为每次调用查询时可能会有不同数量的参数在哪里绑定参数?您实际在哪里/何时设置定位参数?我没有看到任何setXXX
调用,例如setInteger
或setString
etc@java你可以吗