欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Java的Hibernate框架中對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行查詢操作

 更新時(shí)間:2015年12月22日 08:57:10   投稿:goldensun  
這篇文章主要介紹了Java的Hibernate框架中對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行查詢操作的方法,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

Hibernate查詢語言(HQL)是一種面向?qū)ο蟮牟樵冋Z言,類似于SQL,但不是對(duì)表和列操作,HQL適用于持久對(duì)象和它們的屬性。 HQL查詢由Hibernate轉(zhuǎn)換成傳統(tǒng)的SQL查詢,這在圈上的數(shù)據(jù)庫執(zhí)行操作。

雖然可以直接使用SQL語句和Hibernate使用原生SQL,但建議使用HQL盡可能避免數(shù)據(jù)庫可移植性的麻煩,并采取Hibernate的SQL生成和緩存策略的優(yōu)勢(shì)。

都像SELECT,F(xiàn)ROM和WHERE等關(guān)鍵字不區(qū)分大小寫,但如表名和列名的屬性是區(qū)分在HQL敏感。

FROM 語句
使用FROM子句,如果要加載一個(gè)完整的持久化對(duì)象到內(nèi)存中。下面是一個(gè)使用FROM子句的簡單的語法:

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();

如果需要完全限定在HQL一個(gè)類名,只需指定如下的包和類名:
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();

AS 語句
AS子句可以用來別名分配給類中的HQL查詢,特別是當(dāng)有很長的查詢。例如,我們前面簡單的例子是以下幾點(diǎn):

String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();

AS關(guān)鍵字是可選的,也可以直接在之后的類名指定別名,如下所示:

String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

SELECT 子句
SELECT子句提供了更多的控制權(quán)比from子句的結(jié)果集。如果想獲得對(duì)象而不是整個(gè)對(duì)象的幾個(gè)屬性,使用SELECT子句。下面是一個(gè)使用SELECT語句來獲取Employee對(duì)象只是FIRST_NAME字段的簡單的語法:

String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

值得注意的是在這里,Employee.firstName是Employee對(duì)象的一個(gè)屬性,而不是EMPLOYEE表的一個(gè)字段。

WHERE 子句
如果想縮小了從存儲(chǔ)返回的特定對(duì)象,可以使用WHERE子句。下面是一個(gè)使用WHERE子句的簡單的語法:

String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();

ORDER BY 子句
若要排序HQL查詢的結(jié)果,將需要使用ORDER BY子句。您可以在結(jié)果集按升序(ASC)或降序(DESC)通過在對(duì)象的任何屬性排序結(jié)果。下面是一個(gè)使用ORDER BY子句的簡單的語法:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

如果想通過一個(gè)以上的屬性進(jìn)行排序,你會(huì)僅僅是額外的屬性添加到由子句用逗號(hào)隔開,如下所示的命令的結(jié)尾:

String hql = "FROM Employee E WHERE E.id > 10 " +
       "ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();

GROUP BY 子句
該子句允許從Hibernate的它基于屬性的值的數(shù)據(jù)庫和組提取信息,并且通常使用結(jié)果包括總值。下面是一個(gè)使用GROUP BY子句的語法很簡單:

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
       "GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();

使用命名參數(shù)
Hibernate命名在其HQL查詢參數(shù)支持。這使得編寫接受來自用戶的輸入容易,不必對(duì)SQL注入攻擊防御HQL查詢。下面是一個(gè)使用命名參數(shù)的簡單的語法:

String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();

UPDATE 子句
批量更新是新的HQL與Hibernate3,以及不同的刪除工作,在Hibernate 3和Hibernate2一樣。 Query接口現(xiàn)在包含一個(gè)名為executeUpdate()方法用于執(zhí)行HQL UPDATE或DELETE語句。

在UPDATE子句可以用于更新一個(gè)或多個(gè)對(duì)象中的一個(gè)或多個(gè)屬性。下面是一個(gè)使用UPDATE子句的簡單的語法:

String hql = "UPDATE Employee set salary = :salary " + 
       "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

DELETE 子句
DELETE子句可以用來刪除一個(gè)或多個(gè)對(duì)象。下面是一個(gè)使用DELETE子句的簡單的語法:

String hql = "DELETE FROM Employee " + 
       "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

INSERT 子句
HQL支持INSERT INTO子句中只記錄在那里可以插入從一個(gè)對(duì)象到另一個(gè)對(duì)象。以下是使用INSERT INTO子句的簡單的語法:

String hql = "INSERT INTO Employee(firstName, lastName, salary)" + 
       "SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

聚合方法
HQL支持多種聚合方法,類似于SQL。他們工作在HQL同樣的方式在SQL和下面的可用功能列表:

2015122285326321.png (576×200)

DISTINCT關(guān)鍵字只計(jì)算在該行設(shè)定的唯一值。下面的查詢將只返回唯一的計(jì)數(shù):

String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

使用查詢分頁
有用于分頁查詢接口的兩個(gè)方法。

  • Query setFirstResult(int startPosition)
  • Query setMaxResults(int maxResult)

采用上述兩種方法一起,可以在網(wǎng)站或Swing應(yīng)用程序構(gòu)建一個(gè)分頁組件。下面是例子,可以擴(kuò)展來獲取10行:

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();

查詢條件
Hibernate提供了操作對(duì)象,并依次數(shù)據(jù)在RDBMS表可用的備用方式。其中一個(gè)方法是標(biāo)準(zhǔn)的API,它允許你建立一個(gè)標(biāo)準(zhǔn)的查詢對(duì)象編程,可以套用過濾規(guī)則和邏輯條件。
Hibernate的Session接口提供了可用于創(chuàng)建一個(gè)返回的持久化對(duì)象的類的實(shí)例時(shí),應(yīng)用程序執(zhí)行一個(gè)條件查詢一個(gè)Criteria對(duì)象createCriteria()方法。

以下是最簡單的一個(gè)條件查詢的例子是將簡單地返回對(duì)應(yīng)于Employee類的每個(gè)對(duì)象。

Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();

限制與標(biāo)準(zhǔn):
可以使用add()方法可用于Criteria對(duì)象添加限制條件查詢。下面是例子增加一個(gè)限制與薪水返回的記錄是等于2000:

Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();

以下是幾個(gè)例子覆蓋不同的場景,并且可以根據(jù)要求使用:

Criteria cr = session.createCriteria(Employee.class);

// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));

// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));

// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));

// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));

// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));

// To check if the given property is null
cr.add(Restrictions.isNull("salary"));

// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));

// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));

// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
可以創(chuàng)建AND或OR使用LogicalExpression限制如下條件:

Criteria cr = session.createCriteria(Employee.class);

Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");

// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );


// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );

List results = cr.list();

雖然上述所有條件,可以直接使用HQL在前面的教程中介紹。

分頁使用標(biāo)準(zhǔn):
還有的標(biāo)準(zhǔn)接口,用于分頁的兩種方法。

  • public Criteria setFirstResult(int firstResult)
  • public Criteria setMaxResults(int maxResults)

采用上述兩種方法一起,我們可以在我們的網(wǎng)站或Swing應(yīng)用程序構(gòu)建一個(gè)分頁組件。下面是例子,可以擴(kuò)展來每次獲取10行:

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();

排序的結(jié)果:
標(biāo)準(zhǔn)的API提供了org.hibernate.criterion.Order類排序按升序或降序排列你的結(jié)果集,根據(jù)對(duì)象的屬性。這個(gè)例子演示了如何使用Order類的結(jié)果集進(jìn)行排序:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));

// To sort records in descening order
crit.addOrder(Order.desc("salary"));

// To sort records in ascending order
crit.addOrder(Order.asc("salary"));

List results = cr.list();

預(yù)測(cè)與聚合:
該Criteria API提供了一個(gè)org.hibernate.criterion.Projections類可用于獲取平均值,最大值或最小值的屬性值。Projections類是類似于類限制,因?yàn)樗峁┝藥讉€(gè)靜態(tài)工廠方法用于獲得Projection 實(shí)例。  provides the

以下是涉及不同的方案的一些例子,可按規(guī)定使用:

Criteria cr = session.createCriteria(Employee.class);

// To get total row count.
cr.setProjection(Projections.rowCount());

// To get average of a property.
cr.setProjection(Projections.avg("salary"));

// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));

// To get maximum of a property.
cr.setProjection(Projections.max("salary"));

// To get minimum of a property.
cr.setProjection(Projections.min("salary"));

// To get sum of a property.
cr.setProjection(Projections.sum("salary"));

Criteria Queries 例子:
考慮下面的POJO類:

public class Employee {
  private int id;
  private String firstName; 
  private String lastName;  
  private int salary; 

  public Employee() {}
  public Employee(String fname, String lname, int salary) {
   this.firstName = fname;
   this.lastName = lname;
   this.salary = salary;
  }
  public int getId() {
   return id;
  }
  public void setId( int id ) {
   this.id = id;
  }
  public String getFirstName() {
   return firstName;
  }
  public void setFirstName( String first_name ) {
   this.firstName = first_name;
  }
  public String getLastName() {
   return lastName;
  }
  public void setLastName( String last_name ) {
   this.lastName = last_name;
  }
  public int getSalary() {
   return salary;
  }
  public void setSalary( int salary ) {
   this.salary = salary;
  }
}

讓我們創(chuàng)建下面的EMPLOYEE表來存儲(chǔ)Employee對(duì)象:

create table EMPLOYEE (
  id INT NOT NULL auto_increment,
  first_name VARCHAR(20) default NULL,
  last_name VARCHAR(20) default NULL,
  salary   INT default NULL,
  PRIMARY KEY (id)
);

以下將被映射文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
  <class name="Employee" table="EMPLOYEE">
   <meta attribute="class-description">
     This class contains the employee detail. 
   </meta>
   <id name="id" type="int" column="id">
     <generator class="native"/>
   </id>
   <property name="firstName" column="first_name" type="string"/>
   <property name="lastName" column="last_name" type="string"/>
   <property name="salary" column="salary" type="int"/>
  </class>
</hibernate-mapping>

最后,我們將創(chuàng)建應(yīng)用程序類的main()方法來運(yùn)行,我們將使用Criteria查詢的應(yīng)用程序:

import java.util.List; 
import java.util.Date;
import java.util.Iterator; 
 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.Configuration;

public class ManageEmployee {
  private static SessionFactory factory; 
  public static void main(String[] args) {
   try{
     factory = new Configuration().configure().buildSessionFactory();
   }catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex);
     throw new ExceptionInInitializerError(ex); 
   }
   ManageEmployee ME = new ManageEmployee();

   /* Add few employee records in database */
   Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
   Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
   Integer empID3 = ME.addEmployee("John", "Paul", 5000);
   Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);

   /* List down all the employees */
   ME.listEmployees();

   /* Print Total employee's count */
   ME.countEmployee();

   /* Print Toatl salary */
   ME.totalSalary();
  }
  /* Method to CREATE an employee in the database */
  public Integer addEmployee(String fname, String lname, int salary){
   Session session = factory.openSession();
   Transaction tx = null;
   Integer employeeID = null;
   try{
     tx = session.beginTransaction();
     Employee employee = new Employee(fname, lname, salary);
     employeeID = (Integer) session.save(employee); 
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace(); 
   }finally {
     session.close(); 
   }
   return employeeID;
  }

  /* Method to READ all the employees having salary more than 2000 */
  public void listEmployees( ){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
     // Add restriction.
     cr.add(Restrictions.gt("salary", 2000));
     List employees = cr.list();

     for (Iterator iterator = 
              employees.iterator(); iterator.hasNext();){
      Employee employee = (Employee) iterator.next(); 
      System.out.print("First Name: " + employee.getFirstName()); 
      System.out.print(" Last Name: " + employee.getLastName()); 
      System.out.println(" Salary: " + employee.getSalary()); 
     }
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace(); 
   }finally {
     session.close(); 
   }
  }
  /* Method to print total number of records */
  public void countEmployee(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);

     // To get total row count.
     cr.setProjection(Projections.rowCount());
     List rowCount = cr.list();

     System.out.println("Total Coint: " + rowCount.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace(); 
   }finally {
     session.close(); 
   }
  }
 /* Method to print sum of salaries */
  public void totalSalary(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);

     // To get total salary.
     cr.setProjection(Projections.sum("salary"));
     List totalSalary = cr.list();

     System.out.println("Total Salary: " + totalSalary.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace(); 
   }finally {
     session.close(); 
   }
  }
}

編譯和執(zhí)行:
下面是步驟來編譯并運(yùn)行上述應(yīng)用程序。請(qǐng)確保您已在進(jìn)行的編譯和執(zhí)行之前,適當(dāng)?shù)卦O(shè)置PATH和CLASSPATH。

  • 創(chuàng)建hibernate.cfg.xml配置文件中配置章節(jié)解釋。
  • 創(chuàng)建Employee.hbm.xml映射文件,如上圖所示。
  • 創(chuàng)建Employee.java源文件,如上圖所示,并編譯它。
  • 創(chuàng)建ManageEmployee.java源文件,如上圖所示,并編譯它。
  • 執(zhí)行ManageEmployee二進(jìn)制運(yùn)行程序.

會(huì)得到以下結(jié)果,并記錄將創(chuàng)建在EMPLOYEE表中。

$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........

First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
Total Coint: 4
Total Salary: 15000

如果檢查EMPLOYEE表,它應(yīng)該記錄如下:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 14 | Zara    | Ali    |  2000 |
| 15 | Daisy   | Das    |  5000 |
| 16 | John    | Paul   |  5000 |
| 17 | Mohd    | Yasee   |  3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)

相關(guān)文章

  • Java中集合關(guān)系圖及常見操作詳解

    Java中集合關(guān)系圖及常見操作詳解

    這篇文章主要為大家詳細(xì)介紹了Java中集合關(guān)系圖及常見操作,解析Java中的集合類型的繼承關(guān)系圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Servlet3.0實(shí)現(xiàn)文件上傳的方法

    Servlet3.0實(shí)現(xiàn)文件上傳的方法

    本篇文章主要介紹了Servlet實(shí)現(xiàn)文件上傳的方法,所謂文件上傳就是將本地的文件發(fā)送到服務(wù)器中保存。有興趣的可以了解一下。
    2017-03-03
  • Java協(xié)議字節(jié)操作工具類詳情

    Java協(xié)議字節(jié)操作工具類詳情

    這篇文章主要介紹了Java協(xié)議字節(jié)操作工具類詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解java WebSocket的實(shí)現(xiàn)以及Spring WebSocket

    詳解java WebSocket的實(shí)現(xiàn)以及Spring WebSocket

    這篇文章主要介紹了詳解java WebSocket的實(shí)現(xiàn)以及Spring WebSocket ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    本文主要講了單例模式中的餓漢式和懶漢式的區(qū)別,final的使用,抽象類的介紹以及接口的具體內(nèi)容,感興趣的朋友來看看吧
    2022-05-05
  • 部署Nacos的源碼環(huán)境搭建過程

    部署Nacos的源碼環(huán)境搭建過程

    這篇文章主要為大家介紹了部署Nacos的源碼環(huán)境搭建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Mybatis?Plus?逆向工程介紹

    Mybatis?Plus?逆向工程介紹

    這篇文章主要介紹了Mybatis?Plus?逆向工程,文章通過Mybatis?Plus?逆向工程相關(guān)資料及示例代碼詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考一下
    2022-01-01
  • SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法

    SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java中map遍歷方式的選擇問題詳解

    Java中map遍歷方式的選擇問題詳解

    這篇文章主要介紹了Java中map遍歷方式的選擇問題的相關(guān)內(nèi)容,小編覺得挺不錯(cuò)的,在則里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • SpringBoot2整合JTA組件實(shí)現(xiàn)多數(shù)據(jù)源事務(wù)管理

    SpringBoot2整合JTA組件實(shí)現(xiàn)多數(shù)據(jù)源事務(wù)管理

    這篇文章主要介紹了SpringBoot2整合JTA組件實(shí)現(xiàn)多數(shù)據(jù)源事務(wù)管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論