Hibernate的核心API
目錄
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();
}
}