快速业务通道

Spring让LOB数据操作变得简单易行 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
return new String[]{"classpath:applicationContext.xml"};  }  public void testAddPost() throws Throwable{   Post post = new Post();   post.setPostId(1);   post.setUserId(2);   ClassPathResource res = new ClassPathResource("temp.jpg"); ① 获取图片资源   byte[] mockImg = FileCopyUtils.copyToByteArray(res.getFile()); ② 读取图片文件的数据   post.setPostAttach(mockImg);   post.setPostText("测试帖子的内容");   postDao.addPost(post);  } }

这里,有几个知识点需要稍微解释一下:AbstractDependencyInjectionSpringContextTests 是 Spring 专门为测试提供的类,它能够直接从 IoC 容器中装载 Bean。此外,我们使用了 ClassPathResource 加载图片资源,并通过 FileCopyUtils 读取文件的数据。ClassPathResource 和 FileCopyUtils 都是 Spring 提供的非常实用的工具类。

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

时间:2011-02-14 IBM 陈雄华

以块数据方式读取 LOB 数据

您可以直接用数据块的方式读取 LOB 数据:用 String 读取 CLOB 字段的数据,用 byte[] 读取 BLOB 字段的数据。在 PostJdbcDao 中添加一个 getAttachs() 方法,以便获取某一用户的所有带附件的帖子:

清单 7. 以块数据访问 LOB 数据

public List getAttachs(final int userId){  String sql = "SELECT post_id,post_attach FROM t_post “+ “where user_id =? and post_attach is not null ";  return getJdbcTemplate().query(     sql,new Object[] {userId},     new RowMapper() {      public Object mapRow(ResultSet rs, int rowNum) throws SQLException {       int postId = rs.getInt(1);       ① 以二进制数组方式获取 BLOB 数据。       byte[] attach = lobHandler.getBlobAsBytes(rs, 2);       Post post = new Post();       post.setPostId(postId);       post.setPostAttach(attach);       return post;      }     }); }

通过 JdbcTemplate 的 List query(String sql, Object[] args, RowMapper rowMapper) 接口处理行数据的映射。在 RowMapper 回调的 mapRow() 接口方法中,通过 LobHandler 以 byte[] 获取 BLOB 字段的数据。

以流数据方式读取 LOB 数据

由于 LOB 数据可能很大(如 100M),如果直接以块的方式操作 LOB 数据,需要消耗大量的内存资源,对应用程序整体性能产生巨大的冲击。对于体积很大的 LOB 数据,我们可以使用流的方式进行访问,减少内存的占用。JdbcTemplate 为此提供了一个 Object query(String sql, Object[] args, ResultSetExtractor rse) 方法,ResultSetExtractor 接口拥有一个处理流数据的抽象类 org.springframework.jdbc.core.support.AbstractLobStreamingResultSetExtractor,可以通过扩展此类用流的方式操作 LOB 字段的数据。下面我们为 PostJdbcDao 添加一个以流的方式获取某个帖子附件的方法:

清单 8. 以流方式访问 LOB 数据

… public void getAttach(final int postId,final OutputStream os){ ① 用于接收 LOB 数据的输出流  String sql = "SELECT post_attach FROM t_post WHERE post_id=? ";  getJdbcTemplate().query(    sql, new Object[] {postId},    new AbstractLobStreamingResultSetExtractor() { ② 匿名内部类 ③ 处理未找到数据行的情况 protected void handleNoRowFound() throws LobRetrievalFailureException {      System.out.println("Not Found resul

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号