binary:字节数据
text/clob:文本数据类型
blob:二进制数据类型(音频/视频/图片等)
注:
(文本长度依次递增)
使用hibernate向数据库中添加一个blob(二进制)类型字段,并向其中添加blob类型数据:
在Students类中添加一个Blob类型属性picture:
private Blob picture; //照片
Students.hbm.xml中:
<property name="picture" type="java.sql.Blob">
<column name="picture"></column>
</property>
在D盘根目录下存放一个照片:“1.jpg”
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.util.Date;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
//测试类
public class StudentsTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){ //初始化
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象,打开会话
session=sessionFactory.openSession();
//打开事务
transaction=session.beginTransaction();
}
@After
public void destory(){ //释放资源
//提交事务
transaction.commit();
//关闭会话
session.close();
//关闭会话工厂
sessionFactory.close();
}
@Test
public void testSaveStudents(){
//生成学生对象
// Students s=new Students(1,"张三丰","男",new Date(),"武当山");
Students s=new Students();
// s.setSid(1); //native:主键自动增长,无须赋值;若强制赋值无效果
s.setSname("张三丰");
s.setGender("男");
s.setBirthday(new Date());
s.setAddress("武当山");
//保存对象进入数据库
session.save(s);
}
@Test
public void testWriteBlob() throws Exception{ //写入二进制数据
Students s=new Students(1,"张三丰","男",new Date(),"武当山");
//获得照片文件
File f=new File("d:"+File.separator+"1.jpg");
//获得照片文件的输入连
InputStream input=new FileInputStream(f); //字节流
//创建一个Blob对象
Blob image=Hibernate.getLobCreator(session).createBlob(input, input.available()); //session是会话对象。createBlob方法第一个参数表示从哪个输入流读取,第二个参数表示读取的长度(输入流可用的字节数)。
//设置照片属性
s.setPicture(image);
//保存学生
session.save(s);
}
@Test
public void testReadBlob() throws Exception{ //从数据库读取二进制数据,此时hibernate.cfg.xml中<property name="hbm2ddl.auto">update</property>一定设置为update,否则会清空表中原有数据
//加载一个学生对象
Students s=(Students)session.get(Students.class, 1); //第二个参数是标识符,即表中主键的数据
//获得Blob对象
Blob image=s.getPicture();
//获得照片的输入流
InputStream input=image.getBinaryStream();
//创建输出流,输出到一个文件上
File f=new File("d:"+File.separator+"dest.jpg"); //写到d盘根目录下
//获得输出流
OutputStream output=new FileOutputStream(f);
//创建缓冲区,字节数组
byte[] buff=new byte[input.available()];
input.read(buff); //读到缓冲区内
output.write(buff); //写
input.close();
output.close();
}
}
数据库中新增加一个字段及数据:
从数据库读取二进制数据到D盘中:
注:从数据库读取二进制数据,此时hibernate.cfg.xml中<property name="hbm2ddl.auto">update</property>
一定设置为update,否则会清空表中原有数据