首页 > 数据库 > 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. ID VARCHAR2(64 BYTE) not null
  3. TAB_NAME VARCHAR2(64 BYTE) not null
  4. TAB_PKID_VALUE VARCHAR2(64 BYTE) not null
  5. CLOB_COL_NAME VARCHAR2(64 BYTE) not null
  6. CLOB_COL_VALUE CLOB, 
  7. constraint PK_BLOB_FIELD primary key (ID) 
  8. ); 

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. public void setTabName(String tabName) { 
  14. this.tabName = tabName; 
  15. public String getTabPkidValue() { 
  16. return tabPkidValue; 
  17. public void setTabPkidValue(String tabPkidValue) { 
  18. this.tabPkidValue = tabPkidValue; 
  19. public String getBlobColName() { 
  20. return blobColName; 
  21. public void setBlobColName(String blobColName) { 
  22. this.blobColName = blobColName; 
  23. public byte[] getBlobColValue() { 
  24. return blobColValue; 
  25. public void setBlobColValue(byte[] blobColValue) { 
  26. this.blobColValue = blobColValue; 

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. </insert> 
  40. <update id="update"
  41. UPDATE BLOB_FIELD SET 
  42. TAB_NAME = #{tabName}, 
  43. TAB_PKID_VALUE = #{tabPkidValue}, 
  44. BLOB_COL_NAME = #{blobColName}, 
  45. BLOB_COL_VALUE = #{blobColValue} 
  46. WHERE ID = #{id} 
  47. </update> 
  48. <delete id="delete"
  49. DELETE FROM BLOB_FIELD  
  50. WHERE ID = #{id} 
  51. </delete
  52. </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. return result; 

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(); 

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

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

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