Hibernate學習筆記:第一個程序的搭建
前一段時間對Struts2這個框架有了一點點地瞭解,很高興,自己開始學習Hibernate這個框架了。本篇博文將記錄下第一個Hibernate程序的搭建過程。其實有時候個人覺得無論我們學習什麼語言也好,還是學習什麼框架也好,第一個HelloWorld程序真的相當重要,假如 我們在學習第一個HelloWorld程序都跑不出來,這完全影響着我們對新接觸的東西的興趣和動力,但是,往往第一個程序都會涉及到很多的配置,因此使得對於初學者要摸索一定的時間,對於我也是如此,因爲對於剛開始學習Hibernate這個框架的時候,我並不清楚要添加哪些庫文件,因此我需要參考一些博客和視頻,才能更好的完成第一個程序的搭建工作,只有在我們成功地搭建好了第一個程序之後,我們就爲我們後面的學習做好的準備,在後面的學習中我們就不需要擔心添加哪些庫文件呀,需要哪些配置呀 等等工作。本篇博文就是對Hibernate的第一個程序的搭建的所有過程的一個建立,希望對剛學習Hibernate的你有所幫助
廢話不多說,開始幹正事。
第一個Hibernate程序的搭建
相信在學Hibernate的你在前段時間一定學習過Java這門語言,因此一定有Java的編譯環境以及我們常見的IDE,即一定使用過eclipse/MyEclipse等IDE,如果沒有使用,就需要下載。
下面就假設你有Java相關的開發環境(JDK,IDE)。
在開始介紹之前,先提供一個參考文檔:Hibernate3.1.2在線中文幫助文檔,這個文檔有着很好的參考價值,也有第一個Hibernate 應用程序的搭建過程:http://www.jq-school.com/Show.aspx?id=321。本人第一個Hibernate的搭建也是主要參考這個文檔來完成的.
1、準備工作
a、在Hibernate官網下載Hibernate發佈包,鏈接爲:http://hibernate.org/orm/downloads/,下載後解壓到相應的文件夾中,裏面涉及到的一些Jar包將會爲我們所用。我下載的是和ibernate-release-5.1.0.Final 這個版本。
b、數據庫驅動包,JDBC Driver要根據你用的database來定,一般database官方網站上都會有。Hibernate支持常用的database,比如 MySQL, Oracle, PostgreSQL, 和MS-SQL Server。這些數據庫都有JDBC Driver:
我自己下載的是MySQL數據庫的Driver 。
Oracle JDBC Driver下載地址(下載前必須同意Oracle協議書)
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html
MySQL JDBC Driver下載地址
http://dev.mysql.com/downloads/connector/j/3.0.html
PostgreSQL JDBC Driver下載地址
http://jdbc.postgresql.org/download.html
MS-SQL Server JDBC Driver下載地址
http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&displaylang=en
2、新建工程,添加Jar包
1)、我使用的IDE是MyEclipse ,打開MyEclipse,新建一個Java Project,我這裏的工程取名爲:HelloWorld_Hibernate,然後添加相應的Jar包。
怎麼添加Jar包呢??
添加Jar包主要有兩個方法,第一種方法爲:點擊項目—>Build Path—>Add External JARS;由於hibernate 有許多Jar需要添加,並且這些Jar包都是屬於hibernate的,因此,我們就將其放在一起,然後引入工程這樣纔是最好的。這也就是第二種方法。
具體步驟如下:
window—>Java—->Build Path —->User Libraries —>new ,這樣就新建了一個文件夾(我這裏新建的文件夾爲:hibernate),然後在這個夾 ,點擊Add External JARS 中添加Jar包,需要添加的Jar包在hibernate解壓後的lib/required下,我將這個文件夾下所有的包都加入進去了。具體截圖如下:
當上面的步驟完成之後,我們就可以在工程中引入這個
實體類 Student
實體類中有幾個屬性:id name age,併爲這些屬性配上get/set 方法。
package com.hibernate.model;
public class Student {
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
所有的持久化類(persistent classes)都要求有無參的構造器,因爲Hibernate必須使用Java反射機制來爲你創建對象。構造器(constructor)的訪問級別可以是private,然而當生成運行時代理(runtime proxy)的時候則要求使用至少是package 級別的訪問控制
在數據庫中創建表與實體類對應
這裏我們採用的是自己創建表,我們也可以要Hibernate 幫我們創建。
在下面即將要介紹的配置文件hibernate.cfg.xml文件中:
<!-- 屬性hbm2ddl.auto 可選值有:create|update|drop-create|invalide
create 每次都會給你新建一個表,因此存在數據丟失
update 當你的實體類中添加或刪除了其他的屬性,即將導致相應的表結構發生變化,因此會更改表的結構
invalide 即對象關係映射的檢查。
-->
<property name="hbm2ddl.auto">create</property>
- 1
- 2
- 3
- 4
- 5
- 6
Hibernate配置 hibernate.cfg.xml 配置文件
Hibernate 的配置文件名字叫 hibernate.cfg.xml,不要對此名字進行改動,在我們不懂Hibernate 原理的情況下進行了改動就是自找麻煩。
內容如下,主要是參考了上面所提到的參考文檔資料,然後進行一定的改動即可:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property> <!-- hibernate爲數據庫名稱 -->
<!-- 數據庫的用戶名和密碼 -->
<property name="connection.username">root</property>
<property name="connection.password">123456789</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect 主要看你使用的是那種數據庫 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<!-- <property name="hbm2ddl.auto">create</property> -->
<!-- Student類與表Student的映射關係 -->
<mapping resource="com/hibernate/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
創建映射文件
上面雖然我們建立了實體類的數據庫表,但是我們還沒有建立關聯,即映射。
一個映射文件的基本結構看起來像這樣 :
<?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>
[...]
</hibernate-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在我們的項目中,映射文件Student.hbm.xml文件內容如下:
<?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 package="com.hibernate.model">
<class name="Student" table="Student"> <!-- 如果我們不寫table,則默認表名與類名一致 -->
<!-- 主鍵 -->
<id name="id" column="id">
<!-- 主鍵的生成策略 -->
<generator class="native"/>
</id>
<!-- 其他屬性,name對應實體類的屬性,column對應關係型數據庫表的列 -->
<property name="name" column="name"/>
<property name="age"/>
</class>
</hibernate-mapping>
<!-- 這樣就將Student類和表Student關聯在一起了 -->
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
測試類
待上面的工作完成之後,我們就可以建立一個測試類來進行測試了。測試類StudentTest的代碼如下 :
package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Student;
public class TestStudent {
public static void main(String[] args) {
Student s=new Student();
s.setId(1);
s.setName("wu");
s.setAge(19);
//下面爲固定格式的代碼,即先獲取Session ,然後跳用Session 的save方法。
Configuration cfg=new Configuration();
SessionFactory sf=cfg.configure().buildSessionFactory();
Session session=sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
sf.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
測試結果在數據庫中的結果 如下 :
這就說明我們的第一個Hibernate 程序就成功了。
用Annotation來創建第一個程序
上面採用的是xml配置文件的方式來創建實體類與數據庫表的對應關係,下面就用Annotation的方式來創建第一個程序。
下面我們又創建一個實體類Teacher。
內容如下:
package com.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Teacher {
private int id;
private String name;
private String title;
@Id
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 String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
從上面的代碼中可以看到@Entity /@Id 等註解,利用這種方式我們就不需要寫實體類和數據庫表的映射文件了。
hibernate.cfg.xml文件的內容如下,與第一種方式的區別在於添加了這樣一行代碼:
<mapping class="com.hibernate.model.Teacher"/>
- 1
詳細內容如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property> <!-- hibernate爲數據庫名稱 -->
<!-- 數據庫的用戶名和密碼 -->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect 主要看你使用的是那種數據庫 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<!-- <property name="hbm2ddl.auto">create</property> -->
<!-- Student類與表Student的映射關係 -->
<mapping resource="com/hibernate/model/Student.hbm.xml"/>
<mapping class="com.hibernate.model.Teacher"/>
</session-factory>
</hibernate-configuration>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
測試文件與TestStudent 一樣,如下:
package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Teacher;
public class TestTeacher {
public static void main(String[] args) throws Exception{
Teacher t=new Teacher();
t.setId(1);
t.setName("wuranghao");
t.setTitle("professior");
Configuration cfg=new Configuration();
SessionFactory sf=cfg.configure().buildSessionFactory();
Session session=sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
sf.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
同樣當我們運行之後,在數據庫表中查詢的結果如下:
參考資料
1、blog :http://blog.csdn.net/doodoofish/article/details/43207/
2、http://www.jq-school.com/hibernate/html/tutorial.html#tutorial-firstapp
from: http://blog.csdn.net/u010412719/article/details/51258691