如何解决 hsqldb 中的 SQLSyntaxErrorException?

Posted

技术标签:

【中文标题】如何解决 hsqldb 中的 SQLSyntaxErrorException?【英文标题】:How can I solve SQLSyntaxErrorException in hsqldb? 【发布时间】:2017-03-11 08:05:08 【问题描述】:

我尝试使用嵌入在程序中的 HSQLDB。

但是,当我在数据库中创建表并插入数据时,出现错误。

以下是错误消息的一部分。

java.sql.SQLSyntaxErrorException: unexpected token: MAR required: )
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)

当我在数据库中插入一些数据时会发生这种情况。

这是我的 CREATE 语句。

stmt.execute("CREATE TABLE IF NOT EXISTS readability ( id INTEGER NOT NULL IDENTITY,"
  + "LOC INTEGER DEFAULT NULL, " + "numOfComments INTEGER DEFAULT NULL,"
  + "numOfBlankLines INTEGER DEFAULT NULL," + "numOfBitOperators INTEGER DEFAULT NULL,"
  + "readability double DEFAULT NULL," + "username varchar(255) DEFAULT NULL,"
  + "storedTime datetime DEFAULT NULL," + "methodname varchar(255) DEFAULT NULL,"
  + "classname varchar(255) DEFAULT NULL," + "patternrate double DEFAULT NULL,"
  + "maxNestedControl INTEGER DEFAULT NULL," + "programVolume double DEFAULT NULL,"
  + "entropy double DEFAULT NULL,"
  + "CONSTRAINT username FOREIGN KEY (username) REFERENCES user (username) ON DELETE NO ACTION ON UPDATE NO ACTION"
  + ");");

这是我的 INSERT 语句。

stmt.executeUpdate(
  "INSERT INTO readability (LOC, numOfComments, numOfBlankLines, numOfBitOperators,"
  + " readability, username, storedTime, methodname, classname, patternRate, maxNestedControl, programVolume, entropy) VALUES("
  + readability.getLOC() + ", " + readability.getNumOfComments() + ", "
  + readability.getNumOfBlankLines() + ", " + readability.getNumOfBitOperators() + ", "
  + readability.getReadability() + ", '" + readability.getUser().getUsername() + "', "
  + readability.getStoredTime() + ", '" + readability.getMethodName() + "', '"
  + readability.getClassName() + "', " + readability.getPatternRate() + ", "
  + readability.getMaxNestedControl() + ", " + readability.getProgramVolume() + ", "
  + readability.getEntropy() + ")",
  Statement.RETURN_GENERATED_KEYS);

对象可读性具有使用的所有属性。

【问题讨论】:

哦,对不起,我会修改它。 不要将字符串连接到 SQL 语句中。使用PreparedStatement 代替`INSERT 语句。 不要将值连接到查询字符串中。您的代码容易受到 SQL 注入的影响,这也可能是导致错误的原因。 Use a prepared statement 带有参数占位符并使用适当的设置器设置值。 【参考方案1】:

不要将值连接到查询字符串中。您的代码容易受到 SQL 注入的影响,这也可能是导致错误的原因。 Use a prepared statement 带有参数占位符并使用适当的设置器设置值。

然后您的代码会变成这样(为简洁起见,省略了很多列):

try (PreparedStatement insert = connection.prepareStatement(
        "insert into readability (LOC, username) values (?, ?)", 
        Statement.RETURN_GENERATED_KEYS)) 
    insert.setInt(readability.getLOC();
    insert.setString(readibility.getUser().getUsername());

    insert.executeUpdate();

    // handle generated keys...

您可能还想考虑使用像 Hibernate 这样的 ORM。

【讨论】:

非常感谢。根据你的回答我可以解决这个问题。

以上是关于如何解决 hsqldb 中的 SQLSyntaxErrorException?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 hsqldb 中的默认数据库/模式

如何设置连接 URL 以连接到 HSQLDB 中的多个数据库

如何解决 org.apache.commons.dbcp.SQLNestedException

如何将多个数据库( hsqldb、mysql )与单独文件中的 DB 设置连接起来

如何在 Spring Boot 测试中连接到内存中的 HSQLDB 以进行查询

如何在 HSQLDB 和 C# .net 之间建立连接?