第二个hibernate

在 第一個 Hibernate 中介紹如何使用Hibernate在不使用SQL的情況下,以Java中操作物件的習慣來插入數據至資料庫中,當然儲存數據之後,更重要的是如何將資料讀 出,Hibernate中也可以讓您不寫一句SQL,而以Java中操作物件的習慣來查詢數據。

直接來看個範例:
 

  • HibernateDemo.java
package onlyfun.caterpillar;

import java.util.Iterator;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

public class HibernateDemo {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession(); 

        Criteria criteria = session.createCriteria(User.class);
        // 查詢user所有欄位
        Iterator users = criteria.list().iterator();
        System.out.println("id \t name/age");
        while(users.hasNext()) {
            User user = (User) users.next(); 
            System.out.println(user.getId() +
                                " \t " + user.getName() +
                                "/" + user.getAge()); 
        }

        // 查詢user中符合條件的欄位
        criteria.add(Expression.eq("name", "caterpillar"));
        users = criteria.list().iterator(); 
        System.out.println("id \t name/age");
        while(users.hasNext()) {
            User user = (User) users.next(); 
            System.out.println(user.getId() +
                " \t " + user.getName() +
                "/" + user.getAge()); 
        }
 
        session.close();
        
        HibernateUtil.shutdown();
    }
}


Criteria對SQL進行封裝,對於不甚瞭解SQL的開發人員來說,使用Criteria也可以輕易的進行各種數據的檢索,您也可以使用 Expression設定查詢條件,並將之加入Criteria中對查詢結果作限制,Expression.eq()表示設定符合條件的查詢,例如 Expression.eq("name", "caterpillar")表示設定查詢條件為"name"欄位中為"caterpillar"的資料。

先來看一下執行結果:
 

Hibernate: 
    select
        this_.id as id0_0_,
        this_.name as name0_0_,
        this_.age as age0_0_ 
    from
        T_USER this_
id      name/age
1      caterpillar/30
2      bush/20

Hibernate: 
    select
        this_.id as id0_0_,
        this_.name as name0_0_,
        this_.age as age0_0_ 
    from
        T_USER this_ 
    where
        this_.name=?
id      name/age
1      caterpillar/30


Criteria是物件導向式的查詢方式,讓不瞭解SQL的開發人員也可以輕易進行各項查詢,但Criteria的API目前還不是很完善,而 Hibernate鼓勵的查詢方式,是透過HQL(Hibernate Query Language)來進行,直接來看個實例:

  • HibernateDemo.java
package onlyfun.caterpillar;

import java.util.Iterator;

import org.hibernate.Query;
import org.hibernate.Session;

public class HibernateDemo {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession(); 
        
        // 使用HQL建立查詢
        Query query = session.createQuery("from User");
        Iterator users = query.list().iterator();
        System.out.println("id \t name/age");
        while(users.hasNext()) {
            User user = (User) users.next(); 
            System.out.println(user.getId() +
                    " \t " + user.getName() +
                    "/" + user.getAge()); 
        }
 
        System.out.println();
 
        // 使用HQL建立查詢
        query = session.createQuery("from User user where user.name like ?");
        // 設定查詢參數
        query.setParameter(0, "caterpillar");
        users = query.list().iterator();
        System.out.println("id \t name/age");
        while(users.hasNext()) {
            User user = (User) users.next(); 
            System.out.println(user.getId() +
                                " \t " + user.getName() +
                                "/" + user.getAge()); 
        }
 
        session.close();
        
        HibernateUtil.shutdown();
    }
}


執行結果:

Hibernate: 
    select
        user0_.id as id0_,
        user0_.name as name0_,
        user0_.age as age0_ 
    from
        T_USER user0_
id      name/age
1      caterpillar/30
2      bush/20

Hibernate: 
    select
        user0_.id as id0_,
        user0_.name as name0_,
        user0_.age as age0_ 
    from
        T_USER user0_ 
    where
        user0_.name like ?
id      name/age
1      caterpillar/30


透過Query介面,您可以先設定查詢參數,之後透過setXXX()等方法,將指定的參數值填入,而不用每次都撰寫完整的HQL,Query的 setParameter()方法第一個參數是指定 ? 出現的位置,從 0 開始,第二個參數則是設定查詢條件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值