返回介绍

9.1 数据库 BLOB 字段读写

发布于 2025-04-26 13:08:35 字数 3425 浏览 0 评论 0 收藏

对于文件的操作,在数据库中往往是通过 BLOB 字段进行支持的,所以我们先看看 MyBatis 对 Blob 字段的支持。

在第 3 章配置里面,我们谈到了 typeHandler,实际上 MyBatis 在其默认的类型处理器中为我们提供了 BlobTypeHandler 和 BlobByteObjectArrayTypeHandler。其中最常用的是 BlobTypeHandler,而 BlobByteObjectArrayTypeHandler 是用于数据库兼容性的,并不常用。为了方便举例讲解,我们要先建一个数据库表,如代码清单 9-1 所示。

代码清单 9-1:建 BLOB 字段表

CREATE TABLE t_file (
id INT NOT NULL AUTO_INCREMENT, 
file BLOB, 
PRIMARY KEY (id)
);

然后,建一个 POJO 与之对应,如代码清单 9-2 所示。

代码清单 9-2:建立 POJO

public class TFile {
    private Long id; 
    private byte[] file;//用来保存 BLOB 字段
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public byte[] getFile() {
        return file;
    }
    public void setFile(byte[] file) {
        this.file = file;
    }    
}

最后,给出一个映射器的 XML 文件,如代码清单 9-3 所示。

代码清单 9-3:BLOB 字段映射器

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.chapter9.mapper.FileMapper">
<insert id="insertFile" keyProperty="id" useGeneratedKeys="true" parameterType="com.learn.chapter9.pojo.TFile">
insert into t_file(file) values (#{file})
</insert>

<select id="getFile" parameterType="int" resultType="com.learn.chapter9. pojo.TFile">
select id, file from t_file
</select>
</mapper>

我们将其注册在配置文件里面,这样便可以测试代码了,如代码清单 9-4 所示。

代码清单 9-4:测试 BLOB 字段的读取

public static void insert() throws Exception {
                File f = new File("E:\\random.java");
                FileInputStream in = new FileInputStream(f);
                byte[] bytes = new byte[(int) f.length()];
                try {
                        in.read(bytes);
                } finally {
                        in.close();
                }
                TFiletfile = new TFile();
                tfile.setFile(bytes);
                SqlSession session = SqlSessionFactoryUtil.openSqlSession();
                try {
                        FileMapperfmapper = session.getMapper(FileMapper.class);
                        fmapper.insertFile(tfile);
                        System.err.println(tfile.getId());
                        session.commit();
                } catch (Exception ex) {
                        session.rollback();
                        ex.printStackTrace();
                } finally {
                        if (session != null) {
                                session.close();
                        }
                }
        }

        public static void getFile() {
                SqlSession session = SqlSessionFactoryUtil.openSqlSession();
                try {
                        FileMapperfmapper = session.getMapper(FileMapper.class);
                        TFile file = fmapper.getFile(1);
                        System.err.println(file.getFile().length);
                } catch (Exception ex) {
                        session.rollback();
                        ex.printStackTrace();
                } finally {
                        if (session != null) {
                                session.close();
                        }
                }
        }

完成上面的操作就能够正确读取 BLOB 字段了。

但是更多的时候我们都应该有一个文件服务器,数据库读取文件路径即可,而不把文件写入数据库。因为一旦文件很大,那么这个方法就很容易引起内存溢出。所以这样读写 BLOB 字段时要十分小心,注意使用的场景才行。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。