Hibernate 基本类型

这里介绍几个特殊的 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.class1);
  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

 

  • 微信
  • 赶快加我聊天吧
  • 博客交流群
  • 海纳百川,大家来水
  • weinxin
风起云涌

发表评论 取消回复