科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Spring让LOB数据操作变得简单易行

Spring让LOB数据操作变得简单易行

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文讲解了在 Spring 中处理 LOB 数据的原理和方法

作者:陈雄华 来源:Impress Watch中文站 2007年10月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共5页)

LobCreator

  虽然 JDBC 定义了两个操作 LOB 类型的接口:java.sql.Blob 和 java.sql.Clob,但有些厂商的 JDBC 驱动程序并不支持这两个接口。为此,Spring 定义了一个独立于 java.sql.Blob/Clob 的 LobCreator 接口,以统一的方式操作各种数据库的 LOB 类型数据。因为 LobCreator 本身持有 LOB 所对应的数据库资源,所以它不是线程安全的,一个 LobCreator 只能操作一个 LOB 数据。

  为了方便在 PreparedStatement 中使用 LobCreator,您可以直接使用 JdbcTemplate#execute(String sql,AbstractLobCreatingPreparedStatementCallback lcpsc) 方法。下面对 LobCreator 接口中的方法进行简要说明:

方法 说明
void close() 关闭会话,并释放 LOB 资源
void setBlobAsBinaryStream(PreparedStatement ps, int paramIndex, InputStream contentStream, int contentLength) 通过流填充 BLOB 数据
void setBlobAsBytes(PreparedStatement ps, int paramIndex, byte[] content) 通过二进制数据填充 BLOB 数据
void setClobAsAsciiStream(PreparedStatement ps, int paramIndex, InputStream asciiStream, int contentLength) 通过 Ascii 字符流填充 CLOB 数据
void setClobAsCharacterStream(PreparedStatement ps, int paramIndex, Reader characterStream, int contentLength) 通过 Unicode 字符流填充 CLOB 数据
void setClobAsString(PreparedStatement ps, int paramIndex, String content) 通过字符串填充 CLOB 数据

  LobHandler

  LobHandler 接口为操作 BLOB/CLOB 提供了统一访问接口,而不管底层数据库究竟是以大对象的方式还是以一般数据类型的方式进行操作。此外,LobHandler 还充当了 LobCreator 的工厂类。

  大部分数据库厂商的 JDBC 驱动程序(如 DB2)都以 JDBC 标准的 API 操作 LOB 数据,但 Oracle 9i 及以前的 JDBC 驱动程序采用了自己的 API 操作 LOB 数据,Oracle 9i 直接使用自己的 API 操作 LOB 数据,且不允许通过 PreparedStatement 的 setAsciiStream()、setBinaryStream()、setCharacterStream() 等方法填充流数据。Spring 提供 LobHandler 接口主要是为了迁就 Oracle 特立独行的作风。所以 Oracle 必须使用 OracleLobHandler 实现类,而其它的数据库统一使用 DefaultLobHandler 就可以了。Oracle 10g 改正了 Oracle 9i 这个异化的风格,终于天下归一了,所以 Oracle 10g 也可以使用 DefaultLobHandler。 下面,我们来看一下 LobHandler 接口的几个重要方法:

方法 说明
InputStream getBlobAsBinaryStream(ResultSet rs, int columnIndex) 从结果集中返回 InputStream,通过 InputStream 读取 BLOB 数据
byte[] getBlobAsBytes(ResultSet rs, int columnIndex) 以二进制数据的方式获取结果集中的 BLOB 数据;
InputStream getClobAsAsciiStream(ResultSet rs, int columnIndex) 从结果集中返回 InputStream,通过 InputStreamn 以 Ascii 字符流方式读取 BLOB 数据
Reader getClobAsCharacterStream(ResultSet rs, int columnIndex) 从结果集中获取 Unicode 字符流 Reader,并通过 Reader以Unicode 字符流方式读取 CLOB 数据
String getClobAsString(ResultSet rs, int columnIndex) 从结果集中以字符串的方式获取 CLOB 数据
LobCreator getLobCreator() 生成一个会话相关的 LobCreator 对象
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章