一、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字段,并写入成输出流。
以上就是本文的全部叙述,希望对大家有所帮助。
本文地址:https://www.stayed.cn/item/20210
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我