標籤:提交 session on() orm sch back 類型 配置 關聯
【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的一些核心配置,包括與資料庫連接時須要的串連資訊,比方串連哪種資料庫、登入資料庫的username、登入password以及連接字串等。對應檔的地址資訊也放在這裡。
分類
上面的內容看上去挺多,事實上特別少,基本映射非常easy。我們主要學習關聯關係映射。其它幾種映射一般不會用,僅僅須要瞭解就可以,用的時候看一下相關資料會做就好。
基本映射
上篇博文我們已經實現了一個基本映射,是使用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。不同意為空白,username唯一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類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();//建立SessionFactorySessionFactory factory =cfg.buildSessionFactory();//取得sessionSession session = null;try{//開啟sessionsession = 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()){//關閉sessionsession.close();}}}}}
執行之後。資料庫表產生的資料,例如以所看到的:
註解和xml檔案的優缺點。網上有非常多,有興趣能夠查一下,小編就不再累述了,可是小編覺得。學習初期最好不要使用註解,不易於理解Hibernate的原理,而且註解對於程式的可擴充性而言。太差了。
下篇博文。我們介紹Hibernate的七種關聯關係映射,異常簡單,謝謝關注。
【SSH進階之路】Hibernate基本映射(三)