【SSH進階之路】Hibernate基本對映(三)
【SSH進階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,採用物件化的思維操作關係型資料庫。
【SSH進階之路】Hibernate搭建開發環境+簡單例項(二),小編搭建了基本Hibernate的開發環境,並做了一個簡單例項,對它的基本原理有了一個理性的認識。
這篇部落格小編介紹Hibernate的經典內容:物件關係對映。主要介紹對映的基本概念,對映的分類,對映檔案。
概念
ORM(Object Relational Mapping),即物件關係對映。它的作用就是在關係型資料庫和物件之間做了一個對映。從物件(Object)對映到關係(Relation),再從關係對映到物件。相信很多人跟小編一個毛病,看到概念就頭疼,下面小編畫了一張圖加深理解。
這張圖特別簡單:原來,沒有Hibernate時,我們需要通過JDBC+手動寫SQL語句來操作資料庫,現在,有了Hibernate,它將JDBC+SQL進行了高度封裝,我們不需要再去和複雜SQL打交道,只要像操作物件一樣操作資料庫就可以了。
ORM的實現思想就是將資料庫中表的資料對映成物件,Hibernate可以使我們採用物件化的思維操作關係型資料庫。
對映檔案
Hibernate在實現ORM功能的時候主要用到的檔案有:
1、 對映類(*.java):它是描述資料庫表的結構,表中的欄位在類中被描述成屬性,將來就可以實現把表中的記錄對映成為該類的物件了。
2、對映檔案(*.hbm.xml):它是指定資料庫表和對映類之間的關係,包括對映類和資料庫表的對應關係、表字段和類屬性型別的對應關係以及表字段和類屬性名稱的對應關係等。
3、 hibernate核心配置檔案(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含與資料庫連線時需要的連線資訊,比如連線哪種資料庫、登入資料庫的使用者名稱、登入密碼以及連線字串等。對映檔案的地址資訊也放在這裡。
分類
上面的內容看上去挺多,其實特別少,基本對映很簡單,我們主要學習關聯關係對映,其他幾種對映一般不會用,只需要瞭解即可,用的時候看一下相關資料會做就好。
基本對映
上篇博文我們已經實現了一個基本對映,是使用XML方式配置對映,如下所示:
<span style="font-size:12px;"><?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.liang.hibernate.User" > <id name="id"> <!-- 演算法的核心思想是結合機器的網絡卡、當地時間、一個隨機數來生成GUID --> <generator class="uuid"></generator> </id> <property name="name"></property> <property name="password"></property> <property name="createTime" type="date"></property> <property name="expireTime" type="date"></property> </class> </hibernate-mapping></span>
除了XML方式配置對映外,還可以通過給類檔案添加註解的方式配置對映,在上篇博文的基礎之上,我們稍加修改。
1、加入hibernate annotion支援包
*hibernate-annotations.jar
*hibernate-commons-annotations.jar
*ejb3-persistence.jar
如圖所示:
2、建立實體類User,採用註解完成對映
package com.liang.hibernate;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity //不寫Table預設為user,@Table(name="t_user")
public class User {
@Id //主鍵
@GeneratedValue(strategy=GenerationType.AUTO)//採用資料庫自增方式生成主鍵
//JPA提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO.
//TABLE:使用一個特定的資料庫表格來儲存主鍵。
//SEQUENCE:根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。
//IDENTITY:主鍵由資料庫自動生成(主要是自動增長型)
//AUTO:主鍵由程式控制。
private int id;
private String name;
private String password;
@Temporal(TemporalType.DATE)//生成yyyy-MM-dd型別的日期
private Date createTime;
@Temporal(TemporalType.DATE)//生成yyyy-MM-dd型別的日期
private Date expireTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="name",unique=true,nullable=false) //欄位為name,不允許為空,使用者名稱唯一
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
}
注:由於主鍵改成了自增長,所以資料型別修改成了int型別
3、提供hibernate.cfg.xml檔案,將實體類User加入到hibernate.cfg.xml配置檔案中,完成基本配置
<span style="font-size:12px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 資料庫URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 資料庫使用者名稱 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫密碼 -->
<property name="hibernate.connection.password">123456</property>
<!-- mysql的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 對映檔案 -->
<!-- <mapping resource="com/liang/hibernate/User.hbm.xml"/> -->
<!-- 由原來的對映檔案,改成實體類 -->
<mapping class="com.liang.hibernate.User"/>
</session-factory>
</hibernate-configuration></span>
4、編寫工具類ExportDB.java,註解生成ddl,必須採用AnnotationConfiguration類
<span style="font-size:12px;">package com.liang.hibernate;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* 將hbm生成ddl
* @author liang
*
*/
public class ExportDB{
public static void main(String[]args){
//預設讀取hibernate.cfg.xml檔案
Configuration cfg = new AnnotationConfiguration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}</span>
資料庫生成表如圖所示:
5、建立客戶端類Client,新增使用者資料到mysql
package com.liang.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
public class Client {
public static void main(String[]args){
//讀取hibernate.cfg.xml檔案
Configuration cfg = new AnnotationConfiguration().configure();
//建立SessionFactory
SessionFactory factory =cfg.buildSessionFactory();
//取得session
Session session = null;
try{
//開啟session
session = factory.openSession();
//開啟事務
session.beginTransaction();
User user = new User();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//儲存User物件
session.save(user);
//提交事務
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
session.getTransaction().rollback();
}finally{
if(session != null){
if(session.isOpen()){
//關閉session
session.close();
}
}
}
}
}
執行之後,資料庫表生成的資料,如下圖所示:
註解和xml檔案的優缺點,網上有很多,有興趣可以查一下,小編就不再累述了,但是小編認為,學習初期最好不要使用註解,不易於理解Hibernate的原理,並且註解對於程式的可擴充套件性而言,太差了。
下篇博文,我們介紹Hibernate的七種關聯關係對映,異常簡單,謝謝關注。