使用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

 

转载于:https://www.cnblogs.com/ywjy/p/5013764.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用,可以使用SpringJdbcTemplate来操作数据库,并且可以使用jdbctemplateClob类型进行操作。通常,如果要修改Clob字段,可以使用以下步骤: 1. 使用合适的SQL语句,通过"for update"字句锁定需要修改的行和Clob字段。例如,可以使用以下语句: ``` String stmtString = "select v_clob from ord where ord_id = ? for update"; pstmt = conn.prepareStatement(stmtString); pstmt.setInt(1, ordId); rset = pstmt.executeQuery(); ``` 2. 获取结果集中的Clob字段,并将其转换为`oracle.sql.CLOB`类型。例如,可以使用以下代码: ``` while(rset.next()){ //转换为oracle.sql.CLOB类型 CLOB clob = (CLOB)rset.getClob(1); } ``` 3. 使用`CLOB`对象的方法,如`getCharacterOutputStream()`或`getAsciiOutputStream()`获取`Writer`对象,然后使用`Writer`对象进行修改。例如,可以使用以下代码: ``` Writer writer = clob.getCharacterOutputStream(); //或者使用以下代码 //Writer writer = clob.getAsciiOutputStream(); writer.write(newClobDate); ``` 通过以上步骤,可以使用JdbcTemplate来修改Clob字段。请注意,以上示例中的代码是使用Oracle数据库的示例,如果使用其他数据库,语法和方法可能会有所不同。123 #### 引用[.reference_title] - *1* *2* [SpringJdbcTemplate操作ClobBlob的通用类封装](https://blog.csdn.net/weixin_35045900/article/details/115501161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [jdbc读取、写入、更新CLOB字段](https://blog.csdn.net/weixin_38316697/article/details/84565466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值