该基本测试案列使用的是: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;
}
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)数据的地方定义为输出流。
@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();
}
}
注: 我修改测试方法试了几次插入,遇到一些问题 主要是一开始表的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友’ 提出改进的宝贵意见。
|