Hibernate中Blob对象类型的使用
2016-05-17 14:16
393 查看
使用Intellij IDEA创建Hibernate项目,目录结构如下:
其中 assets/app.png 为将要存储的照片,src/hibernate.cfg.xml 为Hibernate的配置文件,Students为实体,Students.hbm.xml 为对象关系映射的配置文件,test目录下其中使用到的测试类为 StudentsTest 类,使用到junit进行测试。(其他两个与此次说明无关)
hibernate.cfg.xml(使用mysql数据库中名为 hibernate的数据库)
Students.java (使用picture属性存储Blob类型数据)
Students.hbm.xml(注意使用Hibernate映射到数据库中所使用的类型)
StudentsTest.java 测试类
主要测试方法有两个 testWriteBlob 和 testReadBlob,保存一条含blob类型的记录和读取一条记录中的picture字段的值,并存储为图片文件。
运行 testWriteBlob 测试方法:
查看数据库(插入成功):
运行testReadBlob方法,读取 刚插入的记录 的picture字段的值,并保存成图片:
我们可以看到,成功读取并生成了一张图片:
其中 assets/app.png 为将要存储的照片,src/hibernate.cfg.xml 为Hibernate的配置文件,Students为实体,Students.hbm.xml 为对象关系映射的配置文件,test目录下其中使用到的测试类为 StudentsTest 类,使用到junit进行测试。(其他两个与此次说明无关)
hibernate.cfg.xml(使用mysql数据库中名为 hibernate的数据库)
<?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> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 下面的 hibernate 指的是 数据库名,即所用的数据库 --> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</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">create</property>--> <property name="hbm2ddl.auto">update</property> <!-- getCurrentSession方式获取 session 时需要添加如下配置 --> <property name="hibernate.current_session_context_class">thread</property> <mapping resource="Students.hbm.xml"/> <!-- DB schema will be updated if needed --> <!-- <property name="hbm2ddl.auto">update</property> --> </session-factory> </hibernate-configuration>
Students.java (使用picture属性存储Blob类型数据)
import java.sql.Blob; import java.util.Date; /** * Created by DreamBoy on 2016/5/15. */ //学生类 public class Students { //1. 必须为公有的类 //2. 必须提供公有的不带参数的默认的构造方法 //3. 属性私有 //4. 属性setter/getter封装 private int sid; //学号 private String sname; //姓名 private String gender; //性别 private Date birthday; //出生日期 private String address; //地址 private Blob picture; //照片 public Students() { } public Students(int sid, String sname, String gender, Date birthday, String address) { this.sid = sid; this.sname = sname; this.gender = gender; this.birthday = birthday; this.address = address; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Blob getPicture() { return picture; } public void setPicture(Blob picture) { this.picture = picture; } @Override public String toString() { return "Students{" + "sid=" + sid + ", sname='" + sname + '\'' + ", gender='" + gender + '\'' + ", birthday=" + birthday + ", address='" + address + '\'' + '}'; } }
Students.hbm.xml(注意使用Hibernate映射到数据库中所使用的类型)
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Students" table="students"> <id name="sid" type="int"> <column name="sid"/> <!--<generator class="assigned"/>--> <generator class="native"/> </id> <property name="sname" type="java.lang.String"> <column name="sname"/> </property> <property name="gender" type="java.lang.String"> <column name="gender"/> </property> <!--使用 java.util.Date 类型,在数据库中字段的类型为 datetime(会出现时分秒)--> <!--<property name="birthday" type="java.util.Date">--> <!--使用 Hibernate 中的数据类型 date,在数据库中字段的类型为 date (就不会出现时分秒了)--> <property name="birthday" type="date"> <column name="birthday"/> </property> <property name="address" type="java.lang.String"> <column name="address"/> </property> <property name="picture" type="java.sql.Blob"> <column name="picture"/> </property> </class> </hibernate-mapping>
StudentsTest.java 测试类
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; import java.io.*; import java.sql.Blob; import java.sql.SQLException; import java.util.Date; /** * Created by DreamBoy on 2016/5/15. */ //测试类 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 s1 = new Students(); //如果 Students.hbm.xml 映射配置文件设置了 主键native,mysql中主键自增长,即便你设置了主键的值,也是不起作用的 s1.setSname("s1"); s1.setGender("男"); s1.setBirthday(new Date()); s1.setAddress("汕头"); Students s2 = new Students(); s2.setSname("s2"); s2.setGender("女"); s2.setBirthday(new Date()); s2.setAddress("广州"); //session.save(s); //保存对象进入数据库 session.save(s1); session.save(s2); } @Test public void testWriteBlob() throws IOException { Students s = new Students(1, "张三丰", "男", new Date(), "武当山"); //先获得照片文件 //File f = new File("d:" + File.separator + "boy.jpg"); /*File directory = new File("");//参数为空 String courseFile = directory.getCanonicalPath() ; System.out.println(courseFile);*/ File f = new File("assets/app.png"); //获得文件输入流 InputStream input = new FileInputStream(f); //创建一个Blob对象 Blob image = Hibernate.getLobCreator(session).createBlob(input, input.available()); //设置照片属性 s.setPicture(image); input.close(); session.save(s); } @Test public void testReadBlob() throws SQLException, IOException { Students s = (Students) session.get(Students.class, 1); //主键为1的Studetns记录 //获得Blob对象 Blob image = s.getPicture(); //获得照片输入流 InputStream input = image.getBinaryStream(); //创建输出流 File f = new File("assets/dest.png"); OutputStream output = new FileOutputStream(f); //创建缓冲区 byte[] buff = new byte[input.available()]; input.read(buff); output.write(buff); input.close(); output.close(); } }
主要测试方法有两个 testWriteBlob 和 testReadBlob,保存一条含blob类型的记录和读取一条记录中的picture字段的值,并存储为图片文件。
运行 testWriteBlob 测试方法:
查看数据库(插入成功):
运行testReadBlob方法,读取 刚插入的记录 的picture字段的值,并保存成图片:
我们可以看到,成功读取并生成了一张图片:
相关文章推荐
- Codeforces Round #353 (Div. 2) B. Restoring Painting
- 解决Web部署 svg/woff/woff2字体 404错误
- Eat Candy(暴力,水)
- JS中的call()和apply()方法
- SQL编程:合并字符串不求人 ---> group_concat函数就能行
- 买卖股票的最佳时机 II
- 大数 (整数)乘法,除法
- c:forEach varStatus属性
- 正则表达式语法
- AFNetwork 作用和用法详解
- C#验证子网掩码的正确性
- IBM X3650 服务器更换内存的过程记录
- 一些关于dagger2的理解(二)
- git开源库——视图控件——左侧抽屉侧边栏
- iOS雷达图 iOS RadarChart实现
- JavaScript 设置、读取Cookie
- 推荐系统概论
- 【第十二章】零配置 之 12.1 概述 ——跟我学spring3
- 【bug记录】mysql5.7.9-win64 的3534问题
- 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量