1. 程式人生 > >Hibernate框架技術視頻課程——筆記(二)

Hibernate框架技術視頻課程——筆記(二)

del dsta prope rri result 參數 session 大小寫 員工

視頻課程鏈接:http://edu.51cto.com/course/10747.html

一、查詢操作

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需要四步

  1. 獲取Session

  2. 編寫HQL語句

  3. 創建Query對象

    Query接口是HQL查詢接口,提供了各種查詢功能

  4. 執行查詢,得到結果
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框架技術視頻課程——筆記(二)