【问题标题】:What does java.sql.Blob contain?java.sql.Blob 包含什么?
【发布时间】:2018-10-19 07:57:12
【问题描述】:

从文档中说:

默认情况下,驱动程序使用 SQL 定位器 (BLOB) 实现 Blob,它 表示 Blob 对象包含指向 SQL BLOB 的逻辑指针 数据而不是数据本身。

因此,如果我从数据库中获取 Blob 对象,我不会获取数据的所有字节,而只会获取一个流,就像文件系统中文件的 InputStream 一样(如果我错了,请纠正我)。

但是现在,如果我自己从构造函数创建 Blob,例如使用 Hibernate 的 Lobhelper,会怎样?

有:

  • createBlob(byte[] bytes)
  • createBlob(InputStream 流,长长度)

我从这两个构造函数中返回的 Blob 的属性是什么?数据是在 Blob 对象内还是流设置?

【问题讨论】:

  • Blob 将包含你给它的任何东西,你不应该关心如何维护它的确切细节,因为它可以在 Java 更新时发生变化。 --- 如果你给它一个InputStream,那么它就是这样,这意味着你只能从Blob 的字节中询问一次,因为这会耗尽流。一次性使用是将数据作为INSERTUPDATE 语句的一部分发送到数据库。
  • 您问题中引用的文字是关于Blob从JDBC驱动程序获得的对象,作为SELECT语句的结果,它描述了驱动程序实现Blob的常用方法来源于数据库。并不意味着所有驱动程序都这样做,或者所有Blob 对象都以这种方式实现。

标签: java sql hibernate


【解决方案1】:

org.hibernate.engine.jdbc.NonContextualLobCreator类在hibernate中负责创建Blob,它使用org.hibernate.engine.jdbc.BlobProxy,实际使用的是:

  • BinaryStreamImpl 用于createBlob(byte[] bytes) 它被定义为:BinaryStreamImpl extends ByteArrayInputStream implements BinaryStream BinaryStreamImpl 使用 ByteArrayInputStream 保存对您的数组的引用。
  • StreamBackedBinaryStream 用于createBlob(InputStream stream, long length),定义为:StreamBackedBinaryStream implements Stream StreamBackedBinaryStream 包含对您的流的引用。

因此,请查看源代码链接,以便更好地了解幕后发生的事情。

【讨论】:

    【解决方案2】:

    Java 中的 Blob 对象是 Blob 的映射(Sql 中的二进制大对象对象。ResultSet、CallableStatement 和 PreparedStatement 中的方法可以用于 Blob 对象。JDBC API 允许 Blob 以与 int 相同的方式使用) getBlob 和 setBlob 等方法(与 getInt 和 setInt 相同)。

    对 Blob 有一定的限制:

    1. 不能使用相等(或不相等)运算符
    2. OrderBy、Distinct 和 GroupBy 不能使用。

    因此不建议在 Blob 中存储整数。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      相关资源
      最近更新 更多