1. 程式人生 > >hibernate的CRUD,持久化物件,一級快取

hibernate的CRUD,持久化物件,一級快取

CRUD

由於載入配置檔案等都是一樣的,所以提取工具類

public class HibernateUtils {

	public static final Configuration  configuration;
	public static final SessionFactory sessionFactory;
	static{
		configuration = new Configuration().configure();
		sessionFactory = configuration.buildSessionFactory();
	}
	public static Session openSession(){
		return sessionFactory.openSession();
	}
}

 查詢:

//查詢
public void demo1(){
		
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		/**
		 * get方法:
		 * 		1.採用的立即載入,執行到這行程式碼時立馬傳送sql語句去查詢
		 * 		2.返回真實物件本身
		 * 		3.查詢找不到物件時,返回null;
		 * load方法:
		 * 		1.採用延遲載入(懶載入),執行這行程式碼時不載入,真正使用時才載入
		 * 		2.返回代理的物件,javassist-3.18.1-GA.jar利用javassist技術產生的代理
		 *		3.查詢找不到物件時,返回ObjectNotFoundException
		 */
		
		//使用get方法進行查詢
		Customer customer = session.get(Customer.class, 2l);//Customer的id是long型別,所以這裡加l
		
		
		//使用load方法查詢
//		Customer customer = session.load(Customer.class, 2l);//l是long型別
//		System.out.println(customer);
		
		//事務提交
		transaction.commit();
		session.close();
	}

修改:

public void demo2(){
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		//直接建立物件,進行修改
//		Customer customer = new Customer();
//		customer.setCust_id(3l);
//		customer.setCust_name("cnm");
//		session.update(customer);
		
		//先查詢再修改
		Customer customer = session.get(Customer.class,3l);
		customer.setCust_name("mnc");
		session.update(customer);
		
		transaction.commit();
		session.close();
	}

刪除:

public void demo3(){
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		//直接建立再刪除
//		Customer customer = new Customer();
//		customer.setCust_id(3l);
//		session.delete(customer);
		
		//先查詢再刪除
		Customer customer = session.get(Customer.class, 3l);
		session.delete(customer);
		
		
		transaction.commit();
		session.close();
	}

增加:

public void demo4() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();

		Customer customer = new Customer();
		customer.setCust_name("123");
		session.save(customer);

		transaction.commit();
		session.close();
	}

查詢所有:

public void demo5(){
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		//接受HQL:Hibernate Query Language 面向物件查詢語言
//		Query query = session.createQuery(" from Customeer");
//		List<Customer> list = query.list();
//		for (Customer customer : list) {
//			System.out.println(customer);
//		}
		
		//接受SQL
		SQLQuery query = session.createSQLQuery("select * from cst_customer");
		List<Object []> list = query.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		
		transaction.commit();
		session.close();
	}

持久化物件

  1. Hibernate的持久化類的編寫規則
    1. 無引數構造
    2. 屬性私有
    3. 屬性儘量使用包裝類
    4. 提供一個唯一OID與主鍵對應
    5. 不要使用final修飾

hibernate中持久化物件的三種狀態:

public void demo(){
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer customer = new Customer();//瞬時態物件,沒有唯一標識id,沒有被session管理
		
		customer.setCust_name("zhangsan");
		Serializable id = session.save(customer);//持久態,被session管理有唯一標識oid
		
		System.out.println(customer);

		transaction.commit();
		session.close();  //session關閉,這之後沒有被session管理,屬於託管態
		
	}

可以根據三種狀態的條件進行相互轉化。

瞬時態物件:

  獲得:通過new得到的物件

瞬時轉持久:

                        session.save(Object obj)或session.saveOrUpdate(Object obj)

瞬時轉託管:

                                    給這個物件設定唯一標識id

持久態物件:

 獲得:session的get(),load(),find(),iterate()

持久轉瞬時:

                         session.delete()

持久轉託管:

                         session的close(),clear(),evicr(Object obj) 

託管態物件:

  獲得:     new一個物件後設置唯一標識id

託管轉持久:

                          session的update(),saveOrUpdate()

託管轉瞬時:

                          設定唯一標識id為null

一級快取 

一級快取就是指Session快取,在Session中定義了一系列的集合來儲存資料,它們構成了Session的快取。只要Session沒有關閉,它就會一直存在。當使用save()、get()、update()等進行操作時,就會將持久化物件儲存到Session中,當下一次再去查詢快取中具有的物件(通過OID值來判斷),就不會去從資料庫中查詢了,而是直接從快取中獲取。Hibernate的一級快取存在的目的就是為了減少對資料庫的訪問 是一種優化策略。(二級快取為SessionFactory快取,用redis後不考慮)

	public void demo(){
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer customer1 = new Customer();//傳送sql語句		
		customer1.setCust_name("cnm");
		
		Serializable id = session.save(customer1);
		
		Customer customer2 = session.get(Customer.class,id);//不傳送sql語句
		
		System.out.println(customer2.toString());
		

		transaction.commit();
		session.close();  
	}

一級快取常用的API:

  1. clear():清空一級快取。
  2. evict():清空一級快取中指定的某個物件。
  3. refresh():重新查詢資料庫,用資料庫中的資訊來更新一級快取與快照區。