Hibernate如何使用Blob对象类型(秒懂)

Hibernate中Blob对象类型的使用

编辑器 Intellij IDEA 2019 3.3

先创建Hibernate项目,导入相应的安装包

工具包:下载

1. hibernate.cfg.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
      <!-- 1. 数据库链接 -->
      <property name="hibernate.connection.driver_class">org.h2.Driver</property>
      <property name="hibernate.connection.url">jdbc:h2:~/h2/h2demo;AUTO_SERVER=TRUE</property>
      <property name="hibernate.connection.username">sa</property>
      <property name="hibernate.connection.password"></property>
      <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>

      <!-- 2. 其他相关配置 -->
        <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
        <property name="hibernate.show_sql">false</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">false</property>
        <!-- 2.3 自动建表  -->
        <!-- <property name="hibernate.hbm2ddl.auto">create</property>  -->

        <!--3. 加载所有映射-->
        <mapping resource="db/hibernate/College.hbm.xml"/>
      <mapping resource="db/hibernate/Student.hbm.xml"/>
   </session-factory>
</hibernate-configuration>

1.1 数据库 dialect

数据库方言属性
DB2org.hibernate.dialect.DB2Dialect
HSQLDBorg.hibernate.dialect.HSQLDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Informixorg.hibernate.dialect.InformixDialect
Ingresorg.hibernate.dialect.IngresDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Microsoft SQL Server 2000org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008org.hibernate.dialect.SQLServer2008Dialect
MySQLorg.hibernate.dialect.MySQLDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 11gorg.hibernate.dialect.Oracle10gDialect
Oracle 10gorg.hibernate.dialect.Oracle10gDialect
Oracle 9iorg.hibernate.dialect.Oracle9iDialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
Progressorg.hibernate.dialect.ProgressDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialec

1.2 参数配置

  • hibernate.dialect
    • 使 Hibernate 应用为被选择的数据库生成适当的 SQL
    • ◦org.hibernate.dialect.SQLServerDialect
  • hibernate.connection.driver_class
    • JDBC 驱动程序类
  • hibernate.connection.url
    • 数据库实例的 JDBC URL
  • hibernate.connection.username
    • 数据库用户名
  • hibernate.connection.password
    • 数据库密码
  • hibernate.connection.pool_size
    • 限制在 Hibernate 应用数据库连接池中连接的数量
  • hibernate.connection.autocommit
    • 允许在 JDBC 连接中使用自动提交模式

2. 实体类 Student.java

photo 为 Bolo 类型

public class Student {
   private int id;
   private String no;
   private String name;
   private int age;
   private Date birthday;
   private Blob photo;

   public Student() {}

   public Student(int id, String no, String name, int age, Date birthday) {
      this.id = id;
      this.no = no;
      this.name = name;
      this.age = age;
      this.birthday = birthday;
   }
   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getNo() {
      return no;
   }

   public void setNo(String no) {
      this.no = no;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getAge() {
      return age;
   }

   public void setAge(int age) {
      this.age = age;
   }

   public Date getBirthday() {
      return birthday;
   }

   public void setBirthday(Date birthday) {
      this.birthday = birthday;
   }

   public Blob getPhoto() {
      return photo;
   }

   public void setPhoto(Blob photo) {
      this.photo = photo;
   }

   @Override
   public String toString() {
      return "Student{" +
            "id=" + id +
            ", no='" + no + '\'' +
            ", name='" + name + '\'' +
            ", age=" + age +
            ", birthday=" + birthday +
            ", photo=" + photo +
            '}';
   }
}

3. 配置 Student.hbm.xml

用Hibernate映射到数据库中所使用的类型

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-3-31 23:15:19 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="db.jdbc.Student" table="STUDENT">
        <id name="Id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <!-- 添加属性和表字段的映射 -->
        <property name="no" type="java.lang.String">
            <column name="NO" />
        </property>
        <property name="name" type="java.lang.String">
            <column name="NAME"/>
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="AGE"/>
        </property>
        <!--使用 java.util.Date 类型,在数据库中字段的类型为 datetime(会出现时分秒)-->
        <!--<property name="birthday" type="java.util.Date">-->
        <property name="birthday" type="java.sql.Date">
            <column name="BIRTHDAY"/>
        </property>
        
        <property name="photo" type="java.sql.Blob" column="PHOTO"></property>
    </class>
</hibernate-mapping>

4. 添加测试类

两个测试方法:insertPhoto() 插入一条记录;readPhoto() 读一条记录并保存

/**
 * @author hz
 * @date 2020/4/23
 */

public class TestStudent {
    private SessionFactory factory;
    private Session session;

    @Before
    public void init() {
        //创建服务注册对象
        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure().build();
        Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
        factory = metadata.buildSessionFactory();
        //会话对象
        session = factory.openSession();
        //开启事务
        session.beginTransaction();
    }

    @After
    public void destory() {
        session.getTransaction().commit(); //提交事务
        session.close(); //关闭会话
        factory.close(); //关闭会话工厂
    }

    
    @Test
    public void insertPhoto() throws IOException {
        // 生日
        long b = System.currentTimeMillis();
        Date birthday = new Date(b - b % oneDay);
        // 获取图片
        String imagePath = System.getProperty("user.dir") + "\\t3.jpg";
        File file = new File(imagePath);
        InputStream is = new FileInputStream(file);
        Student student = new Student(888, "20170104", "王五", 20, birthday);
        // 创建一个Blob对象
        Blob image = Hibernate.getLobCreator(session).createBlob(is, is.available());
        // 设置照片属性
        student.setPhoto(image);
        session.save(student);
    }
    
    @Test
    public void readPhoto() throws SQLException, IOException {
        // 主键为 888 的记录
        Student student = session.get(Student.class, 888);
        // 获取blob 对象
        Blob blob = student.getPhoto();
        // 获取照片输入流
        InputStream is = blob.getBinaryStream();
        // 创建输出流
        String imagePath = System.getProperty("user.dir") + "\\t4.jpg";
        File file = new File(imagePath);
        OutputStream os = new FileOutputStream(file);
        // 创建缓冲区
        byte [] buffer = new byte[is.available()];
        is.read(buffer);
        os.write(buffer);
        is.close();
        os.close();
    }

}

查看数据,数据插入成功:
在这里插入图片描述

Blob 是一个 JavaScript 对象,用于表示二进制数据。它可以用于创建文件、读取文件、上传文件等场景。在 Web 开发中,Blob 对象常用于发送二进制数据、创建临时文件等。 Blob 对象有以下常用的 API: 1. Blob():创建一个新的 Blob 对象。 2. Blob.size:返回 Blob 对象的大小(以字节为单位)。 3. Blob.type:返回 Blob 对象的 MIME 类型。 4. Blob.slice():从 Blob 对象中创建一个新的 Blob 对象,该对象表示原始 Blob 对象的一部分。 下面是一个简单的示例,演示了如何创建一个包含文本的 Blob 对象: ```javascript const text = 'Hello, World!'; const blob = new Blob([text], { type: 'text/plain' }); ``` 在上面的示例中,我们使用Blob 构造函数创建了一个包含文本的 Blob 对象。第一个参数是一个数组,其中包含要包含在 Blob 对象中的数据。第二个参数是一个可选的对象,用于指定 Blob 对象的 MIME 类型。 我们还可以使用 File API 将 Blob 对象保存为文件。下面是一个示例: ```javascript const text = 'Hello, World!'; const blob = new Blob([text], { type: 'text/plain' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'hello.txt'; a.click(); ``` 在上面的示例中,我们创建了一个链接,将 Blob 对象的 URL 赋值给该链接的 href 属性。然后,我们将链接的 download 属性设置为文件名,并模拟用户点击链接以下载文件。 总之,使用 Blob 对象可以方便地处理二进制数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值