将二进制文件插入数据库:基于Hibernate重写JDBC插入SQL语句
用Hibernate重写JDBC二进制文件插入逻辑
没问题,我帮你把这段JDBC的二进制文件插入逻辑转换成Hibernate实现,分两部分来完成:
1. 定义对应数据库表的实体类
首先需要创建一个映射KNOWLEDGEBASE_FILES表的实体类,Hibernate通过ORM操作数据库,实体类是核心载体:
import javax.persistence.*; @Entity @Table(name = "KNOWLEDGEBASE_FILES") public class KnowledgebaseFile { @Id @Column(name = "ID") private Integer id; @Column(name = "KNOWLEDGEBASE_ID") private Integer knowledgebaseId; @Column(name = "FILE_NAME") private String fileName; // 用byte[]映射数据库的BLOB类型,Hibernate会自动处理二进制数据的转换 @Column(name = "FILE", columnDefinition = "BLOB") private byte[] fileContent; // 无参构造函数是Hibernate的强制要求,不能省略 public KnowledgebaseFile() {} // Getter和Setter方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getKnowledgebaseId() { return knowledgebaseId; } public void setKnowledgebaseId(Integer knowledgebaseId) { this.knowledgebaseId = knowledgebaseId; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public byte[] getFileContent() { return fileContent; } public void setFileContent(byte[] fileContent) { this.fileContent = fileContent; } }
2. 编写Hibernate的插入操作代码
接下来替换原来的JDBC代码,用Hibernate的Session完成数据持久化:
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import javax.servlet.http.Part; import java.io.IOException; import java.io.InputStream; import java.util.Objects; // 假设你已经完成了SessionFactory的初始化(通常通过配置文件或容器管理) SessionFactory sessionFactory = ...; try (Session session = sessionFactory.openSession()) { Transaction transaction = session.beginTransaction(); // 处理上传文件的输入流,转换为byte数组 Part file = ...; // 你的文件Part对象 InputStream inputStream = file.getInputStream(); // Java 9+支持readAllBytes,Java 8及以下可使用Apache Commons IO的IOUtils.toByteArray(inputStream) byte[] fileBytes = inputStream.readAllBytes(); // 实例化实体类并赋值 KnowledgebaseFile kbFile = new KnowledgebaseFile(); kbFile.setId(obj.number); // obj是你业务中的原数据对象 kbFile.setKnowledgebaseId(obj.number); kbFile.setFileName(Objects.requireNonNull(file.getSubmittedFileName())); kbFile.setFileContent(fileBytes); // 将实体对象保存到数据库 session.save(kbFile); // 提交事务 transaction.commit(); } catch (IOException e) { // 处理文件读取异常 e.printStackTrace(); } catch (Exception e) { // 处理Hibernate相关异常,确保异常时事务回滚 e.printStackTrace(); if (session != null && session.getTransaction().isActive()) { session.getTransaction().rollback(); } }
补充注意点:
- 如果你的项目使用Java 8,
inputStream.readAllBytes()不可用,可以引入Apache Commons IO依赖,用IOUtils.toByteArray(inputStream)来完成流转byte数组的操作。 - 确保
SessionFactory是全局单例的,避免重复创建造成资源浪费。 - 实体类的字段要和数据库表的列名、数据类型严格对应,避免映射错误。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

