在java中运行sql而不是在heidisql中运行sql时,sql语法出错

tyg4sfes  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(431)

我试图在一个表上运行insert或update—当copy粘贴到heidisql中时,从下面生成的字符串可以正常工作,但是抛出 SQLSyntaxErrorExceptions 从java运行时:

Statement statement = con.createStatement();
String escapedXML = EscapeString(billboard.getXml());
String sql = String.format(
    "DELIMITER $ \r\nBEGIN NOT ATOMIC\r\n" +
    "IF EXISTS(SELECT * FROM billboards where Name='%s') THEN UPDATE billboards SET XML='%s' where Name='%s';\r\n" +
    "ELSE insert into billboards(Name, XML, CreatorName) values('%s', '%s', '%s');\r\n" +
    "END IF;\r\n" +
    "END $\r\n" +
    "DELIMITER ;", billboard.getName(), escapedXML, billboard.getName(), billboard.getName(), escapedXML, billboard.getCreatorName());
// Insert or update billboard
statement.execute(sql);

我不明白为什么。

qvsjd97n

qvsjd97n1#

我建议使用 insert ... ok duplicate key 语法而不是代码块。这样效率更高,只需一条语句就可以实现锁定,这样可以避免从php代码运行查询时遇到的问题。

insert into billboards(Name, XML, CreatorName) 
values(?, ?, ?)
on duplicate key update set XML = values(XML)

为此,需要对列设置唯一(或主键)约束 Name .
另外,考虑使用参数化查询而不是在查询中串联变量stringw escaping效率低下,也不会真正使代码更安全。

mrzz3bfm

mrzz3bfm2#

你应该试试 NamedParameterStatement 使用您的查询以方便设置字符串参数并避免它们的重复(使用gmb先前回答中建议的重构查询):

String sql = "INSERT INTO billboards (Name, XML, CreatorName) VALUES (:name, :xml, :creator) "
             + "ON DUPLICATE KEY UPDATE SET XML = :xml";

NamedParameterStatement statement = new NamedParameterStatement(con, sql);
statement.setString("name", billboard.getName());
statement.setString("xml", EscapeString(billboard.getXml()));
statement.setString("creator", billboard.getCreatorName());

// Insert or update billboard
statement.execute(sql);
up9lanfz

up9lanfz3#

出现语法错误的原因是 DELIMITER 是mysql客户机命令,而不是sql语句。mysql命令不能与jdbc一起使用。
更多信息:
mysql中的分隔符

相关问题