Hibernate框架筆記01_環境搭建_API_CRUD
文章目錄
1. Hibernate框架的概述
1.1 什么是框架
- 框架:指的是軟件的半成品,已經完成了部分功能。
1.2 經典三層架構
1.3 Hibernate框架
-
什么是hibernate:Hibernate是一個持久層的ORM框架
-
什么是ORM:Object Relational Mapping(對象關系映射)。指的是將一個Java中的對象與關系型數據庫中的表建立一種映射關系,從而操作對象就可以操作數據庫中的表。
2 Hibernate入門
2.1 下載Hibernate的開發包
-
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
-
解壓后:
-
documentation------------Hibernate開發的文檔
-
lib-----------------------------Hibernate開發包
- required---------------Hibernate開發的必須的依賴包
- optional----------------Hibernate開發的可選的jar包
-
project-----------------------Hibernate提供的項目
2.2 創建項目,引入jar包
-
數據庫驅動包mysql
-
hibernate開發必備包required
-
hibernate引入日志記錄包
2.3 創建表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
`cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.4 創建實體類
package com.itzhouq.hibernate.demo1;
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
//set/get。。。
2.5 創建映射(***)
-
映射需要通過XML的配置文件來完成,這個配置文件可以任意命名。盡量統一命名規范(類名.hbm.xml)
-
在
package com.itzhouq.hibernate.demo1;
包下新建映射文件Customer.hbm.xml -
導入約束
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
-
完整的映射文件
<?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> <!-- 建立類和表的映射 --> <class name="com.itzhouq.hibernate.demo1.Customer" table="cst_customer"> <!-- 建立類中的屬性與表中的主鍵對應 --> <id name="cust_id" column="cust_id"> <generator class="native"></generator> </id> <!-- 建立表中的普通屬性和表中的字段的對應 --> <property name="cust_name" column="cust_name"></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> </class> </hibernate-mapping>
2.6 創建一個Hibernate的核心配置文件(***)
-
Hibernate的核心配置文件的名稱:hibernate.cfg.xml
-
在src下新建核心配置文件hibernate.cfg.xml,導入約束
-
配置核心文件,連接數據庫,用戶名,密碼等信息可以參考文件…\hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\etc\hibernate.properties 56行 351行
<?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> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">2626</property> <!-- 配置Hibernate的方言(可選的) --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 打印SQL(可選的) --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQL(可選的) --> <property name="hibernate.format_sql">true</property> <!-- 配置映射文件 --> <mapping resource="com/itzhouq/hibernate/demo1/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>
1.2.7 編寫測試代碼
package com.itzhouq.hibernate.demo1;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class HIbernateDemo1 {
//保存客戶的案例
@Test
public void demo1() {
// 1. 加載hibernate的核心配置文件
Configuration configure = new Configuration().configure();
// 2. 創建一個SessionFactory對象:類似于JDBC的中連接池
SessionFactory sessionFactory = configure.buildSessionFactory();
// 3. 通過SessionFactory獲取Session對象:類似于JDBC中Connection
Session session = sessionFactory.openSession();
// 4. 手動開啟事務
Transaction transaction = session.beginTransaction();
// 5. 編寫代碼
Customer customer = new Customer();
customer.setCust_name("老王");
session.save(customer);
// 6. 提交事務
transaction.commit();
// 7. 釋放資源
session.close();
}
}
3 hibernate的常見配置
3.1 XML的提示配置
3.2 Hibernate的映射的配置
<?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>
<!-- 建立類和表的映射 -->
<class name="com.itzhouq.hibernate.demo1.Customer" table="cst_customer">
<!-- 建立類中的屬性與表中的主鍵對應 -->
<id name="cust_id" column="cust_id">
<generator class="native"></generator>
</id>
<!-- 建立表中的普通屬性和表中的字段的對應 -->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
- class標簽的配置
- 標簽用來建立類與表的映射關系
- 屬性:
- name-----------類的全路徑名
- table-----------表名(類名與表名一致時,table可以省略)
- catalog--------數據庫名
- id標簽的配置
- 標簽用來建立類中的屬性與表中的主鍵的對應關系
- 屬性:
- name-----------類中的屬性名
- column---------表中的字段名(類中的屬性和表中的字段名一致時,可以省略)
- length-----------長度
- type-------------類型
- property標簽的配置
- 標簽用來建立類中的普通屬性與表的字段的對應關系
- 屬性:
- name-----------類中的屬性名
- column---------表中的字段名
- length-----------長度
- type-------------類型
- not-null--------設置非空
- unique---------設置唯一
3.3 Hibernate的核心配置方式
- 必須的配置------------連接數據庫的基本的參數
- 驅動類
- url路徑
- 用戶名
- 密碼
- 可選的配置
- 顯示SQL-----------hibernate.show_sql
- 格式化SQL--------hibernate.format_sql
- 自動建表-----------hibernate.hbm2ddl.auto
- update:如果數據庫中有表,使用原有表,如果沒有表,創建新表(更新表結構)
- validate:如果沒有表,不會創建表。只會使用數據庫中原有的表。(校驗映射和表結構)。
- none:不使用hibernate的自動建表
- create:如果數據庫中已經有表,刪除原有表,重新創建,如果沒有表,新建表。(測試)
- create-drop:如果數據庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表。(測試)
- 映射文件的引入
- 引入映射文件的位置
4. Hibernate的核心API
4.1 Configuration:Hibernate的配置對象
-
作用:
-
加載核心配置文件
// 1. 加載hibernate的核心配置文件 Configuration configure = new Configuration().configure();
-
加載映射文件
<!-- 配置映射文件 --> <mapping resource="com/itzhouq/hibernate/demo1/Customer.hbm.xml"/>
-
-
Configuration類的作用是對Hibernate進行配置,以及對它進行啟動。在hibernate的啟動過程中,Configuration類的實例首先定位映射文件的位置,讀取這些配置,然后創建一個SessionFactory對象。雖然Configuration類在整個Hibernate項目中只扮演一個很小的角色,但是他是啟動Hibernate時所遇到的第一個對象。
4.2 SessionFactory:Session工廠
-
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。這里用到了工廠模式。徐婭注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以未每個數據庫指定一個SessionFactory。
-
SessionFactory內部維護了Hibernate的連接池和Hibernate的二級緩存(不講)。是線程安全的對象。一個項目創建一個對象即可。
-
配置連接池,提取工具類
- 導入c3p0的jar包…\hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\lib\optional\c3p0
- c3p0-0.9.2.1.jar
- hibernate-c3p0-5.0.7.Final.jar
- mchange-commons-java-0.2.3.4.jar
- 在主配置文件中,添加以下配置
<!-- 配置C3P0連接池 --> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!--在連接池中可用的數據庫連接的最少數目 --> <property name="c3p0.min_size">5</property> <!--在連接池中所有數據庫連接的最大數目 --> <property name="c3p0.max_size">20</property> <!--設定數據庫連接的過期時間,以秒為單位, 如果連接池中的某個數據庫連接處于空閑狀態的時間超過了timeout時間,就會從連接池中清除 --> <property name="c3p0.timeout">120</property> <!--每3000秒檢查所有連接池中的空閑連接 以秒為單位--> <property name="c3p0.idle_test_period">3000</property>
-
新建一個包,創建一個工具類HibernateUtils.java
package com.itzhouq.hibernate.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /* * Hibernate的工具類 */ public class HibernateUtils { public static final Configuration cfg; public static final SessionFactory sf; static { cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); } public static Session openSession() { return sf.openSession(); } }
-
配置之后測試類的代碼大大簡化了
package com.itzhouq.hibernate.demo1; /* * Hibernate工具類的測試 */ import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.itzhouq.hibernate.utils.HibernateUtils; public class HibernateDemo2 { @Test //保存客戶 public void demo1() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_name("王曉東"); Serializable id = session.save(customer); System.out.println("id = " + id);//1 tx.commit(); session.close(); } }
- 導入c3p0的jar包…\hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\lib\optional\c3p0
4.3 Session:類似Connection對象是連接對象
-
session接口負責執行唄持久化對象的CRUD操作。但需要注意的是session對象是非線程安全的。同時,Hibernate的session不同于JSP應用中的HttpSession。這里的session類似于Connection。
-
Session中的API
-
保存方法:
-
Serializable save(Object obj);
@Test //保存客戶 public void demo1() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_name("王曉東"); Serializable id = session.save(customer); System.out.println("id = " + id);//1 tx.commit(); session.close(); }
-
-
查詢方法
-
T get(Class c, Serializable id)
-
T load(Class c, Serializable id)
@Test //查詢方法 public void demo2() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // Customer customer = session.get(Customer.class, 1L); // System.out.println(customer); Customer customer = session.load(Customer.class, 1L); System.out.println(customer); tx.commit(); session.close(); }
-
get方法和load方法的區別
-
get:
- 采用的是立即加載,執行到這行代碼的時候,就馬上發送sql語句去查詢。
- 查詢后返回的是一個真實對象本身。
- 查詢一個找不到的對象的時候,返回null;
-
load:
- 采用的延遲加載(lazy懶加載),執行到這行代碼的時候,不會立即發送SQL語句,當真正使用這個對象的時候才會發送sql語句。
- 擦汗尋后返回的代理對象,利用javassist技術產生的代理。
- 查詢一個找不到的對象的時候,拋出異常。
-
-
修改方法
-
void update(Object obj)
-
-
刪除方法
-
void delete(Object obj)
-
-
查詢所有
-
4.4 Transaction:事務對象
- Hibernate中管理事務的對象
commit()
rollback()
智能推薦
hibernate-01框架的搭建
1.hibernate簡介 框架:提高開發效率,即封裝好了一些功能導入jar包后調用即可,框架也可以理解成是一個半成品的項目 hibernate框架:在進行web開發時我們采用三層架構(web、service、dao),hibernate就是dao層框架 優點:操作數據庫時采用面向對象的方式完成,不需要書寫sql語句 hibernate是一款orm框架:orm對象關系映射(object relat...
Git筆記_01_起步
起步 版本控制簡介 安裝Git Git官方下載地址 如果下載慢可以使用這一個地址下載windows版本的Git for win 初次運行Git需要進行的配置 Git的config文件的介紹 Git 自帶一個 git config 的工具來幫助設置控制 Git 外觀和行為的配置變量。 這些變量存儲在三個不同的位置: /etc/gitconfig 文件: 包含系統上每一個用戶及他們倉庫的通用配置。 如...
Hibernate 框架(二)(下載及環境搭建)
一、Hibernate下載 1、通過下面網站進行下載:https://zh.osdn.net/,進入網站如下圖所示。 2、單擊頁面頂部的導航欄中的“下載”,即可進入 3、在搜索框中輸入hibernate,如下圖所示。 4、單擊“搜索”按鈕,進入搜索結果界面,如下圖所示。 5、單擊上圖中的超文本"Hibernate",...
Hibernate(一)——采用Hibernate框架開發環境搭建
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員充分使用對象編程思維來操作數據庫。HIbernate的移植性很好,它可以應用于任何JDBC使用的場合。 下面我們從搭建開發環境開始,來學習Hibernate。 1、新建一個java項目:hibernate_test.別的項目也可以,上面已經提到,Hibernate的移植性很好,可以在Ja...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...