繁体   English   中英

Oracle从“布尔值”到Java布尔值-如何自动转换

[英]Oracle “boolean” to Java Boolean - how to convert automatically

我正在使用JDBC(ojdbc6.jar)开发数据库层,该层允许通过获取和返回包含名称/值对的Map来执行基本的数据库操作。 例如:

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数据类型,因此我正在寻找一种定义字段的方法,以便我的检索层将此类字段明确标识为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'。

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

关于这种技巧有什么想法(即使不是100%安全,但相当安全)?

谢谢。

编辑作为一个示例,在Oracle中使用RAW(1)可以完美地解决问题,因为在任何地方,任何人都将RAW(1)用于其他任何事物的可能性几乎为零。 RAW(1)的问题在于,在SQL查询中确实很难使用它,也就是说,很难用这样的“布尔”定义在WHERE中进行操作。

好的,这是很好的方法:

  • 在Oracle中将“布尔”字段定义为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 Boolean)或“外部”数据库(在在这种情况下,不支持Java布尔值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM