1. 程式人生 > >Hibernate持久層框架使用【一】配置hibernate

Hibernate持久層框架使用【一】配置hibernate

記錄一下hibernate框架的使用

一、下載Hibernate

從官網下載hibernate,解壓後可以看到這麼幾個資料夾

documentation——hibernate的幫助文件

lib——hibernate的依賴包

project——hibernate的示例專案

首先新建一個java專案,開啟lib資料夾,將required資料夾下的所有jar包以及jap資料夾下的jar包拷貝到專案下作為依賴

除了這些必須的jar包外,還可以根據需求,拷貝其他jar包,例如optional資料夾下可選的jar包,如:c3p0連線池、echcache快取等等。。。

接下來就是配置檔案了,開啟project資料夾下的etc資料夾,裡面有一些配置檔案,這裡拷貝這兩個hibernate配置檔案放到src路徑下

hibernate可以有兩種方式進行配置,一種是使用xml檔案的方式,另一種則是使用properties檔案了。

先寫一下xml檔案的配置方式

開啟hibernate.properties檔案,可以看到裡面的很多配置,Ctrl+F查詢一下mysql的配置,可以看到下面這幾行

## MySQL

#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password

這說明要使用mysql資料庫進行連線,則需要使用上面這些配置(前面為key,空格後為配置的值)。

說明一下這些配置的含義:

hibernate.dialect——表示使用的資料庫方言,這裡有多個值,只選一種就可以了

hibernate.connection.driver_class——資料庫驅動

hibernate.connection.username——使用者名稱

hibernate.connection.password——密碼

除了資料庫的配置外,還要再配置一下表的生成模式,同樣Ctrl+F查詢schema

有如下配置

## auto schema export

#hibernate.hbm2ddl.auto create-drop
#hibernate.hbm2ddl.auto create
#hibernate.hbm2ddl.auto update
#hibernate.hbm2ddl.auto validate

hibernate.hbm2ddl.auto配置的值:

create-drop——表示建立sessionFactory時建立表,sessionFactory關閉時刪除表

create——每次sessionFactory建立時建立表

update——sessionFactory建立時建立表,存在表則不建立

validate——校驗

將這些配置寫到剛剛拷貝的xml檔案裡

xml檔案中加了兩個配置

hibernate.show_sql(顯示sql語句)和hibernate.format_sql(格式化sql語句),值為true表示啟用

下面是完整的配置檔案,c3p0連線池和快取配置根據需要加入

<!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>
	<!-- mysql資料庫配置 -->
	<!-- 用的是5.0以上的資料庫驅動,
	把org.hibernate.dialect.MySQLInnoDBDialect換成
	org.hibernate.dialect.MySQL5InnoDBDialect -->
	<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">123456</property>
	
	<!-- c3p0連線池配置 -->
	<property name="hibernate.c3p0.max_size">10</property>
	<property name="hibernate.c3p0.min_size">2</property>
	<property name="hibernate.c3p0.timeout">5000</property>
	
	<!-- 顯示_格式化sql語句 -->
	<property name="hibernate.show_sql">true</property>
	<property name="hibernate.format_sql">true</property>
	
	<!-- 表生成模式 -->
	<!-- create-drop : 建立sessionFactory時建立表,sessionFactory關閉時刪除表 -->
	<!-- create : 每次sessionFactory建立時建立表 -->
	<!-- update : sessionFactory建立時建立表,存在表則不建立 -->
	<!-- validate : 驗證 -->
	<property name="hibernate.hbm2ddl.auto">update</property>
	
	</session-factory>
</hibernate-configuration>

配置完成,下面是資料庫表和類的對映,新建一個User類來對應資料庫中的一張表

@Entity(name="tb_user")
//@Table(name="tb_user")
public class User {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "user_id")
	private int id;
	private String name;
	private int age;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

User類中的一些註解說明:

@Entity(name="tb_user")——表示此類作為一張表,name的值作為類名(也可不指定,以類名作為表名)

@Id——這個註解必須要加,將被註解的欄位作為表的主鍵

@GeneratedValue(strategy = GenerationType.IDENTITY)——主鍵生成策略,strategy的值為自增長

@Column(name = "user_id")——申明被註解的欄位對應資料庫的欄位名,name的值為資料庫的欄位名

再來建個test類測試一下

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//載入配置檔案
		Configuration configuration = new Configuration().configure();
		
		//獲得服務註冊物件
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(configuration.getProperties()).build();
		
		//定義一個SessionFactory物件
		SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		//SessionFactory sessionFactory = configuration.buildSessionFactory();
			
		//獲得Session
		Session session = sessionFactory.openSession();
		
		//開啟事務
		Transaction transaction = session.beginTransaction();
		
		//提交事務
		transaction.commit();
		
		//關閉資源
		session.close();
		sessionFactory.close();
	}
}

test類中被註釋掉的SessionFactory sessionFactory = configuration.buildSessionFactory();這一句雖然已經被淘汰了,但還是可以使用,使用這句程式碼則不需要拿到服務註冊物件

最後,還要在配置檔案中配置好對映,把User表對應的位置新增到mapper中

<!-- 新增對映 -->
<mapping class="com.fws.domain.User"/>

執行test類,可以看到資料庫中多了一張叫做tb_user的表