首页 > 数据库 > Oracle > 正文

深入浅析mybatis oracle BLOB类型字段保存与读取

2024-08-29 13:58:29
字体:大 中 小
来源:转载
供稿:网友

本文给大家浅析mybatis oracle blob类型字段的保存与读取,blob字段是指二进制大对象,用来存储大量文本数据。感兴趣的朋友一起学习吧

一、BLOB字段

BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据。

二、使用mybatis操作blob

1、表结构如下:

 

 
  1. create table BLOB_FIELD 
  2. ( 
  3. ID VARCHAR2(64 BYTE) not null, 
  4. TAB_NAME VARCHAR2(64 BYTE) not null, 
  5. TAB_PKID_VALUE VARCHAR2(64 BYTE) not null, 
  6. CLOB_COL_NAME VARCHAR2(64 BYTE) not null, 
  7. CLOB_COL_VALUE CLOB, 
  8. constraint PK_BLOB_FIELD primary key (ID) 
  9. ); 

2、实体代码如下:

 

 
  1. package com.test.entity; 
  2. import java.sql.Clob;  
  3. /** 
  4. * 大字段  
  5. */ 
  6. public class BlobField {  
  7. private String tabName;// 表名 
  8. private String tabPkidValue;// 主键值 
  9. private String blobColName;// 列名 
  10. private byte[] blobColValue;// 列值 clob类型 
  11. public String getTabName() { 
  12. return tabName; 
  13. } 
  14. public void setTabName(String tabName) { 
  15. this.tabName = tabName; 
  16. } 
  17. public String getTabPkidValue() { 
  18. return tabPkidValue; 
  19. } 
  20. public void setTabPkidValue(String tabPkidValue) { 
  21. this.tabPkidValue = tabPkidValue; 
  22. } 
  23. public String getBlobColName() { 
  24. return blobColName; 
  25. } 
  26. public void setBlobColName(String blobColName) { 
  27. this.blobColName = blobColName; 
  28. } 
  29. public byte[] getBlobColValue() { 
  30. return blobColValue; 
  31. } 
  32. public void setBlobColValue(byte[] blobColValue) { 
  33. this.blobColValue = blobColValue; 
  34. } 
  35. } 

3、mybatis sql代码如下:

 

 
  1. <?xml version="." encoding="UTF-" ?> 
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd"> 
  3. <mapper namespace="com.test.dao.BlobFieldDao"> 
  4. <sql id="blobFieldColumns"> 
  5. a.ID AS id, 
  6. a.TAB_NAME AS tabName, 
  7. a.TAB_PKID_VALUE AS tabPkidValue, 
  8. a.BLOB_COL_NAME AS blobColName, 
  9. a.BLOB_COL_VALUE AS blobColValue 
  10. </sql> 
  11. <sql id="blobFieldJoins"> 
  12. </sql> 
  13. <select id="get" resultType="blobField"> 
  14. SELECT 
  15. <include refid="blobFieldColumns" /> 
  16. FROM BLOB_FIELD a 
  17. <include refid="blobFieldJoins" /> 
  18. WHERE a.ID = #{id} 
  19. </select> 
  20. <select id="findList" resultType="blobField"> 
  21. SELECT 
  22. <include refid="blobFieldColumns" /> 
  23. FROM BLOB_FIELD a 
  24. <include refid="blobFieldJoins" /> 
  25. </select>  
  26. <insert id="insert"> 
  27. INSERT INTO BLOB_FIELD( 
  28. ID , 
  29. TAB_NAME , 
  30. TAB_PKID_VALUE , 
  31. BLOB_COL_NAME , 
  32. BLOB_COL_VALUE 
  33. ) VALUES ( 
  34. #{id}, 
  35. #{tabName}, 
  36. #{tabPkidValue}, 
  37. #{blobColName}, 
  38. #{blobColValue,jdbcType=BLOB} 
  39. ) 
  40. </insert> 
  41. <update id="update"> 
  42. UPDATE BLOB_FIELD SET 
  43. TAB_NAME = #{tabName}, 
  44. TAB_PKID_VALUE = #{tabPkidValue}, 
  45. BLOB_COL_NAME = #{blobColName}, 
  46. BLOB_COL_VALUE = #{blobColValue} 
  47. WHERE ID = #{id} 
  48. </update> 
  49. <delete id="delete"> 
  50. DELETE FROM BLOB_FIELD  
  51. WHERE ID = #{id} 
  52. </delete> 
  53. </mapper> 

3、controller代码如下:

a、保存BLOB字段代码

 

 
  1. /** 
  2. * 附件上传 
  3. *  
  4. * @param testId 
  5. * 主表Id 
  6. * @param request 
  7. * @return 
  8. * @throws UnsupportedEncodingException 
  9. */ 
  10. @RequiresPermissions("exc:exceptioninfo:feedback") 
  11. @RequestMapping(value = "attachment", method = RequestMethod.POST) 
  12. @ResponseBody 
  13. public Map<String, Object> uploadAttachment(@RequestParam(value = "testId", required = true) String testId,  
  14.  
  15. HttpServletRequest request) 
  16. throws UnsupportedEncodingException { 
  17. Map<String, Object> result = new HashMap<String, Object>(); 
  18.  
  19. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; 
  20. // 获得文件 
  21. MultipartFile multipartFile = multipartRequest.getFile("Filedata");// 与前端设置的fileDataName属性值一致 
  22. String filename = multipartFile.getOriginalFilename();// 文件名称 
  23. InputStream is = null; 
  24. try { 
  25. //读取文件流 
  26. is = multipartFile.getInputStream(); 
  27. byte[] bytes = FileCopyUtils.copyToByteArray(is); 
  28. BlobField blobField = new BlobField(); 
  29. blobField.setTabName("testL"); 
  30. blobField.setTabPkidValue(testId); 
  31. blobField.setBlobColName("attachment"); 
  32. blobField.setBlobColValue(bytes); 
  33. //保存blob字段 
  34. this.testService.save(blobField, testId, filename); 
  35. result.put("flag", true); 
  36. result.put("attachmentId", blobField.getId()); 
  37. result.put("attachmentName", filename); 
  38. } catch (IOException e) { 
  39. e.printStackTrace(); 
  40. result.put("flag", false); 
  41. } finally { 
  42. IOUtils.closeQuietly(is); 
  43. } 
  44. return result; 
  45. } 

b、读取BLOB字段

 

 
  1. /** 
  2. * 下载附件 
  3. *  
  4. * @param attachmentId 
  5. * @return 
  6. */ 
  7. @RequiresPermissions("exc:exceptioninfo:view") 
  8. @RequestMapping(value = "download", method = RequestMethod.GET) 
  9. public void download(@RequestParam(value = "attachmentId", required = true) String attachmentId, 
  10. @RequestParam(value = "attachmentName", required = true) String attachmentName, HttpServletRequest  
  11. request, HttpServletResponse response) { 
  12. ServletOutputStream out = null; 
  13. try { 
  14. response.reset(); 
  15. String userAgent = request.getHeader("User-Agent"); 
  16. byte[] bytes = userAgent.contains("MSIE") ? attachmentName.getBytes() : attachmentName.getBytes("UTF- 
  17. "); // fileName.getBytes("UTF-")处理safari的乱码问题 
  18. String fileName = new String(bytes, "ISO--"); 
  19. // 设置输出的格式 
  20. response.setContentType("multipart/form-data"); 
  21. response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(attachmentName,  
  22. "UTF-")); 
  23. BlobField blobField = this.blobFieldService.get(attachmentId); 
  24. //获取blob字段 
  25. byte[] contents = blobField.getBlobColValue(); 
  26. out = response.getOutputStream(); 
  27. //写到输出流 
  28. out.write(contents); 
  29. out.flush(); 
  30. } catch (IOException e) { 
  31. e.printStackTrace(); 
  32. } 
  33. } 

本例子将文件上传并保存到BLOB类型字段字段,下载的时候读取BLOB字段,并写入成输出流。

以上就是本文的全部叙述,希望对大家有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表