15.7.2处理BLOB和CLOB对象

你可以存储图片,其他类型的二进制数据,和数据库里面的大块文本。这些大的对象叫做BLOBS(全称:Binary Large OBject;用于二进制数据)和CLOBS(全称:Character Large OBject;用于字符数据)。在Spring中你可以使用JdbcTemplate直接处理这些大对象,并且也可以使用RDBMS对象提供的上层抽象类,或者使用SimpleJdbc类。所有这些方法使用LobHandler接口的实现类来处理LOB数据的管理(全称:Large Object)。LobHandler通过getLobCreator方法提供了对LobCreator类的访问,用于创建新的LOB插入对象。

LobCreator/LobHandler提供了LOB输入和输出的支持:

  • BLOB

    • byte[] — getBlobAsBytessetBlobAsBytes

    • InputStream — getBlobAsBinaryStreamsetBlobAsBinaryStream

  • CLOB

    • String — getClobAsStringsetClobAsString

    • InputStream — getClobAsAsciiStreamsetClobAsAsciiStream

    • Reader — getClobAsCharacterStreamsetClobAsCharacterStream

下面的例子展示了如何创建和插入一个BLOB。后面的例子我们将举例如何从数据库中将BLOB数据读取出来

这个例子使用了JdbcTemplateAbstractLobCreatingPreparedStatementCallback的实现类。它主要实现了一个方法,setValues.这个方法提供了用于在你的SQL插入语句中设置LOB列的LobCreator

针对这个例子我们假定有一个变量lobHandler,已经设置了DefaultLobHandler的一个实例。通常你可以使用依赖注入来设置这个值。

final File blobIn = new File("spring2004.jpg");
final InputStream blobIs = new FileInputStream(blobIn);
final File clobIn = new File("large.txt");
final InputStream clobIs = new FileInputStream(clobIn);
final InputStreamReader clobReader = new InputStreamReader(clobIs);
jdbcTemplate.execute(
    "INSERT INTO lob_table (id, a_clob, a_blob) VALUES (?, ?, ?)",
    new AbstractLobCreatingPreparedStatementCallback(lobHandler) { //1
        protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
            ps.setLong(1, 1L);
            lobCreator.setClobAsCharacterStream(ps, 2, clobReader, (int)clobIn.length()); //2
            lobCreator.setBlobAsBinaryStream(ps, 3, blobIs, (int)blobIn.length()); //3
        }
    }
);
blobIs.close();
clobReader.close();
  1. 这里例子中传入的lobHandler使用了默认实现类DefaultLobHandler

  2. 使用setClobAsCharacterStream传入CLOB的内容

  3. 使用setBlobAsBinaryStream传入BLOB的内容

备注:如果你调用从DefaultLobHandler.getLobCreator()返回的LobCreatorsetBlobAsBinaryStream, setClobAsAsciiStream, 或者setClobAsCharacterStream方法,其中contentLength参数允许传入一个负值。如果指定的内容长度是负值,DefaultLobHandler会使用JDBC4.0不带长度参数的set-stream方法,或者直接传入驱动指定的长度;JDBC驱动对未指定长度的LOB流的支持请参见相关文档.

下面是从数据库读取LOB数据的例子。我们这里再次使用JdbcTempate并使用相同的DefaultLobHandler实例。

List<Map<String, Object>> l = jdbcTemplate.query("select id, a_clob, a_blob from lob_table",
    new RowMapper<Map<String, Object>>() {
        public Map<String, Object> mapRow(ResultSet rs, int i) throws SQLException {
            Map<String, Object> results = new HashMap<String, Object>();
            String clobText = lobHandler.getClobAsString(rs, "a_clob");   //1
results.put("CLOB", clobText); byte[] blobBytes = lobHandler.getBlobAsBytes(rs, "a_blob");  //2
results.put("BLOB", blobBytes); return results; } });
  1. 使用getClobAsString获取CLOB的内容

  2. 使用getBlobAsBytes获取BLOC的内容

results matching ""

    No results matching ""