Java Sql 更新声明。处理引号中的 Null
Java Sql Update Statement. Dealing with a Null in quotes
我有一个 java 程序执行 SQL 更新到 table:
String qry = "UPDATE [Artists] SET [Website] = '" + artist.getWebsite() + "' WHERE [ID] = " + artist.getID() + "'";
如果 artist.getWebsite() 为 null,它会插入字符串 'null',因为当我想将其保留为 SQL NULL 时有引号。但我大多数时候都需要引号 artist.getWebsite() returns 一个字符串。
处理这个问题最简单的方法是什么?
更新时使用..NULLIF('" + artist.getWebsite() + "', ''NULL''...
。有关运算符的更多信息:https://msdn.microsoft.com/en-us/library/ms177562.aspx
这将 return 实际 NULL
SELECT NULLIF('NULL', 'NULL')
不要。采用。细绳。级联。到。建造。 SQL。报表。这有几个原因,尤其是这个:
...而空值是这些原因之一。更多:http://bobby-tables.com这样做也真的容易混淆(例如,你的例子最后有一个额外的'
)。
让我们暂时忽略 null
:如果您放入字符串中的值包含 '
怎么办?现在你有一个损坏的 SQL 字符串。
而是使用 PreparedStatement
:
PreparedStatement ps = conn.prepareStatement(
"UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?"
);
ps.setString(1, artist.getWebsite());
ps.setInt(2), artist.getID());
请注意,我们要放置字符串的 ?
两边没有引号; PreparedStatement
为您正确处理内容的引号和转义。
我 认为 setString
让你设置 null
s,但我已经有一段时间没有做 JDBC 了。对于非字符串列,您将使用 setNull
;如果 setString
不乐意这样做,您 可能 需要一个分支,例如:
PreparedStatement ps = conn.prepareStatement(
"UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?"
);
String web = artist.getWebsite();
if (web == null) {
ps.setNull(1, JDBCType.NVARCHAR);
} else {
ps.setString(1, web);
}
ps.setInt(2), artist.getID());
...但先给 setString
一个机会。
如果您使用 JDBC,您应该始终尝试使用准备好的语句,而不是仅仅手动连接语句。特别是,在准备好的语句上使用 setNull() 方法会在查询中插入一个 SQL NULL。
使用准备好的语句还可以帮助您保护您的应用程序免受 SQL 注入攻击。
请看下面link:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
我有一个 java 程序执行 SQL 更新到 table:
String qry = "UPDATE [Artists] SET [Website] = '" + artist.getWebsite() + "' WHERE [ID] = " + artist.getID() + "'";
如果 artist.getWebsite() 为 null,它会插入字符串 'null',因为当我想将其保留为 SQL NULL 时有引号。但我大多数时候都需要引号 artist.getWebsite() returns 一个字符串。 处理这个问题最简单的方法是什么?
更新时使用..NULLIF('" + artist.getWebsite() + "', ''NULL''...
。有关运算符的更多信息:https://msdn.microsoft.com/en-us/library/ms177562.aspx
这将 return 实际 NULL
SELECT NULLIF('NULL', 'NULL')
不要。采用。细绳。级联。到。建造。 SQL。报表。这有几个原因,尤其是这个:
...而空值是这些原因之一。更多:http://bobby-tables.com这样做也真的容易混淆(例如,你的例子最后有一个额外的'
)。
让我们暂时忽略 null
:如果您放入字符串中的值包含 '
怎么办?现在你有一个损坏的 SQL 字符串。
而是使用 PreparedStatement
:
PreparedStatement ps = conn.prepareStatement(
"UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?"
);
ps.setString(1, artist.getWebsite());
ps.setInt(2), artist.getID());
请注意,我们要放置字符串的 ?
两边没有引号; PreparedStatement
为您正确处理内容的引号和转义。
我 认为 setString
让你设置 null
s,但我已经有一段时间没有做 JDBC 了。对于非字符串列,您将使用 setNull
;如果 setString
不乐意这样做,您 可能 需要一个分支,例如:
PreparedStatement ps = conn.prepareStatement(
"UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?"
);
String web = artist.getWebsite();
if (web == null) {
ps.setNull(1, JDBCType.NVARCHAR);
} else {
ps.setString(1, web);
}
ps.setInt(2), artist.getID());
...但先给 setString
一个机会。
如果您使用 JDBC,您应该始终尝试使用准备好的语句,而不是仅仅手动连接语句。特别是,在准备好的语句上使用 setNull() 方法会在查询中插入一个 SQL NULL。
使用准备好的语句还可以帮助您保护您的应用程序免受 SQL 注入攻击。
请看下面link:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html