Hibernate Blob类型写入写出

本文介绍了如何在JavaBean中处理Blob类型数据,包括正确导入Blob类型、使用Hibernate框架保存和读取图片等二进制数据的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaBean

首先要有一个Javabean,要注意的是Blob类型要导入的包是 java.sql.Blob,而不是com.mysql.cj.jdbc.Blob

import java.sql.Blob;
import java.util.Date;

/**学生类
 * @author qiqiangvae
 *
 */
public class Students {
    private int id;
    private String name;
    private String gender;
    private Date date;
    private String address;
    private Blob picture;

    public Students() {
    }

    public Students(int id, String name, String gender, Date date, String address) {
        super();
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.date = date;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Students [id=" + id + ", name=" + name + ", "
                + "gender=" + gender + ", date=" + date + ", "
                + "address="+ address + "]";
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

    public Blob getPitcure() {
        return picture;
    }

    public void setPicture(Blob picture) {
        this.picture = picture;
    }

}

Students.hbm.xml

<hibernate-mapping>
    <class name="Students" table="STUDENTS">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="gender" type="java.lang.String">
            <column name="GENDER" />
        </property>
        <property name="date" type="java.util.Date">
            <column name="DATE" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" />
        </property>
        <!-- 此处包名不能错,注意 access="field"-->
        <!-- 如果更改了Students类中的属性,宁愿删除Students.hbm.xml文件重新创建一个-->
        <property name="picture" type="java.sql.Blob" access="field">
            <column name="PICTURE" />
        </property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
        <property name="connection.username">root</property>
        <property name="connection.password">qiqiang</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 如果出现Server time zone is unrecognized,加上serverTimezone=GMT -->
        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="Students.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

写入Blob类型数据

public void testSaveStudents() {
        Students s=new Students();
        File file=new File("C:/Users/qiqiangvae/Desktop/avatar.png");
        InputStream inputStream = null;
        Blob image=null;
        try {
            inputStream = new FileInputStream(file);
            image=Hibernate.getLobCreator(session).createBlob(inputStream,inputStream.available());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(image.toString());
        s.setName("李心剑");
        s.setDate(new Date());
        s.setAddress("纯阳宫");
        s.setPicture(image);
        session.save(s);
    }

读取Blob类型数据

public void testReadStudents() {    
        Students s=(Students) session.get(Students.class, 5);//此处的1位数据库内students表中的主键
        //获取Blob对象
        Blob image=s.getPitcure();
        InputStream inputStream;
        OutputStream outputStream;
        try {
            //获取照片的输入流
            inputStream=image.getBinaryStream();
            //创建输出流
            File file=new File("C:/Users/qiqiangvae/Desktop/newavatar.png");
            //获得输出流
            outputStream=new FileOutputStream(file);
            //创建缓冲区
            byte[] buff=new byte[inputStream.available()];
            inputStream.read(buff);
            outputStream.write(buff);
            //关闭输入输出流
            inputStream.close();
            outputStream.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结

  • 如果出现Server time zone is unrecognized,这是由于数据库和系统时区差异所造成的,将JDBC驱动换成低版本的,或者在hibernate.cfg.xmlconnection.url中加上serverTimezone=GMT
  • Blob包名千万不能导入错了,是java.sql.Blob类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值