Hibernate框架技術視頻課程——筆記(二)
一、查詢操作
1. Hibernate支持多種查詢方式
2.分類
? 主鍵查詢、HQL查詢、Criteria查詢、原生SQL查詢、命名查詢、JDBC操作
? 導航查詢(根據關聯關系自動查詢)
二、主鍵查詢
1. get方法
? Session的get()
2. load方法
? Session的load()
三、HQL查詢
1. 簡介
1.1 概念
? HQL:Hibernate Query Language,Hibernate查詢語言
? 是一種面向對象的查詢語句,其中沒有表和列的概念,只有類、對象和屬性的概念
1.2 優點
- 不需要編寫復雜的SQL語句,而是針對實體類和屬性進行查詢
- 查詢結果是直接返回的List對象集合,不需要再次封裝
- 獨立於數據庫,根據dialect自動生成對應數據庫的SQL語句
2. 基本用法
2.1 語法
[select/update/delete 屬性名]
from 類名
[where]
[group by]
[having]
[order by]
類似於sql,對應關系
SQL | HQL |
---|---|
表名 | 類名 |
列名 | 屬性名 |
select id,name,pwd,age from t_user | select id,username,password,age from User |
2.2 使用HQL需要四步
-
獲取Session
-
編寫HQL語句
-
創建Query對象
Query接口是HQL查詢接口,提供了各種查詢功能
- 執行查詢,得到結果
Session session = HibernateUtil.getSession(); // String hql="from User"; //實體類名,類名區分大小寫 // String hql = "from day01.User"; // 也可寫成類的全名 // String hql = "select * from User"; // 報錯:此處不能使用*星號 String hql = "select u from User u"; // 設置別名 Query query = session.createQuery(hql); List<User> list = query.list(); System.out.println(list); HibernateUtil.close();
3. 實體查詢
- 實體查詢1:查詢所有用戶
- 實體查詢2:帶條件
- 實體查詢3:單個實體
4. 投影查詢
? 投影查詢就是只查詢類的一個或多個屬性,並不獲取對象的全部屬性,也稱為屬性查詢
? 有如下三種形式:
- 查詢單個屬性,將每條查詢結果封裝成Object對象
- 查詢多個屬性
- 將每條查詢結果封裝成Object數組
- 將每條查詢結果封裝成Map集合(了解)
- 將每條查詢結果通過構造函數封裝成對象
5. 參數綁定
5.1 ?參數占位符
? 使用?作為占位符,可以先設定查詢參數,然後通過Query的setXxx()方法設置參數值
? 下標從0開始,與PreparedStatement有所不同(從1開始)
5.2 命名參數
? 使用:name標識一個名為name的查詢參數,然後根據此參數名設置參數值
5.3 bean參數
? 將參數封裝為一個bean,然後通過Query的setProperties(Object bean)方法設置參數值
6. 分頁和聚合函數
6.1 分頁
Query對象提供了簡便的分頁方法:
- setFirstResult(int firstResult) 設置從第幾條開始
- setMaxResults(int maxResults) 設置讀取最大記錄數據
Hibernate會根據底層數據庫自動生成相應的分頁語句
6.2 聚合函數
? 常用聚合函數:count()、max()、min()、avg()、sum()
? 子查詢
? 分組查詢:group by .... having
四、Criteria查詢
1. 簡介
? Criteria查詢是Hibernate提供的一種完全面向對象的查詢,它用面向對象的方式將構造查詢的過程做了封裝,又稱為對象查詢
? 詳見文檔 第15章 條件查詢 Criteria
2. 基本用法
? Restriction類提供了許多靜態方法,用來限定查詢條件
五、原生SQL查詢
1. 簡介
? Hibernate對原生SQL查詢也提供了支持,也稱為本地SQL查詢
? 通過SQLQuery也支持原生SQL查詢
? addEntity()將查詢結果集中的關系數據映射為對象
2. 基本用法
String sql="select * from t_user";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class); //將查詢結果集中的關系數據映射為對象
List<User> list = query.list();
System.out.println(list);
六、命名查詢
1. 簡介
? 命名查詢是指在映射文件中定義字符串形式的查詢語句,即將查詢語句寫在hbm映射文件中
? 命名查詢既可以是HQL查詢語句,也可以是SQL查詢語句
2. HQL語句的命名查詢
? 在映射文件中使用<query>元素定義一個HQL查詢語句,與<class>元素並列
3. SQL語句的命名查詢
? 在映射文件中使用<sql-query>元素定義一個SQL查詢語句,與<class>元素並列
七、JDBC操作
1. 簡介
? 在Hibernate4.x中可以使用Session的doWork()方法進行JDBC操作,會將Connection暴露出來
2. 基本用法
Session session = HibernateUtil.getSession();
final List<User> list=new ArrayList<User>();
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
ResultSet rs = conn.prepareStatement("select * from t_user")
.executeQuery();
while (rs.next()) {
User user = new User(rs.getInt("id"), rs.getString("name"),
rs.getString("pwd"), rs.getInt("age"));
list.add(user);
}
}
});
System.out.println(list);
HibernateUtil.close();
八、其他
1. 更新操作
? 使用Query的executeUpdate()方法對數據進行更新操作:增、刪、改
Session session = HibernateUtil.getSession();
TransactionManager.beginTransaction();
// String hql="delete from User where id in (2,3,5,7,20) and password=‘123‘";
String hql = "update User u set u.password=‘666666‘ where u.username=‘alice‘";
Query query = session.createQuery(hql);
int count = query.executeUpdate(); // 受影響的行數
System.out.println(count);
TransactionManager.commit();
System.out.println("更新成功");
HibernateUtil.close();
2. formula屬性
? 該屬性可以利用SQL動態的生成實體屬性,將SQL執行結果映射到實體屬性上
? 要求:
- 實體要存在相應的屬性
- sql語句必須用小括號()包裹起來
- 如果操作列名,必須為表起別名
<!--
該屬性不對應數據庫表中的某列,對應的是sql查詢的結果
-->
<property name="count" formula="(select count(u.id) from t_user u)"></property>
九、作業
1. 任務
- 創建部門表t_dept(id,name)及對應的實體類和hbm文件
- 創建員工表t_emp(id,name,dept_id)及對應的實體類和hbm文件
- 創建班級表t_class(id,name)及對應的實體類和hbm文件
- 創建學生表t_student(id,name,class_id)及對應的實體類和hbm文件
2. 預習
? 多對一、一對多、多對多、一對一
? 繼承、組件、JPA
Hibernate框架技術視頻課程——筆記(二)