1. 程式人生 > >Hibernate第一天(Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD)

Hibernate第一天(Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD)

Hibernate的入門(Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD)

以前學習過Hibernate,不過學習的不太紮實,做的專案也不太多,好久時間沒用,都快忘得差不多了,今天重新學習一下,一步一個腳印的敲每個程式碼,爭取把Hibernate徹底學明白。

 

 

目錄

Hibernate的入門(Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD)

 

 

1.1     Hibernate框架的學習路線

 

1.2     Hibernate的框架的概述

1.2.1  什麼是框架

1.2.2  EE的經典三層結構

1.3  Hibernate的概述

1.3.1       什麼是Hibernate

1.3.2       什麼是ORM

1.3.3       為什麼要學習Hibernate

1.4     Hibernate的入門

1.4.1  Hibernate的入門

1.5     Hibernate的常見配置

1.5.1  XML提示的配置

1.5.2  Hibernate的對映的配置

1.5.3  Hibernate的核心的配置

1.6     Hibernate的核心API

1.6.1  Hibernate的API

原始碼地址:


1.1     Hibernate框架的學習路線

     第一天:Hibernate的入門(Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD)

     第二天:Hibernate的一級快取、其他的API

     第三天:Hibernate的一對多配置、Hibernate的多對多的配置

     第四天:Hibernate的查詢方式、抓取策略

 

 

1.2     Hibernate的框架的概述

1.2.1  什麼是框架

框架:指的是軟體的半成品,已經完成了部分功能。

1.2.2  EE的經典三層結構

 

1.3  Hibernate的概述

1.3.1       什麼是Hibernate

 

Hibernate:Hibernate是一個持久層的ORM框架。

1.3.2       什麼是ORM

ORM:Object Relational Mapping(物件關係對映)。指的是將一個Java中的物件與關係型資料庫中的表建立一種對映關係,從而操作物件就可以操作資料庫中的表。

1.3.3       為什麼要學習Hibernate

 

1.4     Hibernate的入門

1.4.1  Hibernate的入門

1.4.1.1       下載Hibernate的開發環境

Hibernate3.x  Hibernate4.x  Hibernate5.x(我這裡使用5.0.7

 

下載地址:https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

1.4.1.2       解壓Hibernate

     1.documentation              :Hibernate開發的文件

     2.lib                                       :Hibernate開發包

            2.1required                           :Hibernate開發的必須的依賴包

            2.2optional                            :Hibernate開發的可選的jar

     3.project                              :Hibernate提供的專案

1.4.1.3       建立一個專案,引入jar包

     1.資料庫驅動包,2.Hibernate開發的必須的jar包,3.Hibernate引入日誌記錄包,4.C3p0連線池

 

 

1.4.1.4       建立表

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;

1.4.1.5       建立實體類

 

1.4.1.6       建立對映(*****)

對映需要通過XML的配置檔案來完成,這個配置檔案可以任意命名。儘量統一命名規範(類名.hbm.xml

 

Customer對映檔案

<?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屬性:類的全路徑
		  *table屬性:表名(如果表名和類名一致可忽略)
		  *catalog屬性:資料庫名稱,可忽略
    -->
	<class name="top.yangxianyang.demo1.Customer" table="cst_customer">
		<!-- 建立類中的屬性與表中的主鍵對應 -->
		<!--
		 id標籤:建立類中的屬性與表中的主鍵對應
		    *name屬性:類中的屬性名
		    *column屬性:表中欄位名(如果類中屬性名和表中欄位名一致,可省略)
		    *catalog屬性:資料庫名稱,可忽略 
			*length屬性:欄位長度
			*type屬性:型別。寫Java資料型別,Hibernate資料型別(預設),SQL型別
		-->
		<id name="cust_id" column="cust_id" >
			<!-- 主鍵生成策略 -->
			<generator class="native"/>
		</id>
		
		<!-- 建立類中的普通的屬性和表的欄位的對應 -->
		<!--
		 property標籤:建立類中的普通的屬性和表的欄位的對應
		    *name屬性:類中的屬性名
		    *column屬性:表中欄位名(如果類中屬性名和表中欄位名一致,可省略)
		    *length屬性:欄位長度
			*type屬性:型別。寫Java資料型別,Hibernate資料型別(預設),SQL型別
		-->
		<property name="cust_name" column="cust_name" length="32" />
		<property name="cust_source" column="cust_source" length="32"/>
		<property name="cust_industry" column="cust_industry"/>
		<property name="cust_level" column="cust_level"/>
		<property name="cust_phone" column="cust_phone"/>
		<property name="cust_mobile" column="cust_mobile"/>
	</class>
</hibernate-mapping>

1.4.1.7       建立一個Hibernate的核心配置檔案(*****)

Hibernate的核心配置檔案的名稱: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>
		<property name="hibernate.connection.url">jdbc:mysql:///sshstudy</property>
		<property name="hibernate.connection.username">yxy</property>
		<property name="hibernate.connection.password">123456</property>
		<!-- 配置Hibernate的方言:作用,根據配置的方言生成相應的SQL語句 -->
		<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>
		<!-- 自動建立表 	
						none:不使用hibernate的自動建表
	                    create:如果資料庫中已經有表,刪除原有表,重新建立,如果沒有表,新建表。(測試)
	                    create-drop	:如果資料庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表。(測試)
						update:如果資料庫中有表,使用原有表,如果沒有表,建立新表(更新表結構)
						validate:如果沒有表,不會建立表。只會使用資料庫中原有的表。(校驗對映和表結構)。
		-->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		
		<!-- 配置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>
		
		
		
		<!-- 載入對映  -->
		<mapping resource="top/yangxianyang/demo1/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

1.4.1.8       編寫測試程式碼(*****)

package top.yangxianyang.demo1;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate的入門案例
 * @author yxy
 *
 */
public class Test1 {
	public static void main(String[] args) {
		demo1();
	}

	// 儲存客戶
	public static void demo1() {
		// 1.載入Hibernate的核心配置檔案
		Configuration configuration = new Configuration().configure();
		// 2.建立一個SessionFactory物件:類似於JDBC中連線池
		SessionFactory sessionFactory = configuration.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();
		sessionFactory.close();
	}
}

 

1.5     Hibernate的常見配置

1.5.1  XML提示的配置

1.5.1.1       配置XML提示問題

 

 

 

 

 

 

1.5.2  Hibernate的對映的配置

1.5.2.1       對映的配置

  1. 【class標籤的配置】
    1. 標籤用來建立類與表的對映關係
    2. 屬性:
      1. name                 :類的全路徑
      2. table                  :表名(類名與表名一致,table可以省略)
      3. catalog              :資料庫名
  2. 【id標籤的配置】
    1. 標籤用來建立類中的屬性與表中的主鍵的對應關係
    2. 屬性:
      1. name                 :類中的屬性名
      2. column              :表中的欄位名(類中的屬性名和表中的欄位名如果一致,column可以省略)
      3. length                :長度
      4. type                    :型別
  3. 【property標籤的配置】
    1. 標籤用來建立類中的普通屬性與表的欄位的對應關係
    2. 屬性:
      1. name                 :類中的屬性名
      2. column              :表中的欄位名
      3. length                :長度
      4. type                    :型別
      5. not-null              :設定非空
      6. unique               :設定唯一

1.5.3  Hibernate的核心的配置

1.5.3.1       Hibernate的核心配置方式(瞭解)

     一種方式:屬性檔案的方式

     hibernate.properties

     hibernate.connection.driver_class=com.mysql.jdbc.Driver

     …

     hibernate.show_sql=true

     屬性檔案的方式不能引入對映檔案(手動編寫程式碼載入對映檔案)

 

     二種方式:XML檔案的方式

     hibernate.cfg.xml(推薦)

1.5.3.2       核心的配置

  1. 必須的配置
    1. 連線資料庫的基本的引數
      1. 驅動類
      2. url路徑
      3. 使用者名稱
      4. 密碼
    2. 方言
  2. 可選的配置
    1. 顯示SQL           :hibernate.show_sql
    2. 格式化SQL      :hibernate.format_sql
    3. 自動建表         :hibernate.hbm2ddl.auto
      1. none                   :不使用hibernate的自動建表
      2. create                :如果資料庫中已經有表,刪除原有表,重新建立,如果沒有表,新建表。(測試)
      3. create-drop      :如果資料庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表。(測試)
      4. update              :如果資料庫中有表,使用原有表,如果沒有表,建立新表(更新表結構)
      5. validate            :如果沒有表,不會建立表。只會使用資料庫中原有的表。(校驗對映和表結構)。
  3. 對映檔案的引入     
    1. 引入對映檔案的位置

 

1.6     Hibernate的核心API

1.6.1  Hibernate的API

1.6.1.1       Configuration:Hibernate的配置物件

 

作用:

載入核心配置檔案

1.hibernate.properties

Configuration cfg = new Configuration();

2.hibernate.cfg.xml

Configuration cfg = new Configuration().configure();

 

 

 

1.6.1.2       SessionFactory:Session工廠

 

SessionFactory內部維護了Hibernate的連線池和Hibernate的二級快取。是執行緒安全的物件。一個專案建立一個物件即可。

 

  1. 封裝工具類


 

package com.itheima.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate的工具類
 * @author yxy
 *
 */
public class HibernateUtils {

	public static final Configuration cfg;
	public static final SessionFactory sf;
	
	static{
		cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}
	/*
	 * 提供獲得session的方法
	 */
	public static Session openSession(){
		return sf.openSession();
	}
}

 

 

1.6.1.3       Session:類似Connection物件是連線物件

 

Session代表的是Hibernate與資料庫的連結物件。不是執行緒安全的。與資料庫互動橋樑。

  1. Session中的API
    1. 儲存方法:
      1. Serializable save(Object obj);
    2. 查詢方法:
      1. T get(Class c,Serializable id);
      2. T load(Class c,Serializable id);
      3. get方法和load方法的區別?

 

 get方法

         *      * 採用的是立即載入,執行到這行程式碼的時候,就會馬上傳送SQL語句去查詢。

                    *  * 查詢後返回是真實物件本身。

                    *   * 查詢一個找不到的物件的時候,返回null

 

load方法

                   *      * 採用的是延遲載入(lazy懶載入),執行到這行程式碼的時候,不會發送SQL語句,當真正使用這個物件的時候才會傳送SQL語句。

                    *  * 查詢後返回的是代理物件。javassist-3.18.1-GA.jar 利用javassist技術產生的代理。

                    *  * 查詢一個找不到的物件的時候,返回ObjectNotFoundException

        

 

  1. 修改方法
    1. void update(Object obj);

 

    1. 刪除方法
      1. void delete(Object obj);

 

    1. 儲存或更新
      1. void saveOrUpdate(Object obj)

 

    1. 查詢所有
      1. List createSQLQuery(String sql)

 

測試程式碼:

package top.yangxianyang.demo1;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.hibernate.utils.HibernateUtils;

/**
 * Hibernate的工具類的測試
 * @author yxy
 *
 */
public class TestUtils {

	@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);
		tx.commit();
		session.close();
	}
	
	@Test
	// 查詢:
	// ***** get方法和load方法的區別
	public void demo2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		/**
		 * get方法
		 * 	* 採用的是立即載入,執行到這行程式碼的時候,就會馬上傳送SQL語句去查詢。
		 *  * 查詢後返回是真實物件本身。
		 * 	* 查詢一個找不到的物件的時候,返回null
		 * 
		 * load方法
		 * 	* 採用的是延遲載入(lazy懶載入),執行到這行程式碼的時候,不會發送SQL語句,當真正使用這個物件的時候才會傳送SQL語句。
		 *  * 查詢後返回的是代理物件。javassist-3.18.1-GA.jar 利用javassist技術產生的代理。
		 *  * 查詢一個找不到的物件的時候,返回ObjectNotFoundException
		 */
		// 使用get方法查詢
		/*Customer customer = session.get(Customer.class, 1l); // 傳送SQL語句
		System.out.println(customer);*/
		
		// 使用load方法查詢
		Customer customer = session.load(Customer.class, 1l);
		System.out.println(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 修改操作
	public void demo3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 直接建立物件,進行修改
		/*Customer customer = new Customer();
		customer.setCust_id(1l);
		customer.setCust_name("王聰");
		session.update(customer);*/
		
		// 先查詢,再修改(推薦)
		Customer customer = session.get(Customer.class, 1l);
		customer.setCust_name("王小賤");
		session.update(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 刪除操作
	public void demo4(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 直接建立物件,刪除
	/*	Customer customer = new Customer();
		customer.setCust_id(1l);
		session.delete(customer);*/
		
		// 先查詢再刪除(推薦)--級聯刪除
		Customer customer = session.get(Customer.class, 2l);
		session.delete(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 儲存或更新
	public void demo5(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		/*Customer customer  = new Customer();
		customer.setCust_name("王鳳");
		session.saveOrUpdate(customer);*/
		
		Customer customer = new Customer();
		customer.setCust_id(3l);
		customer.setCust_name("李如花");
		session.saveOrUpdate(customer);
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 查詢所有
	public void demo6(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// 接收HQL:Hibernate Query Language 面向物件的查詢語言
		/*Query query = session.createQuery("from Customer");
		List<Customer> list = query.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}*/
		
		// 接收SQL:
		SQLQuery query = session.createSQLQuery("select * from cst_customer");
		List<Object[]> list = query.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		tx.commit();
		session.close();
	}
}

 

 

1.6.1.4       Transaction:事務物件

Hibernate中管理事務的物件。

     commit();

     rollback();

 

原始碼地址:

連結:https://pan.baidu.com/s/1cYbNGrbGu3NPOiIPTpzqOw 密碼:y8kj

在圖書館看了幾個小時終於整完了,基本框架搭建,環境配置成功,配置了C3P0連線池,封裝了工具類,明天繼續。