一、BLOB字段
BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据。
二、使用mybatis操作blob
1、表结构如下:
1
2
3
4
5
6
7
8
9
|
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、实体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
<?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字段代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/** * 附件上传 * * @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字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * 下载附件 * * @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字段,并写入成输出流。
以上就是本文的全部叙述,希望对大家有所帮助。