当前位置: 首页 > news >正文

用java代码如何存取数据库的blob字段

一.业务

在业务中我们被要求将文件或图片等转成 byte[] 或 InputStream存到数据库的Blob类型的字段中.

二.Blob类型介绍

在 MySQL 中,Blob 数据类型用于存储二进制数据。MySQL 提供了四种不同的 Blob 类型:

  • TINYBLOB: 最大存储长度为 255 个字节。
  • BLOB: 最大存储长度为 65,535 个字节。
  • MEDIUMBLOB: 最大存储长度为 16,777,215 个字节。
  • LONGBLOB: 最大存储长度为 4,294,967,295 个字节。

三. Blob 对应的 Java 类型

在 Java 中读取 MySQL Blob 类型时,通常使用 java.sql.Blob 类型。java.sql.Blob 是一个接口,它提供了一些方法来操作 Blob 数据。

根据 MySQL Blob 类型的不同,我们可以使用不同的 Java 类型来存储 Blob 数据。

  • TINYBLOB 对应 byte[] 或 InputStream
  • BLOB 对应 byte[] 或 InputStream
  • MEDIUMBLOB 对应 byte[] 或 InputStream
  • LONGBLOB 对应 byte[] 或 InputStream

我们可以根据需要选择合适的 Java 类型。推荐用InputStream,这样代码不用转换来转换去,比较简单

四.上存取java代码

1.建表

2.建实体类

@Data
public class TTT {
    private String id;
    private String name;
    private  String createTime;
    private byte[] miaoshuByte;
    private InputStream miaoshuInputstream;
}

 3.用个自己写的工具类

public class FileUtil {
    /**
     * file转byte
     */
    public static byte[] file2byte(File file) throws IOException {
        FileInputStream fis = null;
        ByteArrayOutputStream bos = null;
        try {
            fis = new FileInputStream(file);
            bos = new ByteArrayOutputStream();
            IOUtils.copy(fis, bos);
            byte[] bytes = bos.toByteArray();
            return bytes;
        }finally {
            if (fis != null) {
                fis.close();
            }
            if (bos != null) {
                bos.close();
            }
        }
    }
 
    /**
     * byte 转file
     */
    public static File byte2File(byte[] buf,String fileName) throws IOException {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(fileName);
            fos.write(buf);
            File file = new File(fileName);
            return file;
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }
} 

4.访问接口

@RestController
@RequestMapping("order/")
@Slf4j
public class SendHttpWController {
    @Autowired
    private UtimeeMapper utimeeMapper;

    @GetMapping("/aa")
    public String queryById( Integer id) throws IOException {
        TTT ttt = new TTT();
        ttt.setId("30");
        ttt.setName("张三");
        File file = new File("F:\\Desktop\\aa.docx");
        byte[] bytes = FileUtil.file2byte(file);
        ttt.setMiaoshuByte(bytes);
        FileInputStream fileInputStream = new FileInputStream(file);
        ttt.setMiaoshuInputstream(fileInputStream);
        utimeeMapper.insert01(ttt);
        return "嘿嘿额黑8082";
    }
    @GetMapping("/bb")
    public String bb( Integer id) throws IOException {
        TTT ttt = utimeeMapper.select01("30");
        byte[] bytes = ttt.getMiaoshuByte();
        FileUtil.byte2File(bytes,"F:\\Desktop\\cc.docx");
        InputStream inputStream = ttt.getMiaoshuInputstream();
        FileOutputStream outputStream = new FileOutputStream("F:\\Desktop\\dd.docx");
        IOUtils.copy(inputStream, outputStream);//记得添加关流代码(本代码省略了)
        return "嘿嘿额黑8082";
    }

5.输出成果

相关文章:

  • 02 - spring security基于配置文件及内存的账号密码
  • 设计模式 --- 访问者模式
  • 【LeetCode】算法详解#4 ---合并区间
  • 进程线程回顾
  • Pinia最基本用法
  • Nginx基础讲解
  • ros2-rviz2控制unity仿真的6关节机械臂,探索从仿真到实际应用的过程
  • 论文精度:HeightFormer:基于Transformer的体素高度预测在路边3D目标检测中的应用
  • flutter 桌面应用之右键菜单
  • 【Cursor 】Cursor 安装与配置指南:从零开始的高效开发之旅
  • QT6 源(16):存储 QT 里元对象的类信息的类 QMetaClassInfo 的类,只有两个成员函数 name()、value(),比元对象属性简单多了
  • 数据驱动,数字能量分析API助力手机号数据解读
  • RAG Fusion技术详解与应用场景
  • 趣味编程之Spring的白学之路
  • 二、Android Studio环境安装
  • [React] 如何用 Zustand 构建一个响应式 Enum Store?附 RTKQ 实战与 TS 架构落地
  • 波束形成(BF)从算法仿真到工程源码实现-第七节-关于波束10个基本概念
  • Jenkins 发送钉钉消息
  • 前端jest(vitest)单元测试快速手上
  • Redis基础知识:
  • 天问二号探测器顺利转入发射区
  • 15年全程免费,内蒙古准格尔旗实现幼儿园到高中0学费
  • 南京艺术学院博导、雕塑家尹悟铭病逝,年仅45岁
  • 下周或迎外贸“抢出口”高峰,跨境电商敏感货物如何便利化“登机”?
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……