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&characterEncoding=UTF-8&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.xml的connection.url中加上serverTimezone=GMT。
- Blob包名千万不能导入错了,是java.sql.Blob类型。