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

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

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

MySQL table: tb_blob

在这里插入图片描述

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表的情况

在这里插入图片描述

尤其注意:

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友’ 提出改进的宝贵意见。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bitDesigner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值