mybatis-plus:向MySQL数据库写入二进制大数据

该基本测试案列使用的是:springboot、mybatis-plus

主要测试的是向数据中写入如.pdf、.yml、.jpg、.mp3等等类型的二进制文件,当然,像字符串这种编码固定的也是可以写入的,不是说数据库中Blob类型的字段不能写入字符串。

MySQL table: tb_blob

mybatis-plus:向MySQL数据库写入二进制大数据_第1张图片

javaBean:TbBlob.class
package xyz.jxust.mp_quickstart.bean;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName(value = "tb_blob")
@Data
public class TbBlob {
    @TableId(value = "id")
    private Integer id;
    @TableField(value = "name")
    private String name;
    @TableField("bin_data")
    private byte[] binData;//数据库的字段为blob、mediumblob、longblob,pojo的属性应为byte数组 byte[]
}

Mapper接口:TbBlobMapper.class
package xyz.jxust.mp_quickstart.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.jxust.mp_quickstart.bean.TbBlob;
@Mapper
public interface TbBlobMapper extends BaseMapper<TbBlob> {
}

TbBlobMapper测试方法

1.测试方法testInsertTbBlob 向MySQL数据库插入一行记录,主要是通过文件输入流将源文件的二进制数据写入
到数据库中存储。

2.测试方法testSelectTbBlobById 从数据库通过 id 字段查询一条记录,并将记录的二进制数据通过文件输出流写到项目的src目录下。

关于java的输入输出流:
程序能够从中读取(read)数据的地方定义为输入流;程序能够往其中写入(write)数据的地方定义为输出流。

/*==================================TbBlobMapper tests begin======================================================*/
    @Autowired
    TbBlobMapper tbBlobMapper;

    @Test
    public void testInsertTbBlob() throws IOException {
        File file = new File("G:\\我的简历\\pdf\\耿忠相--Java研发岗.pdf");
        FileInputStream fis = new FileInputStream(file);
        System.out.println("bytes of file: "+fis.available());
        byte[] data=new byte[fis.available()];
        fis.read(data,0,fis.available());
        fis.close();

        TbBlob tbBlob = new TbBlob();
        tbBlob.setId(8);
        tbBlob.setName(file.getName());
        tbBlob.setBinData(data);

        int insert = tbBlobMapper.insert(tbBlob);
        System.out.println(insert);
    }

    @Test
    public void testSelectTbBlobById() throws SQLException, IOException {
        TbBlob tbBlob = tbBlobMapper.selectById(8);
        if (tbBlob!=null){
            System.out.println("number of bytes: "+tbBlob.getBinData().length);
            FileOutputStream fos = new FileOutputStream("src/"+tbBlob.getName());
            fos.write(tbBlob.getBinData(),0,tbBlob.getBinData().length);
            fos.close();
        }
    }

    /*==================================TbBlobMapper tests end========================================================*/

注:
我修改测试方法试了几次插入,遇到一些问题
主要是一开始表的bin_data字段被定义为Blob类型的,Blob类型的最大只能存放65535 bytes 的数据,如果要存放再大一些的文件到数据库中,比如小于等于16 M 的,可以将字段声明为MediumBlob类型的,更大的就是LongBlob了,最大能存放4 G的数据。

几次测试后tb_blob表的情况

mybatis-plus:向MySQL数据库写入二进制大数据_第2张图片

尤其注意:

1.可能会遇到packet too large 的异常,只需要修改 MySQL配置文件 my.ini,如果有 max_allowed_packet配置项,修改其值即可,单位可以用M,比如max_allowed_packet=30M;如果没有此配置项,直接在配置文件末尾添加此配置项即可。

2.重要的事说三遍!!!
数据库的字段为blob、mediumblob、longblob,pojo的属性应为byte数组 byte[]!!!
数据库的字段为blob、mediumblob、longblob,pojo的属性应为byte数组 byte[]!!!
数据库的字段为blob、mediumblob、longblob,pojo的属性应为byte数组 byte[]!!!

这个测试只是能够运行不报错,完成基本的任务,还有很多需要改进的地方,希望精通 mybatis-plus 的 ‘C友’ 提出改进的宝贵意见。

你可能感兴趣的:(数据库,mybatis-plus,blob,输入输出流区别,byte数组)