hibernate中基本的数据类型与Java中的类型以及标准的SQL类型映射关系如图所示:
Hibernate中布尔类型boolean对应着SQL类型为BIT(位)类型,Hibernate中text和clob对应数据库的CLOB,这个是字符的大对象,一般用来存储大的文章啊,纯文字的。
BLOB是二进制,一般存储图像视频等大文件。
通过一个例子来看一下各个类型的应用:
1.新建工程Hibernate06
2.新建Book类:
package com.test.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;
}
}
这里说一下,introduction属性为图书的简介,内容比较多,在数据库中要使用CLOB类型来保存,根据映射图知道其在JAVA中用String或者Clob类型,我们这里使用了String类型。bookPic为图书的封面图片,在数据库中使用BLOB类型保存,根据映射关系,其JAVA类型为Blob类型。
3.写配置文件:
<?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.test.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>
<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>
这里对于String类型的bookName,我们设定了其最大长度为40个字符。price属性,我们使用type指定其类型为float,这里的类型就是hibernate中的类型。introduction这个属性是关于书的简介,内容比较长,在SQL中要使用CLOB类型来保存,其Java类型使用的是String,通过映射关系知道其hibernate类型为text类型。bookPic在SQL中使用BLOB类型保存,其Java类型为Blob,对应的其hibernate类型为blob。
4.写配置文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--数据库连接设置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 控制台显示SQL -->
<property name="show_sql">true</property>
<!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/test/model/Book.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.写测试文件BookTest.java:
package com.test.service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.test.util.HibernateUtil;
public class BookTest {
public static void main(String[] args) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 获取Session工厂
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
}
}
运行测试文件,看到数据库中生成了t_book表:
这个表的结构为:
下面往数据库中保存数据。修改测试文件为:
package com.test.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.test.model.Book;
import com.test.util.HibernateUtil;
public class BookTest {
public static void main(String[] args) throws Exception{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 获取Session工厂
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("2017-02-11"));
book.setAuthor("埃克尔");
book.setIntroduction("简介...");
LobHelper lobHelper = session.getLobHelper();
InputStream in = new FileInputStream("c://java编程思想.jpg");
Blob bookPic = lobHelper.createBlob(in,in.available());
book.setBookPic(bookPic);
session.save(book);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
}
}
这里要注意的是图片的保存方法。这里使用了hibernate自带的接口函数把图片转变成blob类型,然后进行保存。
运行函数:
发现这里数据已经保存进去了。这里注意的是Boolean类型在sql中为BIT位类型,这里是显示不出来的。
在mysql中执行SELECT specialPrice+0 FROM t_book;语句,会发现specialPrice值为1.