一、基本映射类型
实例:
Book.java
package com.java1234.model;
import java.sql.Blob;
import java.util.Date;
public class Book {
private int id;
private String bookName; // 图书名称
private float price; // 图书价格
private boolean specialPrice; // 是否是特价
private Date publishDate; // 发布日期
private String author; // 作者
private String introduction; // 简介
private Blob bookPic; // 图书图片
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isSpecialPrice() {
return specialPrice;
}
public void setSpecialPrice(boolean specialPrice) {
this.specialPrice = specialPrice;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public Blob getBookPic() {
return bookPic;
}
public void setBookPic(Blob bookPic) {
this.bookPic = bookPic;
}
}
Book.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.java1234.model">
<class name="Book" table="t_book">
<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>
<!--在Hibernate中映射文件*.hbm.xml中type="date"和不写type="date"的区别:
第一种:type="date"
<property name="createTime" column="createTime" type="date"></property>
页面显示时间格式:yyyy-MM-dd
第二种:不写type="date"
<property name="createTime"column="createTime" ></property>
页面显示时间格式:yyyy-MM-dd HH:mm:ss
-->
<property name="publishDate" column="publishDate" type="date"></property>
<property name="author" column="author" length="20"></property>
<property name="introduction" column="introduction" type="text"></property>
<property name="bookPic" column="bookPic" type="blob"></property>
</class>
</hibernate-mapping>
BookTest.java
public class BookTest {
public static void main(String[] args) {
SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
}
}
数据库生成的表:
因为涉及到图片类型的存储(private Blob bookPic; ),更新一下数据库驱动
图片放到c盘
BookTest
package com.java1234.service;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.text.SimpleDateFormat;
import org.hibernate.LobHelper;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.java1234.model.Book;
import com.java1234.util.HibernateUtil;
public class BookTest {
public static void main(String[] args) throws Exception{
SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
Book book=new Book();
book.setBookName("java编程思想");
book.setPrice(100);
book.setSpecialPrice(true);
book.setPublishDate(new SimpleDateFormat("yyyy-MM-dd").parse("2013-1-1"));
book.setAuthor("埃克尔");
book.setIntroduction("简介...");
//Hibernate提供的LobHelper图片操作接口
LobHelper lobHelper=session.getLobHelper();
//定义文件输入流
InputStream in=new FileInputStream("c://java编程思想.jpg");
//createBlob(输入流, 长度)
Blob bookPic=lobHelper.createBlob(in, in.available());
book.setBookPic(bookPic);
session.save(book);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
}
}
执行
数据库
二、集合映射类型
不同于映射关系一对多,不在session缓存中的,不带OID的,就是数据集合
实例:
1.Set
Student.java
package com.java.model;
import java.util.Set;
public class Student {
private String name;
private long id;
private Set<String> images;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Set<String> getImages() {
return images;
}
public void setImages(Set<String> images) {
this.images = images;
}
}
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
<class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<set name="images" table="t_image">
<!---->
<key column="studentId"></key>
<!---->
<element column="imageName" type="string"></element>
</set>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<!--导入映射文件-->
<mapping resource="com/java/model/Student.hbm.xml"/>
StudentTest.java
@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.setName("张三");
s1.setImages(imageSet);
session.save(s1);
}
@Test
public void testSetFetch(){
Student student=(Student)session.get(Student.class, Long.valueOf(1));
Iterator it=student.getImages().iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
数据库:重复的数据加不进去
取数据是无序的
2.list
Student2.java
package com.java.model;
import java.util.List;
public class Student2 {
private String name;
private long id;
private List<String> images;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
}
Student2.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
<class name="Student2" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<list name="images" table="t_image2">
<key column="studentId"></key>
<!--这里要加一个索引-->
<list-index column="imageIndex"></list-index>
<element column="imageName" type="string"></element>
</list>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<mapping resource="com/java/model/Student2.hbm.xml"/>
StudentTest.java
@Test
public void testListSave(){
List<String> imageList=new ArrayList<String>();
imageList.add("image1.png");
imageList.add("image2.png");
imageList.add("image3.png");
imageList.add("image3.png");
Student2 s2=new Student2();
s2.setName("李四list");
s2.setImages(imageList);
session.save(s2);
}
@Test
public void testListFetch(){
Student2 student2=(Student2)session.get(Student2.class, Long.valueOf(2));
Iterator it=student2.getImages().iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
数据库:,
发现多了索引imageIndex,可以重复
打印数据:
3.bag
Student3.java
package com.java.model;
import java.util.List;
public class Student3 {
private String name;
private long id;
//bag,由hibernate提出,用list集合
private List<String> images;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
}
Student3.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
<class name="Student3" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<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>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<mapping resource="com/java/model/Student3.hbm.xml"/>
StudentTest.java
@Test
public void testBagSave(){
List<String> imageList=new ArrayList<String>();
imageList.add("image1.png");
imageList.add("image2.png");
imageList.add("image3.png");
imageList.add("image3.png");
Student3 s3=new Student3();
s3.setName("王五bag");
s3.setImages(imageList);
session.save(s3);
}
@Test
public void testBagFetch(){
Student3 student3=(Student3)session.get(Student3.class, Long.valueOf(3));
Iterator it=student3.getImages().iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
数据库
有主键
打印,其实是无序的,偶尔有序,可以重复
4.map
Student4.java
package com.java.model;
import java.util.Map;;
public class Student4 {
private String name;
private long id;
//键值对形式
private Map<String,String> images;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Map<String, String> getImages() {
return images;
}
public void setImages(Map<String, String> images) {
this.images = images;
}
}
Student4.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
<class name="Student4" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<map name="images" table="t_image4">
<!-- 外键 -->
<key column="studentId"></key>
<!-- 键值对形式-->
<map-key column="imageKey" type="string"></map-key>
<element column="imageName" type="string"></element>
</map>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<mapping resource="com/java/model/Student4.hbm.xml"/>
StudentTest.java
@Test
public void testMapSave(){
Map<String,String> imageMap=new HashMap<String,String>();
imageMap.put("i1", "image1.png");
imageMap.put("i2", "image2.png");
imageMap.put("i3", "image3.png");
imageMap.put("i4", "image4.png");
Student4 s4=new Student4();
s4.setName("赵六Map");
s4.setImages(imageMap);
session.save(s4);
}
@Test
public void testMapFetch(){
Student4 student4=(Student4)session.get(Student4.class, Long.valueOf(4));
Map<String,String> imageMap=student4.getImages();
//获取keys
Set keys=imageMap.keySet();
Iterator it=keys.iterator();
while(it.hasNext()){
String key=(String)it.next();
System.out.println(key+":"+imageMap.get(key));
}
}
数据库
转载于:https://my.oschina.net/u/3848699/blog/2240085