基本类型映射

  • 左边为映射文件中指定类型时使用的,右边为映射到数据库时的字段类型
  • 比如下面几种类型映

     //实体类
     public class Book {
    
         private int id;
         private String bookName;
         private float price;
         private boolean specialPrice; //是否特价
         private Date publishDate; //发布日期
         private String author;
         private String introdution; //简介
         private Blob bookPic; //图书图片
    }
    
    //映射文件
    <id name="id" column="bookId">
         <generator class="native"></generator>
     </id>
    
     <property name="bookName" column="bookName" length="40"></property>
     <property name="price" column="price" type="float"></property>
     <property name="specialPrice" column="specialPrice" type="boolean"></property>
     <property name="publishDate" column="publishDate" type="date"></property>
     <property name="author" column="author" length="20"></property>
     <property name="introdution" column="introduction" type="text"></property>
     <property name="bookPic" column="bookPic" type="blob"></property>
    
     //设置值时将二进制文件转换为Blog类型,用hibernate的方法
     LobHelper lobHelper=session.getLobHelper();
     InputStream in=new FileInputStream("D://puchijun.jpg");
     Blob bookPic=lobHelper.createBlob(in, in.available());
     book.setBookPic(bookPic);
    
  • Boolean类型对应数据库bit类型,是1/0,sqlyog显示不出其为0时,可以用select语句将要查询的字段+0即可变成1展示出来。

    集合类型映射

  • 要两边都能互相获取的话就必须在两边的映射文件都配置和对方的关联,参见笔记:hibernate学习之表关联和级联中class映射文件的set集合。
  • Set:无序不重复

     //类
     public class Student {
    
         private long id;
         private String name;
         private Set<String> images;
    }
    
    //映射文件
    <!--set映射的是对方表-->
    <set name="images" table="t_image"> <!--待会会自动创建一张t_image表-->
         <key column="studentId"></key> <!--t_image表的外键是studentId,关联的是本表主键-->
         <element column="imageName" type="string"></element> <!--元素,image表中另一字段-->
     </set>
    
     //测试用例
     /**
     * 保存一学生的几张照片
     */
     @Test
     public void testSetSave() {
         Set<String> imageSet=new HashSet<String>();
         imageSet.add("image1.png");
         imageSet.add("image2.png");
         imageSet.add("image3.png");
         imageSet.add("image3.png"); //加不进去,不可重复
    
         Student s1=new Student();
         s1.setImages(imageSet);
         session.save(s1);
     }
    
    • 数据库

  • List:有序可重复

    //映射文件
    <list name="images" table="t_image2">
        <key column="studentId"></key>
        <list-index column="imageIndex"></list-index> <!-- 多一个索引字段,因为list是有序的 -->
        <element column="imageName" type="string"></element>
    </list>
    
    • 数据库

  • Bag:无序可重复

    //映射文件
    <idbag name="images" table="t_image3">
        <collection-id type="long" column="imageId"> <!-- 加个主键区分相同的两条记录 -->
            <generator class="increment"></generator>
        </collection-id>
        <key column="studentId"></key>
        <element column="imageName" type="string"></element>
    </idbag>
    
    • 数据库

  • Map:键值对,键不可重复

    //映射文件
    <map name="images" table="t_image4">
        <key column="stuId"></key> <!--既是外键也是本表主键-->
        <map-key column="imageKey" type="string"></map-key> <!--key,也被搞成主键,联合主键,没什么用但是一定要有-->
        <element column="imageName" type="string"></element>
    </map>
    
    • 数据库

    • 获取Map

      public void testMapFecth() {
          Student4 student4=(Student4)session.get(Student4.class, Long.valueOf(1));
          Map<String, String> imageMap=student4.getImages();
          //首先获取keys
          Set keys=imageMap.keySet();
          Iterator  iterator=keys.iterator();
          while(iterator.hasNext()) {
              String key=(String)iterator.next();
              System.out.println(key+":"+imageMap.get(key)); //集合.get(key):获取值
          }
      }
      

      代码实例

  • eclipse->HibernateTypeMapping