本文给大家浅析mybatis oracle blob类型字段的保存与读取,blob字段是指二进制大对象,用来存储大量文本数据。感兴趣的朋友一起学习吧
一、BLOB字段
BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据。
二、使用mybatis操作blob
1、表结构如下:
- create table BLOB_FIELD
- (
- ID VARCHAR2(64 BYTE) not null,
- TAB_NAME VARCHAR2(64 BYTE) not null,
- TAB_PKID_VALUE VARCHAR2(64 BYTE) not null,
- CLOB_COL_NAME VARCHAR2(64 BYTE) not null,
- CLOB_COL_VALUE CLOB,
- constraint PK_BLOB_FIELD primary key (ID)
- );
2、实体代码如下:
- package com.test.entity;
- import java.sql.Clob;
- /**
- * 大字段
- */
- public class BlobField {
- private String tabName;// 表名
- private String tabPkidValue;// 主键值
- private String blobColName;// 列名
- private byte[] blobColValue;// 列值 clob类型
- public String getTabName() {
- return tabName;
- }
- public void setTabName(String tabName) {
- this.tabName = tabName;
- }
- public String getTabPkidValue() {
- return tabPkidValue;
- }
- public void setTabPkidValue(String tabPkidValue) {
- this.tabPkidValue = tabPkidValue;
- }
- public String getBlobColName() {
- return blobColName;
- }
- public void setBlobColName(String blobColName) {
- this.blobColName = blobColName;
- }
- public byte[] getBlobColValue() {
- return blobColValue;
- }
- public void setBlobColValue(byte[] blobColValue) {
- this.blobColValue = blobColValue;
- }
- }
3、mybatis sql代码如下:
- <?xml version="." encoding="UTF-" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd">
- <mapper namespace="com.test.dao.BlobFieldDao">
- <sql id="blobFieldColumns">
- a.ID AS id,
- a.TAB_NAME AS tabName,
- a.TAB_PKID_VALUE AS tabPkidValue,
- a.BLOB_COL_NAME AS blobColName,
- a.BLOB_COL_VALUE AS blobColValue
- </sql>
- <sql id="blobFieldJoins">
- </sql>
- <select id="get" resultType="blobField">
- SELECT
- <include refid="blobFieldColumns" />
- FROM BLOB_FIELD a
- <include refid="blobFieldJoins" />
- WHERE a.ID = #{id}
- </select>
- <select id="findList" resultType="blobField">
- SELECT
- <include refid="blobFieldColumns" />
- FROM BLOB_FIELD a
- <include refid="blobFieldJoins" />
- </select>
- <insert id="insert">
- INSERT INTO BLOB_FIELD(
- ID ,
- TAB_NAME ,
- TAB_PKID_VALUE ,
- BLOB_COL_NAME ,
- BLOB_COL_VALUE
- ) VALUES (
- #{id},
- #{tabName},
- #{tabPkidValue},
- #{blobColName},
- #{blobColValue,jdbcType=BLOB}
- )
- </insert>
- <update id="update">
- UPDATE BLOB_FIELD SET
- TAB_NAME = #{tabName},
- TAB_PKID_VALUE = #{tabPkidValue},
- BLOB_COL_NAME = #{blobColName},
- BLOB_COL_VALUE = #{blobColValue}
- WHERE ID = #{id}
- </update>
- <delete id="delete">
- DELETE FROM BLOB_FIELD
- WHERE ID = #{id}
- </delete>
- </mapper>
3、controller代码如下:
a、保存BLOB字段代码
- /**
- * 附件上传
- *
- * @param testId
- * 主表Id
- * @param request
- * @return
- * @throws UnsupportedEncodingException
- */
- @RequiresPermissions("exc:exceptioninfo:feedback")
- @RequestMapping(value = "attachment", method = RequestMethod.POST)
- @ResponseBody
- public Map<String, Object> uploadAttachment(@RequestParam(value = "testId", required = true) String testId,
- HttpServletRequest request)
- throws UnsupportedEncodingException {
- Map<String, Object> result = new HashMap<String, Object>();
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- // 获得文件
- MultipartFile multipartFile = multipartRequest.getFile("Filedata");// 与前端设置的fileDataName属性值一致
- String filename = multipartFile.getOriginalFilename();// 文件名称
- InputStream is = null;
- try {
- //读取文件流
- is = multipartFile.getInputStream();
- byte[] bytes = FileCopyUtils.copyToByteArray(is);
- BlobField blobField = new BlobField();
- blobField.setTabName("testL");
- blobField.setTabPkidValue(testId);
- blobField.setBlobColName("attachment");
- blobField.setBlobColValue(bytes);
- //保存blob字段
- this.testService.save(blobField, testId, filename);
- result.put("flag", true);
- result.put("attachmentId", blobField.getId());
- result.put("attachmentName", filename);
- } catch (IOException e) {
- e.printStackTrace();
- result.put("flag", false);
- } finally {
- IOUtils.closeQuietly(is);
- }
- return result;
- }
b、读取BLOB字段
- /**
- * 下载附件
- *
- * @param attachmentId
- * @return
- */
- @RequiresPermissions("exc:exceptioninfo:view")
- @RequestMapping(value = "download", method = RequestMethod.GET)
- public void download(@RequestParam(value = "attachmentId", required = true) String attachmentId,
- @RequestParam(value = "attachmentName", required = true) String attachmentName, HttpServletRequest
- request, HttpServletResponse response) {
- ServletOutputStream out = null;
- try {
- response.reset();
- String userAgent = request.getHeader("User-Agent");
- byte[] bytes = userAgent.contains("MSIE") ? attachmentName.getBytes() : attachmentName.getBytes("UTF-
- "); // fileName.getBytes("UTF-")处理safari的乱码问题
- String fileName = new String(bytes, "ISO--");
- // 设置输出的格式
- response.setContentType("multipart/form-data");
- response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(attachmentName,
- "UTF-"));
- BlobField blobField = this.blobFieldService.get(attachmentId);
- //获取blob字段
- byte[] contents = blobField.getBlobColValue();
- out = response.getOutputStream();
- //写到输出流
- out.write(contents);
- out.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
本例子将文件上传并保存到BLOB类型字段字段,下载的时候读取BLOB字段,并写入成输出流。
以上就是本文的全部叙述,希望对大家有所帮助。
新闻热点
疑难解答