1. 程式人生 > >Hibernate的核心API

Hibernate的核心API

目錄

1.Configuration

2.SessionFactory


1.Configuration

用於啟動,載入,管理的的的Hiberante配置

1.自動載入

configuration sonfig=new configration ().config();

預設載入src下的hibernate.cfg.xml檔案來 

2·手動載入

configuration config=new configration().config(File file);

configuration config=new configration().config(String path);

configuration config=new configration().config(Document xml);

也可以
 

configuration config=new configuration ();

config.addResource("cn/itcast/domain/Customer.hkm.xml");//載入配置檔案 

config.addClass(customer.class);//會預設查詢customer.hbm.xml檔案 

config.setProperty(Stirng name, String value);//載入配置項

    例如setProperty("hibernate.dialect", "org.hibernate.dialect.MysQLDialect")

2.SessionFactory

  • 獲取會話物件。
  • SessionFactory的的的是一個重量級元件。
  • 可以針對於獲取會話操作,進行抽取工具
public class HibernateUtils {
	private static final configuration config;
	private static final SessionFactory factory;
	
	static {
		config = new confiquration().confiqure();
		factory =config.buildsessionFactory();
	}
	public static Session getSession(){
		return factory.openSession();
	} 
}

SessionFactory的的物件,它維護的是休眠中的二級快取。

它是執行緒安全的。

冬眠內部維護了一個連線池,我們都是從這個內部的連線池中獲取的連線物件。

 

通過SessionFactory的的的可以獲取會話物件。

  • 1.openSession()隨機獲取一個
  • 2.getCurrentSession();

 

在休眠中使用C3P0連線池

1.在hibernate.sfg.xml檔案中配置
 

hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider

代表當前要使用的連線池是c3p0連線池.

2,可以配置C3P0連線池屬性,
 

<!--在連線池中可用的資料庫連線的最少數具->

<property name="c3p0.min_size">5</property>

<!--在連線池中所有資料庫連線的最大數且-->

<property name="c3p0.max_size">20</property>

<!--設定資料庫連線的過期時間,以秒為單位,如果連線池中的某個資料庫連線處於空困狀態的時間超過了timeout時間,就會從連線池中清除->
<property name="c3p0.timeaut">120</property>

<!-每3000秒檢查所有連線池中的空閒連線以秒為單位->

<property name="c3p0.idle_test_period">3000</property> 

注意:需要匯入c3p0的jar包hibernate \ lib \ optional \ c3p0

 

3.Session

代表hibernate操作會話物件,相對於Connection

  • session是一個單執行緒物件,執行緒不安全(在方法內部定義和使用Session,不會出現執行緒問題)
  • *每個執行緒方法呼叫棧,是執行緒私有的
  • session進行PO(Persistent object)物件常見持久化操作,存在一級快取,

常用API

  • save 完成插入
  • update 完成修改
  • delete 完成刪除
  • get/load 根據主鍵欄位查詢
  • createQuery,createSQLQery 建立查詢物件      Query接收HQl,     SQlguery接收sQL
  • createCriteria() 面向物件條件查詢

4.Transaction

  • rallback () ; 事務回滾
  • commit (); 事務提交
  • wasCommitted() 返回boolean  判斷事務是否提交
  • wasRollback()  返回boolean  判斷事務是否回滾。

 

5.Query

1.session.createQuery(String hql);

1.list()      返回 List<Object>     代表查詢出的所有資訊

2.uniqureResult()     返回一個Object,查詢結果只返回一個值時,可以使用

3.分頁查詢
 

setFirstResult (int firstResult)     設定返回結果從第幾條開始 

setMaxResults (int maxResults)       設定本返回結果記錄條數 

4.查詢某一部分屬性資訊

1,例如,得到customer類的id與name屬性

  • 1.在Customer類中新增構造方法,構造方法引數id, name.
  • 2.HQL語句 select new Customer (id, name) from Customer;

5.條件查詢問題

1.可以使用"?"佔位符

  • from Customer where name=?;
  • 通過Query.setParameter (0,值);從0開始記位,進行賦值。

2.可以直接給要賦值欄位起個名稱

  • from Customer where name=:abc;
  • 通過Query.setParameter("abc","王五");
package com.qwl.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Test;

import com.qwl.domain.Customer;

import utils.HibernateUtils;

public class QueryTest {
	@Test
	public void hqlTest(){
		Session session =HibernateUtils.getSession();
		session.beginTransaction();
		
		//查詢全部
		Query query=session.createQuery("from Customer");
		List<Customer> cs =query.list();
		
		for(Customer c:cs){
			System.out.println(c);
		}
		session.getTransaction().commit();
		session.close();
	}
	
	//根據條件查詢
	@Test
	public void hqlTest2(){
		Session session =HibernateUtils.getSession();
		session.beginTransaction();
		
		//查詢全部
		Query query=session.createQuery("from Customer where id=1");
		
		Customer c =(Customer) query.uniqueResult();//結果只返回一個值可以使用uniqueResult();
		System.out.println(c);
		session.getTransaction().commit();
		session.close();
	}
	
	//分頁查詢
	@Test
	public void hqlTest3(){
		Session session =HibernateUtils.getSession();
		session.beginTransaction();
		
		//查詢全部
		Query query=session.createQuery("from Customer");
		
		query.setFirstResult(2);//從第幾條開始查詢
		query.setMaxResults(3);//查詢幾條
		List<Customer> cs= query.list();
		
		for(Customer c:cs){
			System.out.println(c);
		}
				
		session.getTransaction().commit();
		session.close();
	}
	
	//通過HQL只查詢某些欄位值
	@Test
	public void hqlTest4(){
		Session session =HibernateUtils.getSession();
		session.beginTransaction();
		
		//查詢全部
		Query query=session.createQuery("select new Customer(id,name) from Customer");
		
		List<Customer> cs= query.list();
				
				for(Customer c:cs){
					System.out.println(c);
				}
				
		session.getTransaction().commit();
		session.close();
	}
		
	//條件查詢--使用?佔位符
		@Test
		public void hqlTest5(){
			Session session =HibernateUtils.getSession();
			session.beginTransaction();
			
			//查詢全部
			Query query=session.createQuery("from Customer where name=?");
			
			query.setParameter(0, "李四");
			
			List<Customer> cs= query.list();
					
					for(Customer c:cs){
						System.out.println(c);
					}
					
			session.getTransaction().commit();
			session.close();
		}
		
	//條件查詢--
			@Test
			public void hqlTest6(){
				Session session =HibernateUtils.getSession();
				session.beginTransaction();
				
				//查詢全部
				Query query=session.createQuery("from Customer where name=:name");
				
				query.setParameter("name", "李四");
				List<Customer> cs= query.list();
						
						for(Customer c:cs){
							System.out.println(c);
						}
						
				session.getTransaction().commit();
				session.close();
			}
				
}

 

 

2.session.createSQLQuery(String sql);

預設情況

SQLQuery query = session.createSQLQuery ("select * from customer");

List<Obiect[]> list = query.list();

 

要封裝到一個指定物件中;

SQLQuery query = session.createsQLQuery ("select * from customer");

query.addEntity (Customer.class); //將查詢結果封裝到customer物件中

List<Customer> list = query.list();

3.session.createCriteria(Object);

獲取Criteria criteria = session.createCriteria (customer.class) ;

1.查詢全部

  • criteria.list();

2·只返回一個值

  • criteria.uniqureResult();

3.條件查詢

  • criteria.add(Criterion c);
  • criterion獲取方式---->Restrictions.xxx(1);

4.分頁

  • setFirstResult();     從第幾條記錄開始查詢
  • setMaxResult ();     查詢幾條記錄
package com.qwl.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.qwl.domain.Customer;

import utils.HibernateUtils;

public class QBCTest {
	//查詢所有的值
	@Test
	public void qbcTest1(){
		Session session =HibernateUtils.getSession();
		
		session.beginTransaction();
		
		Criteria criteria =session.createCriteria(Customer.class);
		List<Customer> cs =criteria.list();
		
		for (Customer c:cs){
			System.out.println(c);
		}
		session.getTransaction().commit();
		session.close();
				
	}
	
//只返回一個值
	@Test
	public void qbcTest2(){
		Session session =HibernateUtils.getSession();
		
		session.beginTransaction();
		
		Criteria criteria =session.createCriteria(Customer.class);

		criteria.add(Restrictions.eq("id", 1)).add(Restrictions.eq("name", "李四"));
		//criteria.add(Restrictions.and(Restrictions.eq("id", 1), Restrictions.eq("name", "李四")));
		
		Customer c=(Customer)criteria.uniqueResult();
		
		System.out.println(c);
		
		session.getTransaction().commit();
		session.close();
				
	}
	
//where id=1 or name="李四"
	@Test
	public void qbcTest3(){
		Session session =HibernateUtils.getSession();
		
		session.beginTransaction();
		
		Criteria criteria =session.createCriteria(Customer.class);

		criteria.add(Restrictions.or(Restrictions.eq("id", 1), Restrictions.eq("name", "李四")));
		List<Customer> cs =criteria.list();
				
				for (Customer c:cs){
					System.out.println(c);
				}
		
		session.getTransaction().commit();
		session.close();
				
	}
	
//分頁
	@Test
	public void qbcTest4(){
		Session session =HibernateUtils.getSession();
		
		session.beginTransaction();
		
		Criteria criteria =session.createCriteria(Customer.class);

		criteria.setFirstResult(2);
		criteria.setMaxResults(3);
		
		List<Customer> cs =criteria.list();
				
				for (Customer c:cs){
					System.out.println(c);
				}
		
		session.getTransaction().commit();
		session.close();
				
	}
}