c8

1970-1-1 yangjing

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\"

 

« c2

发表评论:

@2020 HowTD 浙ICP备18004985号

浙公网安备 33010202001281号