1. 程式人生 > >hibernate第三天——session的快取與事務隔離級別,一對一關係,多種方式查詢

hibernate第三天——session的快取與事務隔離級別,一對一關係,多種方式查詢

package cn.itcast.k_query_hql;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App {

	private static SessionFactory sessionFactory = new Configuration()//
			.configure()//
			.addClass(Department.class)// 新增Hibernate實體類(載入對應的對映檔案)
			.addClass(Employee.class)// 新增Hibernate實體類(載入對應的對映檔案)
			.buildSessionFactory();

	// 準備資料
	@Test
	public void testSave() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		// 儲存一些部門資料
		for (int i = 1; i <= 10; i++) {
			Department department = new Department();
			department.setName("開發部_" + i);
			session.save(department);
		}

		// 儲存一些員工資料
		for (int i = 1; i <= 20; i++) {
			Employee employee = new Employee();
			employee.setName("李XX_" + i);
			session.save(employee);
		}

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// 使用HQL查詢
	// HQL: Hibernate Query Language.
	// 特點:
	// >> 1,與SQL相似,SQL中的語法基本上都可以直接使用。
	// >> 2,SQL查詢的是表和表中的列;HQL查詢的是物件與物件中的屬性。
	// >> 3,HQL的關鍵字不區分大小寫,類名與屬性名是區分大小寫的。
	// >> 4,SELECT可以省略.
	@Test
	public void testHql() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------
		String hql = null;

		// 1,簡單的查詢
		// hql = "FROM Employee";
		// hql = "FROM Employee AS e"; // 使用別名
		// hql = "FROM Employee e"; // 使用別名,as關鍵字可省略。別名用來防止關鍵字衝突,推薦使用別名

		// 2,帶上過濾條件的(可以使用別名):Where
		// hql = "FROM Employee WHERE id<10";
		// hql = "FROM Employee e WHERE e.id<10";
		// hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

		// 3,帶上排序條件的:Order By
		// hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";
		// hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";
		// hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC";

		// 4,指定select子句(不可以使用select *)
		// hql = "SELECT e FROM Employee e"; // 相當於"FROM Employee e"
		// hql = "SELECT e.name FROM Employee e"; // 只查詢一個列,返回的集合的元素型別就是這個屬性的型別
		// hql = "SELECT e.id,e.name FROM Employee e"; // 查詢多個列,返回的集合的元素型別是Object陣列
		// hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new語法,指定把查詢出的部分屬性封裝到物件中

		// 5,執行查詢,獲得結果(list、uniqueResult、分頁 )
		// Query query = session.createQuery("FROM Employee e WHERE id<3");
		// query.setFirstResult(0);
		// query.setMaxResults(10);
		// // List list = query.list(); // 查詢的結果是一個List集合
		// Employee employee = (Employee) query.uniqueResult();// 查詢的結果是唯一的一個結果,當結果有多個,就會拋異常
		// System.out.println(employee);

		// 6,方法鏈
		List list = session.createQuery(//
				"FROM Employee")//
				.setFirstResult(0)//
				.setMaxResults(10)//
				.list();

		// // ----- 執行查詢
		// List list = session.createQuery(hql).list();
		//
		// ----- 顯示結果
		for (Object obj : list) {
			if (obj.getClass().isArray()) {
				System.out.println(Arrays.toString((Object[]) obj));
			} else {
				System.out.println(obj);
			}
		}

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	@Test
	public void testHql_2() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------
		String hql = null;

		// 1,聚集函式:count(), max(), min(), avg(), sum()
		// hql = "SELECT COUNT(*) FROM Employee"; // 返回的結果是Long型的
		// hql = "SELECT min(id) FROM Employee"; // 返回的結果是id屬性的型別
		// Number result = (Number) session.createQuery(hql).uniqueResult();
		// System.out.println(result.getClass());
		// System.out.println(result);

		// 2,分組: Group By ... Having
		// hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";
		// hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";
		// hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";
		// ---
		// hql = "SELECT e.name,COUNT(e.id) " + //
		// "FROM Employee e " + //
		// "WHERE id<9 " + //
		// "GROUP BY e.name " + //
		// "HAVING count(e.id)>1 " + //
		// "ORDER BY count(e.id) ASC";
		// ---
		// hql = "SELECT e.name,COUNT(e.id) AS c " + //
		// "FROM Employee e " + //
		// "WHERE id<9 " + //
		// "GROUP BY e.name " + //
		// "HAVING count(e.id)>1 " + // 在having子句中不能使用列別名
		// "ORDER BY c ASC"; // 在orderby子句中可以使用列別名

		// 3,連線查詢 / HQL是面向物件的查詢
		// >> 內連線(inner關鍵字可以省略)
		// hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
		// hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";
		// >> 左外連線(outer關鍵字可以省略)
		// hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";
		// >> 右外連線(outer關鍵字可以省略)
		// hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";
		// 可以使用更方便的方法
		// hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

		// 4,查詢時使用引數
		// >> 方式一:使用'?'佔位
		// hql = "FROM Employee e WHERE id BETWEEN ? AND ?";
		// List list = session.createQuery(hql)//
		// .setParameter(0, 5)// 設定引數,第1個引數的索引為0。
		// .setParameter(1, 15)//
		// .list();

		// >> 方式二:使用變數名
		// hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
		// List list = session.createQuery(hql)//
		// .setParameter("idMax", 15)//
		// .setParameter("idMin", 5)//
		// .list();

		// 當引數是集合時,一定要使用setParameterList()設定引數值
		// hql = "FROM Employee e WHERE id IN (:ids)";
		// List list = session.createQuery(hql)//
		// .setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })//
		// .list();

		// 5,使用命名查詢
		// Query query = session.getNamedQuery("queryByIdRange");
		// query.setParameter("idMin", 3);
		// query.setParameter("idMax", 10);
		// List list = query.list();

		// 6,update與delete,不會通知Session快取
		// >> Update
		// int result = session.createQuery(//
		// "UPDATE Employee e SET e.name=? WHERE id>15")//
		// .setParameter(0, "無名氏")//
		// .executeUpdate(); // 返回int型的結果,表示影響了多少行。
		// System.out.println("result = " + result);
		// >> Delete
		int result = session.createQuery(//
				"DELETE FROM Employee e WHERE id>15")//
				.executeUpdate(); // 返回int型的結果,表示影響了多少行。
		System.out.println("result = " + result);

		// ----- 執行查詢並顯示結果
		// // List list = session.createQuery(hql).list();
		// for (Object obj : list) {
		// if (obj.getClass().isArray()) {
		// System.out.println(Arrays.toString((Object[]) obj));
		// } else {
		// System.out.println(obj);
		// }
		// }

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	@Test
	public void testHql_DML() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		// 第一次顯示名稱
		Employee employee = (Employee) session.get(Employee.class, 13);
		System.out.println(employee.getName());

		// update與delete,不會通知Session快取
		int result = session.createQuery(//
				"UPDATE Employee e SET e.name=? WHERE id>10")//
				.setParameter(0, "無名氏3")//
				.executeUpdate(); // 返回int型的結果,表示影響了多少行。

		// 第二次顯示名稱
		// 在update或delete後,需要refresh(obj)一下以獲取最新的狀態
		session.refresh(employee);
		System.out.println(employee.getName());

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

}

5、多種查詢方式——qbc

package cn.itcast.k_query_qbc;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

public class App {

	private static SessionFactory sessionFactory = new Configuration()//
			.configure()//
			.addClass(Department.class)// 新增Hibernate實體類(載入對應的對映檔案)
			.addClass(Employee.class)// 新增Hibernate實體類(載入對應的對映檔案)
			.buildSessionFactory();

	// 準備資料
	@Test
	public void testSave() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		// 儲存一些部門資料
		for (int i = 1; i <= 10; i++) {
			Department department = new Department();
			department.setName("開發部_" + i);
			session.save(department);
		}

		// 儲存一些員工資料
		for (int i = 1; i <= 20; i++) {
			Employee employee = new Employee();
			employee.setName("李XX_" + i);
			session.save(employee);
		}

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

	// 使用QBC方式查詢:Query By Criteria
	@Test
	public void testQBC() throws Exception {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// --------------------------------------------

		// 建立Criteria物件
		Criteria criteria = session.createCriteria(Employee.class);
		// 增加過濾條件
		criteria.add(Restrictions.ge("id", 1));
		criteria.add(Restrictions.le("id", 5));
		// 增加排序條件
		criteria.addOrder(Order.desc("name"));
		criteria.addOrder(Order.desc("id"));
		// 執行查詢
		// criteria.setFirstResult(0);
		// criteria.setMaxResults(100);
		// criteria.uniqueResult();
		// criteria.list()
		List list = criteria.list();
		// 顯示結果
		for (Object obj : list) {
			if (obj.getClass().isArray()) {
				System.out.println(Arrays.toString((Object[]) obj));
			} else {
				System.out.println(obj);
			}
		}

		// --------------------------------------------
		session.getTransaction().commit();
		session.close();
	}

}

一、一對一的關聯關係對映(外來鍵 + 唯一)
       基於外來鍵的
                有外來鍵方:<many-to-one name="obj" class=".." column=".." unique="true"/>
                無外來鍵方:<one-to-one name=".." class=".." property-ref="obj"/>

        基於主鍵的
                有外來鍵方:<one-to-one ...>
                無外來鍵方:<one-to-one ...>

        操作:
                在採用基於外來鍵的方式時:只有有外來鍵方可以維護關聯關係。
                在採用基於主鍵的方式時:雙方都不可以維護關係。

二、繼承結構對映
        1,整個繼承結構使用一張表。列上不能有not-null="true"。
        2,每個類對應一張表,抽象類也對應表。
        3,每個具體類對應一張表,抽象類不對應表。

三、HQL語句
        與SQL的語法類似。
        HQL查詢的物件、屬性,所以寫的時候寫的是類名、屬性名。
        HQL的關鍵字不區分大小寫,類名與屬性名區分大小寫。
        語法:
                SELECT           別名/屬性名/表示式
                FROM              實體 AS 別名
                WHERE           過濾條件
                ORDER BY      排序條件

                SELECT           別名/屬性名/表示式
                FROM              實體 AS 別名
                WHERE           過濾條件
                GROUP BY     分組條件
                HAVING          分組後的結果的過濾條件
                ORDER BY     排序條件 


相關推薦

hibernate——session快取事務隔離級別一對一關係多種方式查詢

package cn.itcast.k_query_hql; import java.util.Arrays; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hiber

Android五樂()ListFragmentViewPager

viewgroup cat () wid group 得到 ica bottom csdn 1ListFragment 今天首先學習了一種很經常使用的展示場景:列表展示。 昨天學習了使用Fragmet來取代activity進行設計。今天在托管單

hibernate

pan 都是 映射文件 family 集合 strong text cnblogs 但是 一對多 配置文件 一方 使用set的集合表示多個聯系人 多方 用對象表示一個客戶 一方配置關鍵 多方配置關鍵 這個配置關系兩張表的級聯操作 多對多 兩方都使用se

HibernateHibernate的一對多配置、Hibernate的多對多的配置

Hibernate第三天:Hibernate的一對多配置、Hibernate的多對多的配置   目錄 Hibernate第三天:Hibernate的一對多配置、Hibernate的多對多的配置 1 Hibernate的一對多關聯對映 1.1資料庫表與表之間的關係

Struts2學習——攔截器檔案傳輸

文件版本 開發工具 測試平臺 工程名字 日期 作者 備註 V1.0 2016.06.15 lutianfei none

Sql Server中的事務事務隔離級別

事務是資料庫進行併發控制非常重要的機制。 1、什麼是事務?   事務是作為單個邏輯工作單元執行的一系列操作,它由一條或者一組語句組成,它們麼全部成功,要麼全部失敗。   舉個例子,比如在12306訂火車票,要麼你訂票成功,餘票顯示就減少一張;要麼你訂票失敗,餘票顯示還是那麼多。不允許出現

資料庫事務的特性事務隔離級別

                             資料庫事務的特性與隔離級別 事務     事務簡單的理解就是要在

MySQL鎖事務隔離級別

一、概述 1.1 定義 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制 計算資源(如CPU、RAM、I/O等)的爭用以外,資料也是一種供需要使用者共享的資源。如何保證資料併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪

SQL Server 中的事務事務隔離級別以及如何理解髒讀, 未提交讀,不可重複讀和幻讀產生的過程和原因

原本打算寫有關 SSIS Package 中的事務控制過程的,但是發現很多基本的概念還是需要有 SQL Server 事務和事務的隔離級別做基礎鋪墊。所以花了點時間,把 SQL Server 資料庫中的事務概念,ACID 原則,事務中常見的問題,問題造成的原因和事務隔離級別等這些方面的知識好好的整理了一下。

SQL Server 中的事務事務隔離級別以及髒讀

原 本打算寫有關 SSIS Package 中的事務控制過程的,但是發現很多基本的概念還是需要有 事務和事務的隔離級別做基礎鋪墊。所以花了點時間,把 資料庫中的事務概念,ACID 原則,事務中常見的問題,問題造成的原因和事務隔離級別等這些方面的知識好好的整理了一下。 其實有關 SQL Server 中的

oracle,mysql,sql server大數據庫的事務隔離級別查看方法

glob declare ddr 存在 lag har oca flag ali 1:mysql的事務隔離級別查看方法 mysql 最簡單,執行這條語句就行:select @@tx_isolation 詳情: 1.查看當前會話隔離級別 sel

面試必問的MySQL鎖事務隔離級別

之前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工作中常用的sql優化小知識點。面試各大網際網路公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛沖天。 鎖定義 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。 在資料庫中,除了傳統的計算資源(

一文講清楚MySQL事務隔離級別和實現原理開發人員必備知識點

經常提到資料庫的事務,那你知道資料庫還有事務隔離的說法嗎,事務隔離還有隔離級別,那什麼是事務隔離,隔離級別又是什麼呢?本文就幫大家梳理一下。 MySQL 事務 本文所說的 MySQL 事務都是指在 InnoDB 引擎下,MyISAM 引擎是不支援事務的。 資料庫事務指的是一組資料操作,事務內的操作要麼就是

名校聯賽A層 問題 C: 非題解

swap pac hid cnblogs stdout str 但是 接下來 出現次數 問題 C: 與非 時間限制: 2 Sec 內存限制: 256 MB 題目描述 作為一名新世紀共產主義的接班人,你認識到了資本主義的軟弱性與妥協性,決定全面根除資本主義,跑步邁入共產

LINUX系統服務管理(Services)---------

raid磁盤陣列 進程管理 ? RAID磁盤陣列? 廉價冗余磁盤陣列– Redundant Arrays of Inexpensive Disks– 通過硬件/軟件技術,將多個較小/低速的磁盤整合成一個大磁盤– 陣列的價值:提升I/O效率、硬件級別的數據冗余– 不同RAID級別的功能、特性各不相同?

# 運維小白的成長日記-基礎網絡構建OSI七層模型TCP/IP模型

網絡運維運維小白的成長日記第三天- 基礎網絡構建OSI七層模型與TCP/IP模型 網絡運維的小白和想要加入網絡運維的小夥伴們值得一看哦~今天是初識網絡運維的第三天。希望能有誌同道合的小夥伴一起討論和學習,也希望有網絡運維的大神能夠幫忙在網絡運維這條路上幫忙指點,能夠多提意見使我進步。 今天和大家分享一下基礎網

的 No session 問題

pen 數據 生命 查詢 第三天 AS ger 理解 TP 1.1 No session(理解) 初始化快遞員對象中 定區集合 Web層轉Courier對象為json串時候,對象中有fixedareas集合屬性,jpa集合屬性加載策略延遲加載。在action中轉fixeda

hibernate學習筆記

delet unique lis 多少 update 從數據 將不 不同的 get方法 復習環境搭建配置->工廠->Session->事務Query list uniqueResultCriteria(QBC)配置---------------------

,數據類型運算符

python3 無法 user 整理 NPU 基本 結果 改變 愛好 今日內容: 1. 變量剩余: 變量值的三個特征:id type value is與== 小整數池(**) 常量 2. 基本數據類型 3. 輸入輸

事務管理 、 三大框架整合開發

事務管理 、 三大框架整合開發 目錄 一、Spring事務管理 1、 事務管理相關API 2、 PlatformTransactionManager 介面詳解 1) 不同平臺事務管理器實現 2) TransactionDefinition 事務隔離級別 3)