Oracle“boolean”to Java Boolean - 如何自动转换

时间:2013-11-28 18:09:26

标签: java sql database oracle jdbc

我正在开发一个DB层,使用JDBC(ojdbc6.jar),它允许通过获取和返回包含Name / Value对的Map来执行基本的DB操作。例如:

map.put("StrField", "str");
map.put("IntField", 10);
map.put("BoolField", true);
DB.insert(tableName, map);
...
map = DB.query("SELECT * from MY_TABLE.."); // assuming this returns only one row
Boolean flag = map.get("BoolField");
// etc...

插入操作易于实现,因为从Java原始类型到Oracle类型的转换简单直观。

对于相反的方向(Oracle-> Java),更正稍微有些棘手。我设法转换除“布尔”之外的所有类型。由于Oracle DB中没有BOOLEAN数据类型,我正在寻找一种定义字段的方法,以便我的检索层能够清楚地将这样的字段标识为布尔值。

到目前为止,我发现的最好的方法是使用这样的东西:

BOOL_FIELD CHAR(1) DEFAULT 0 NOT NULL CHECK (BOOL_FIELD in (0, 1))

另外,我确保在我的数据库中的任何地方都不使用CHAR(1),除非需要“布尔”。这不是一个很大的限制因为CHAR(1)对其他任何东西都没有用。

在我的Java转换代码中,我检查特定的返回字段是否为java.sql.Types.CHAR(通过ResultSetMetaData.getColumnType()调用),并且我还检查字段的大小是否为1,在这种情况下我可以安全地调用ResultSet.getBoolean()并获取字段值作为Java布尔数据类型。

到目前为止,它运行得很好,但现在我的外部数据库(即数据库)存在问题,我无法控制表/列定义。对于这样的数据库,我可以根本没有布尔值,但我想知道如何区分我的“布尔”和其他人在外部数据库中使用的常规CHAR(1)。

我可以完全忽略它,并且在CHAR(1)的情况下获得布尔值true / false,但这不是我的意图。例如,如果特定的CHAR(1)列的值为“X”(我的数据库不可能,但外部数据库中的有效情况),那么我的转换代码将返回true而不是“X”。 / p>

我正在寻找一些“元数据”或技巧,我可以将其添加到我的“BOOLEAN”数据库字段中,因此我的JDBC层可以获取此元数据,如果它得到它 - 假设它是MY布尔值而不是其他人的CHAR( 1)看起来很相似。

关于这样一个技巧的任何想法(即使不是100%安全,但相当安全)?

感谢。

修改 举个例子,在Oracle中使用RAW(1)可以完美地完成这一操作,因为任何人都可以使用RAW(1)获得其他任何东西的机会几乎为零。 RAW(1)的问题在于它在SQL查询中很难使用,即使用这种“布尔”定义很难做WHERE。

1 个答案:

答案 0 :(得分:0)

好的,所以这里是如何做到的,很好:

  • 在Oracle中将“boolean”字段定义为RAW(1):

    BOOL_FIELD RAW(1) DEFAULT '00' CHECK (BOOL_FIELD in ('00', '01'))

    任何人都会将RAW(1)用于其他任何事情的可能性接近于零

  • 在Java中使用getString / setString将true / false转换为/从'00'/'01'

上述方法的主要问题是必须始终在SQL语句中使用'00'/'01'。换句话说,如果不小心有人使用WHERE BOOL_FIELD = '1',它将始终返回空结果,因为奇怪的Oracle处理char到二进制转换。

上述问题,如果扩展到一个非常大的长寿系统并不是万无一失的,所以它不够安全。我决定采取更直接的方法 - 我有一个连接集标志,我指定它是“我的”数据库连接(在这种情况下我可以将CHAR(1)视为Java布尔)或“外部”数据库(在在哪种情况下不支持Java布尔值。