文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
9.1 数据库 BLOB 字段读写
对于文件的操作,在数据库中往往是通过 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 字段时要十分小心,注意使用的场景才行。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论