1. 程式人生 > >【SSH進階之路】Hibernate基本映射(三)

【SSH進階之路】Hibernate基本映射(三)

tor res 主動 tran clas oid 支持包 lose 包括

【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();
		//建立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的七種關聯關系映射,異常簡單,謝謝關註。

【SSH進階之路】Hibernate基本映射(三)