微信公眾號:compassblog
歡迎關注、轉發,互相學習,共同進步!
有任何問題,請後臺留言聯絡!
1、Hibernate框架概述
(1)、什麼是Hibernate
Hibernate是一個開放原始碼的 ORM 框架,是主流的Java持久層框架之一,它對 JDBC進行了輕量級的物件封裝,使得Java開發人員可以使用物件導向的程式設計思想來運算元據庫。
(2)、Hibernate在三層架構中的位置
上篇文章所講的Struts2框架取代的是三層框架中的web層,而Hibernate框架取代的則是dao層,具體描述如下圖:
(3)、什麼是ORM
ORM(Object Relational Mapping),即物件關係對映,就是利用描述物件和資料庫表之間對映的後設資料,自動把Java應用程式中的物件,持久化到關係型資料庫的表中。通過操作Java物件,就可以完成對資料庫表的操作。可以把 ORM 理解為關係型資料和物件的一個紐帶,開發人員只需要關注紐帶一端對映的物件即可。ORM 實現原理如下圖:
(4)、Hibernate框架的優勢與功能
- Hlbernate對JDBC訪問資料庫的程式碼做了輕量級封裝,大大簡化了資料訪問層繁瑣的重複性程式碼,並且減少了記憶體消耗,加快了執行效率。
- Hlbernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現,它很大程度的簡化了DAO (DataAccess Object,資料訪問物件)層編碼工作。運算元據庫的時候,可以以物件導向的方式來完成,不再需要書寫SQL語句。
- Hlbernate的效能非常好,對映的靈活性很出色。它支援很多關係型資料庫,從一對一到多對多的各種複雜關係。
- 可擴充套件性強,由於原始碼的開源以及API的開放,當本身功能不夠用時,可以自行編碼進行擴充套件。
(1)、什麼是Hibernate
Hibernate是一個開放原始碼的 ORM 框架,是主流的Java持久層框架之一,它對 JDBC進行了輕量級的物件封裝,使得Java開發人員可以使用物件導向的程式設計思想來運算元據庫。
(2)、Hibernate在三層架構中的位置上篇文章所講的Struts2框架取代的是三層框架中的web層,而Hibernate框架取代的則是dao層,具體描述如下圖:
(3)、什麼是ORM
ORM(Object Relational Mapping),即物件關係對映,就是利用描述物件和資料庫表之間對映的後設資料,自動把Java應用程式中的物件,持久化到關係型資料庫的表中。通過操作Java物件,就可以完成對資料庫表的操作。可以把 ORM 理解為關係型資料和物件的一個紐帶,開發人員只需要關注紐帶一端對映的物件即可。ORM 實現原理如下圖:
(4)、Hibernate框架的優勢與功能
- Hlbernate對JDBC訪問資料庫的程式碼做了輕量級封裝,大大簡化了資料訪問層繁瑣的重複性程式碼,並且減少了記憶體消耗,加快了執行效率。
- Hlbernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現,它很大程度的簡化了DAO (DataAccess Object,資料訪問物件)層編碼工作。運算元據庫的時候,可以以物件導向的方式來完成,不再需要書寫SQL語句。
- Hlbernate的效能非常好,對映的靈活性很出色。它支援很多關係型資料庫,從一對一到多對多的各種複雜關係。
- 可擴充套件性強,由於原始碼的開源以及API的開放,當本身功能不夠用時,可以自行編碼進行擴充套件。
2、搭建Hibernate框架,完成第一個應用例項
(1)、建立一個web專案,匯入所需要的jar包,包括資料庫驅動包,如下圖所示:
(2)、建立資料庫demo_project和表user,建表語句如下:
建立資料庫demo_project語句:
create database demo_project;
複製程式碼
常見表user語句:
CREATE TABLE `user` (
`id` int(10) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
`weight` double(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
複製程式碼
(3)、建立實體User.java,具體程式碼如下:
User.java
package com.hibernate.demo;
public class User {
//基本屬性
private int id;
private String name;
private int age;
private int height;
private int weight;
//setter和getter方法
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;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
複製程式碼
(4)、匯入約束,在與實體同一個包下新建ORM配置檔案User.hbm.xml,書寫ORM後設資料,具體配置程式碼如下:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表與實體物件的關係 -->
<hibernate-mapping package="com.hibernate.domain" >
<class name="User" table="user" >
<id name="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name" ></property>
<property name="age" column="age" ></property>
<property name="height" column="height" ></property>
<property name="weight" column="weight" ></property>
</class>
</hibernate-mapping>
複製程式碼
(5)、在src下新建hibernate.cfg.xml主配置檔案,具體配置程式碼如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 資料庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 資料庫url -->
<property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
<!-- 資料庫連線使用者名稱 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫連線密碼 -->
<property name="hibernate.connection.password">root</property>
<!-- 資料庫方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入orm後設資料 -->
<mapping resource="com/hibernate/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
複製程式碼
(6)、新建測試類TestDemo.java,書寫測試程式碼,具體如下:
TestDemo.java
package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.hibernate.domain.User;
//測試Hibernate框架
public class TestDemo {
@Test
//插入資訊
public void test(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//儲存資訊
User u = new User();
u.setName("孔乙己");
u.setAge(22);
u.setHeight(172);
u.setWeight(120);
session.save(u);
tx.commit();
session.close();
sessionFactory.close();
}
}
複製程式碼
(7)、執行結果,資訊插入成功,具體結果如下圖:
本專案執行環境:jdk1.7、Tomcat7.0
(1)、建立一個web專案,匯入所需要的jar包,包括資料庫驅動包,如下圖所示:
(2)、建立資料庫demo_project和表user,建表語句如下:
建立資料庫demo_project語句:
create database demo_project;
複製程式碼
常見表user語句:
CREATE TABLE `user` (
`id` int(10) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
`weight` double(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
複製程式碼
(3)、建立實體User.java,具體程式碼如下:
User.java
package com.hibernate.demo;
public class User {
//基本屬性
private int id;
private String name;
private int age;
private int height;
private int weight;
//setter和getter方法
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;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
複製程式碼
(4)、匯入約束,在與實體同一個包下新建ORM配置檔案User.hbm.xml,書寫ORM後設資料,具體配置程式碼如下:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表與實體物件的關係 -->
<hibernate-mapping package="com.hibernate.domain" >
<class name="User" table="user" >
<id name="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name" ></property>
<property name="age" column="age" ></property>
<property name="height" column="height" ></property>
<property name="weight" column="weight" ></property>
</class>
</hibernate-mapping>
複製程式碼
(5)、在src下新建hibernate.cfg.xml主配置檔案,具體配置程式碼如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 資料庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 資料庫url -->
<property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
<!-- 資料庫連線使用者名稱 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫連線密碼 -->
<property name="hibernate.connection.password">root</property>
<!-- 資料庫方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入orm後設資料 -->
<mapping resource="com/hibernate/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
複製程式碼
(6)、新建測試類TestDemo.java,書寫測試程式碼,具體如下:
TestDemo.java
package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.hibernate.domain.User;
//測試Hibernate框架
public class TestDemo {
@Test
//插入資訊
public void test(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//儲存資訊
User u = new User();
u.setName("孔乙己");
u.setAge(22);
u.setHeight(172);
u.setWeight(120);
session.save(u);
tx.commit();
session.close();
sessionFactory.close();
}
}
複製程式碼
(7)、執行結果,資訊插入成功,具體結果如下圖:
本專案執行環境:jdk1.7、Tomcat7.0
3、Hibernate配置檔案詳解
(1)、orm後設資料配置詳解:
package
<!-- package屬性:填寫一個包名,在元素內部凡是需要書寫完整類名的屬性,就可以直接寫簡答類名 -->
<hibernate-mapping package="com.hibernate.domain" >
複製程式碼
class
<!--
class元素: 配置實體與表的對應關係的
name: 完整類名
table:資料庫表名
-->
<class name="User" table="user" >
複製程式碼
id
<!-- id元素:配置主鍵對映的屬性
name: 填寫主鍵對應屬性名
column(可選): 填寫表中的主鍵列名.預設值:列名會預設使用屬性名
type(可選):填寫列(屬性)的型別.hibernate會自動檢測實體的屬性型別.
每個型別有三種填法: java型別|hibernate型別|資料庫型別
not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
length(可選):配置資料庫中列的長度. 預設值:使用資料庫型別的最大長度
-->
<id name="id" >
<!-- generator:主鍵生成策略 -->
<generator class="native"></generator>
</id>
複製程式碼
property
<!-- property元素:除id之外的普通屬性對映
name: 填寫屬性名
column(可選): 填寫列名
type(可選):填寫列(屬性)的型別.hibernate會自動檢測實體的屬性型別.
每個型別有三種填法: java型別|hibernate型別|資料庫型別
not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
length(可選):配置資料庫中列的長度. 預設值:使用資料庫型別的最大長度
-->
<property name="name" column="name" >
<!-- <column name="cust_name" sql-type="varchar" ></column> -->
</property>
<property name="age" column="age" ></property>
<property name="height" column="height" ></property>
<property name="weight" column="weight" ></property>
複製程式碼
(2)、Hibernate主配置檔案詳解:
必選配置
<!-- 資料庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 資料庫url -->
<property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
<!-- 資料庫連線使用者名稱 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫連線密碼 -->
<property name="hibernate.connection.password">root</property>
<!-- 資料庫方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
複製程式碼
可選配置
<!-- #hibernate.show_sql true
#hibernate.format_sql true
-->
<!-- 將hibernate生成的sql語句列印到控制檯 -->
<property name="hibernate.show_sql">true</property>
<!-- 將hibernate生成的sql語句格式化(語法縮排) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export 自動匯出表結構,自動建表
#hibernate.hbm2ddl.auto create 自動建表,每次框架執行都會建立新的表,以前表將會被覆蓋,表資料會丟失。(開發環境中測試使用)
#hibernate.hbm2ddl.auto create-drop 自動建表,每次框架執行結束都會將所有表刪除。(開發環境中測試使用)
#hibernate.hbm2ddl.auto update(推薦使用) 自動生成表,如果已經存在不會再生成;如果表有變動,自動更新表(不會刪除任何資料)
#hibernate.hbm2ddl.auto validate 校驗。不自動生成表,每次啟動會校驗資料庫中表是否正確,校驗失敗。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
複製程式碼
引入orm後設資料配置
<!-- 引入orm後設資料
路徑書寫: 填寫src下的路徑
-->
<mapping resource="com/hibernate/domain/User.hbm.xml" />
複製程式碼
(1)、orm後設資料配置詳解:
package
<!-- package屬性:填寫一個包名,在元素內部凡是需要書寫完整類名的屬性,就可以直接寫簡答類名 -->
<hibernate-mapping package="com.hibernate.domain" >
複製程式碼
class
<!--
class元素: 配置實體與表的對應關係的
name: 完整類名
table:資料庫表名
-->
<class name="User" table="user" >
複製程式碼
id
<!-- id元素:配置主鍵對映的屬性
name: 填寫主鍵對應屬性名
column(可選): 填寫表中的主鍵列名.預設值:列名會預設使用屬性名
type(可選):填寫列(屬性)的型別.hibernate會自動檢測實體的屬性型別.
每個型別有三種填法: java型別|hibernate型別|資料庫型別
not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
length(可選):配置資料庫中列的長度. 預設值:使用資料庫型別的最大長度
-->
<id name="id" >
<!-- generator:主鍵生成策略 -->
<generator class="native"></generator>
</id>
複製程式碼
property
<!-- property元素:除id之外的普通屬性對映
name: 填寫屬性名
column(可選): 填寫列名
type(可選):填寫列(屬性)的型別.hibernate會自動檢測實體的屬性型別.
每個型別有三種填法: java型別|hibernate型別|資料庫型別
not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
length(可選):配置資料庫中列的長度. 預設值:使用資料庫型別的最大長度
-->
<property name="name" column="name" >
<!-- <column name="cust_name" sql-type="varchar" ></column> -->
</property>
<property name="age" column="age" ></property>
<property name="height" column="height" ></property>
<property name="weight" column="weight" ></property>
複製程式碼
(2)、Hibernate主配置檔案詳解:
必選配置
<!-- 資料庫驅動 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 資料庫url -->
<property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
<!-- 資料庫連線使用者名稱 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫連線密碼 -->
<property name="hibernate.connection.password">root</property>
<!-- 資料庫方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
複製程式碼
可選配置
<!-- #hibernate.show_sql true
#hibernate.format_sql true
-->
<!-- 將hibernate生成的sql語句列印到控制檯 -->
<property name="hibernate.show_sql">true</property>
<!-- 將hibernate生成的sql語句格式化(語法縮排) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export 自動匯出表結構,自動建表
#hibernate.hbm2ddl.auto create 自動建表,每次框架執行都會建立新的表,以前表將會被覆蓋,表資料會丟失。(開發環境中測試使用)
#hibernate.hbm2ddl.auto create-drop 自動建表,每次框架執行結束都會將所有表刪除。(開發環境中測試使用)
#hibernate.hbm2ddl.auto update(推薦使用) 自動生成表,如果已經存在不會再生成;如果表有變動,自動更新表(不會刪除任何資料)
#hibernate.hbm2ddl.auto validate 校驗。不自動生成表,每次啟動會校驗資料庫中表是否正確,校驗失敗。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
複製程式碼
引入orm後設資料配置
<!-- 引入orm後設資料
路徑書寫: 填寫src下的路徑
-->
<mapping resource="com/hibernate/domain/User.hbm.xml" />
複製程式碼
關注微信公眾號compassblog,後臺回覆“Hibernate系列一”獲取本專案原始碼
您可能還喜歡:
本系列後期仍會持續更新,歡迎關注!
如果你認為這篇文章有用,歡迎轉發分享給你的好友!
本號文章可以任意轉載,轉載請註明出處!
掃碼關注微信公眾號,瞭解更多