使用Spring JdbcTemplate实现CLOB和BLOB的存取

概述

本文讲述通过Spring的JdbcTemplate来读写数据库大字段的实现方案,在一位网友的一篇博客的基础上,查看api文档整理而成。

写实现

 1 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  // reusable object
 2  LobHandler lobHandler = new DefaultLobHandler();  // reusable object
 3
 4  jdbcTemplate.execute(
 5      "INSERT INTO imagedb (image_name, content, description) VALUES (?, ?, ?)",
 6      new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
 7        protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
 8          ps.setString(1, name);
 9          lobCreator.setBlobAsBinaryStream(ps, 2, contentStream, contentLength);
10          lobCreator.setClobAsString(ps, 3, description);
11        }
12      }
13  );

类介绍

以下内容不求精准,加入了自己的理解和猜测,勿作学术用。

  • JdbcTemplate
    负责翻译,向JDBC接口提供可执行的指令
  • AbstractLobCreatingPreparedStatementCallBack
    负责提供参数设置的方法模板,并提供LobCreator实例
  • LobHandler
    负责提供LobCreator - AbstractLobCreatingPreparedStatementCallBack借助于它来提供LobCreator
  • LobCreator
    负责简化大字段的写入库

LobCreator API

LobCreator提供了多个接口来简化大字段的写入:对于BLOB,内容来源可以是InputStream、byte[];对于CLOB,内容来源可以是InputStream(自行确保都是ascii字符)、Reader、String。

读实现

 1 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  // reusable object
 2  final LobHandler lobHandler = new DefaultLobHandler();  // reusable object
 3
 4  jdbcTemplate.query(
 5                  "SELECT content FROM imagedb WHERE image_name=?", new Object[] {name},
 6                  new AbstractLobStreamingResultSetExtractor() {
 7                          public void streamData(ResultSet rs) throws SQLException, IOException {
 8                                  FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs, 1), contentStream);
 9                          }
10                  }
11  );

批量读取

上述实现仅仅针对一条记录的读取,如果要读取多条记录,需要注意ResultSet实例已经指向了第一条记录(上述代码也没有调用rs.next()),可参考实现:

 1 public List<DFCL> batchRead(String sql, final String colNameFileName,
 2         final String colNameFileContent) {
 3     JdbcTemplate jt = JdbcService.getInstance().getJdbcTemplate();
 4
 5     final LobHandler lobHandler = new DefaultLobHandler();
 6     final List<DFCL> dfclList = new ArrayList<DFCL>();
 7     jt.query(sql, new AbstractLobStreamingResultSetExtractor() {
 8         protected void streamData(ResultSet rs) throws SQLException,
 9                 IOException, DataAccessException {
10             do{   //SINOBEST 文件下载 ,此处的rs初始化时已经指向第一条记录
11                 String name = rs.getString(colNameFileName);
12                 String content = lobHandler.getClobAsString(rs, colNameFileContent);
13
14                 DFCL cl = new DFCL(name, content);
15                 dfclList.add(cl);
16             }while(rs.next());
17         }
18     });
19     return dfclList;
20 }

类介绍

以下内容不求精准,加入了自己的理解和猜测,勿作学术用。

  • JdbcTemplate
    同上
  • AbstractLobStreamingResultSetExtractor
    提供解析数据的方法模板,并提供ResultSet对象实例
  • LobHandler
    简化大字段的读取
  • FileCopyUtils
    spring提供的工具类,简化文件内容的传输

LobHandler API

LobHandler提供了多个接口来简化大字段的读入:对于BLOB,可以读为InputStream、byte[];对于CLOB,可以读为InputStream、Reader、String。和LobCreator的写入简化是对应的。

FileCopyUtils API

时间: 2024-12-31 05:34:06

使用Spring JdbcTemplate实现CLOB和BLOB的存取的相关文章

Spring JDBCTemplate使用JNDI数据源

xml配置: 1 <bean id="dataSource" 2 class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 3 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 4 <property name=&qu

spring jdbcTemplate源码剖析

本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 <T> T execute(StatementCallback<T> action) throws DataAccessException; void execute(String sql) throws DataAccessException; <T> T query(Str

Spring JdbcTemplate 的使用与学习(转)

Spring JdbcTemplate 的使用与学习 JDBCTemplate 是SPRING 框架自带的一种对sql 语句查询的封装 ,封装非常完善,虽然与Hibernate比起来有一点麻烦,但是学号JDBCTemplate可以让我们用Spirngmvc框架去代替SSH,降低了 我们的学习成本.用起来也更加方便,测试代码如下,包括执行mysql 语句,分页,调用存储过程,返回对象数组,返回整数数组,返回单个对象等 package com.tz.jdbctemplate; import java

Sqoop处理Clob与Blob字段

[Author]: kwu Sqoop处理Clob与Blob字段,在Oracle中Clob为大文本.Blob存储二进制文件. 遇到这类字段导入hive或者hdfs须要特殊处理. 1.oracle中的測试表 CREATE TABLE T_LOB ( A INTEGER, B CLOB, C BLOB ) 測试数据 insert into T_LOB (A, B, C) values (1, 'clob測试',to_blob('3456')); 2.sqoop脚本 import --append -

Spring JdbcTemplate的queryForList(String sql , Class&lt;T&gt; elementType)易错使用--转载

原文地址: http://blog.csdn.net/will_awoke/article/details/12617383 一直用ORM,今天用JdbcTemplate再次抑郁了一次. 首先看下这个方法: 乍一看,我想传个泛型T(实际代码执行中,这个T可以是我自定义的一个Bean),然后就能返回个List<T>,也即泛型的集合(纯ORM思想啊!殊不知又挖了个大坑~) 于是乎,出现下面代码: [java] view plaincopy List<Student> list = jd

oracle存储大文本clob、blob

1 package cn.itcast.web.oracle.util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class JdbcUtil { 9 private static String driver = "oracle.jdbc.driver.OracleDri

spring jdbcTemplate批量更新数据

方法:先实现BatchPreparedStatementSetter接口,然后再调用JdbcTemplate的batchUpdate(sql,setter)操作,参数sql是预编译语句 ,setter是BatchPreparedStatementSetter的一个实例.或者使用内部匿名类方式. BatchPreparedStatementSetter接口 public interface BatchPreparedStatementSetter{ public int getBatchSize(

小峰mybatis(1) 处理clob,blob等。。

一.mybatis处理CLOB.BLOB类型数据 CLOB:大文本类型:小说啊等大文本的:对应数据库类型不一致,有long等: BLOB:二进制的,图片:电影.音乐等二进制的: 在mysql中: blob: longblob:存储的东西比blob更大: longtext:存储大文本类型的: 新建t_studeng表: create table t_student( id int primary key auto_increment, name varchar(20), age int, pic

Spring JdbcTemplate框架(1)——基本原理

JDBC已经能够满足大部分用户擦欧洲哦数据库的需求,但是在使用JDBC时,应用必须自己来管理数据库资源.spring对数据库操作需求提供了很好的支持,并在原始JDBC基础上,构建了一个抽象层,提供了许多使用JDBC的模板和驱动模块,为Spring应用操作关系数据库提供了更大的便利. Spring封装好的模板,封装了数据库存取的基本过程,方便用户. 一.模板方法 Spring JDBCTemplate从名字来说,这就是一个模板,的确是,它确实实现了涉及模式中的模板模式.如下: JDBCTempla