好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

一、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字段,并写入成输出流。

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

查看更多关于深入浅析mybatis oracle BLOB类型字段保存与读取的详细内容...

  阅读:66次