如何使用JDBC引用/转义列名称等标识符?

时间:2010-01-10 19:04:43

标签: java jdbc

不同的数据库服务器使用不同的方式来引用和转义标识符。

E.g。 “foo bar”vs“foo bar”vs [foo bar],或“10”“”vs“10 \”“,或者某些数据库需要引用FooBar或数组等标识符,而其他数据库则不需要引用。

是否有任何API方法可以为给定的数据库连接正确执行引用/转义?或者任何替代解决方案?

3 个答案:

答案 0 :(得分:12)

看看

DatabaseMetaData.getIdentifierQuoteString()

我从未使用它,但听起来不错:-)

getExtraNameCharacters()也可以提供一些帮助

答案 1 :(得分:3)

我认为您的问题的答案是,如果您使用JDBC编写数据库中立的应用程序,那么您需要使用数据库中立名称,而不是每个数据库供应商需要特殊转义的内容。

在JDBC中我没有任何支持它的东西。 ORM产品将处理这些事情。

编辑:如果您正在编写ORM,那么我认为每个受支持的数据库需要一个单独的SQL生成类,只是为了处理所涉及的各种语法,因此您必须编写它。您当然可以查看各种开源ORM的源代码,看看它们是如何处理的。

答案 2 :(得分:1)

从Java 9开始,Statement接口提供了多种引擎特定的引用方法:

  • enquoteIdentifier用于SQL标识符(例如,架构,表,列名)
  • enquoteLiteral用于字符串文字(例如,char,varchar,文本文字)
  • enquoteNCharLiteral(代表国家字符集文字)
Statement stmt = connection.createStatement();
String query = String.format(
        "SELECT id FROM %s WHERE name = %s",
        stmt.enquoteIdentifier("table", false),
        stmt.enquoteLiteral("it's"));
ResultSet resultSet = stmt.executeQuery(query);

但是,只要有可能(即针对CRUD查询中的值),请改用准备好的语句。

Statement stmtFormat = connection.createStatement();
String query = String.format(
        "SELECT id FROM %s WHERE name = ?", 
        stmtFormat.enquoteIdentifier("table", false);
PreparedStatement stmt = connection.createPreparedStatement(query);
stmt.setString(1, "it's");
ResultSet resultSet = stmt.executeQuery();