Hibernate 基本类型

文章封面
摘要: 这里介绍几个特殊的 Hibernate 类型和属性一、日期类型我们的 Student 类有一个成员变量 birthdayprivate Date birthda

这里介绍几个特殊的 Hibernate 类型和属性

一、日期类型

我们的 Student 类有一个成员变量 birthday

  1. private Date birthday;//出生日期

在我们的 Studnet.hbm.xml 对应的是自动生成的 属性

  1. <property name="birthday" type="java.util.Date">
  2. <column name="BIRTHDAY" />
  3. property>

type 表示该字段的类型,不同的类型,会让数据表的字段类型也不同

type(映射类型) 描述
java.util.Date 年月日时分秒(2017-07-25 18:20:12)
date 年月日(2017-07-25)
time 时分秒(18:20:12)
timestamp 年月日时分秒(2017-07-25 18:20:12)

二、对象类型

我们这里使用使用 Blob 类型存照片

1、Student 类中 成员变量如下

  1. private int sid;//学号
  2. private String name;//姓名
  3. private int sex;//性别
  4. private Date birthday;//出生日期
  5. private String address;//地址
  6. private Blob picture;//照片

2、然后删除原来的 Student.hbm.xml 文件,重新生成

3、在测试类添加 testWriteBlob方法

  1. @Test
  2. public void testWriteBlob() throws Exception {
  3. Student s = new Student(1,"杜甫",1,new Date(),"四川");
  4. //先获得照片文件
  5. File f = new File("d:"+File.separator+"boy.jpg");
  6. //获得照片文件的输入流
  7. InputStream input = new FileInputStream(f);
  8. //创建Blob对象
  9. Blob image = Hibernate.getLobCreator(session).createBlob(input,input.available());
  10. //设置照片属性
  11. s.setPicture(image);
  12. session.save(s);
  13. }

注意:这里 Blob 是 java.sql.Blob 包下

4、然后使用 Junit Test 运行 testWriteBlob 方法

2017100715505630.png

5、为了证明是否真的是写入数据库中,我们重新把照片读出来

在测试类中添加 testReadBlob 方法

  1. @Test
  2. public void testReadBlob() throws Exception {
  3. Student s = (Student)session.get(Student.class, 1);
  4. //获得Blob对象
  5. Blob image = s.getPicture();
  6. //获得照片的输入流
  7. InputStream input = image.getBinaryStream();
  8. //创建输出流
  9. File f = new File("d:"+File.separator+"dest.jpg");
  10. //获得输出流
  11. OutputStream output = new FileOutputStream(f);
  12. //创建缓冲区
  13. byte[] buff = new byte[input.available()];
  14. input.read(buff);
  15. output.write(buff);
  16. input.close();
  17. output.close();
  18. }

6、使用 Junit Test 运行 testReadBlob 方法

我们可以看到 D 盘,已经生成了一张新照片,dest.jpg

20171007155038568.png

三、组件属性

实体类中某个属性属于用户自定义的类的对象,下面我们通过一个例子来解释

1、实体类 Student.java 成员变量如下

  1. private int sid;//学号
  2. private String name;//姓名
  3. private int sex;//性别
  4. private Date birthday;//出生日期
  5. //private String address;//地址
  6. private Blob picture;//照片
  7. private Address address; //地址

我们这里把之前的 String 类型的 address 改成 Address 类型

2、Address 类 部分代码如下

  1. private String postcode;//邮编
  2. private String phone;//手机
  3. private String address;//地址
  4. public Address(String postcode, String phone, String address) {
  5. this.postcode = postcode;
  6. this.phone = phone;
  7. this.address = address;
  8. }

3、修改 Student.hbm.xml

将之前的

  1. <property name="address" type="java.lang.String">
  2. <column name="ADDRESS" />
  3. property>

改成

  1. <component name="address" class="Address">
  2. <property name="postcode" column="POSTCODE"/>
  3. <property name="phone" column="PHONE"/>
  4. <property name="address" column="ADDRESS"/>
  5. component>

注意:单词不要打错

4、修改 测试类 testSaveStudent 代码

  1. @Test
  2. public void testSaveStudnets() {
  3. //生成学生对象
  4. Student s = new Student();
  5. s.setName("陶渊明");
  6. s.setSex(1);
  7. s.setBirthday(new Date());
  8. //s.setAddress("江西九江");
  9. Address address = new Address("332000","13512345678","江西九江");
  10. s.setAddress(address);
  11. session.save(s);//保存对象进入数据库
  12. }

5、修改 hibernate.cfg.xml 里的创建表的策略

因为要修改表结构,暂且把 update 改成 create

6、用 Junit Test 运行 testSaveStudent 方法

运行成功,查看数据表

2017100715512437.jpg

查看 表结构

20171007155135604.jpg

173 阅读 ← 返回技术栈
图片放大