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();
}
持久化物件
- Hibernate的持久化類的編寫規則
- 無引數構造
- 屬性私有
- 屬性儘量使用包裝類
- 提供一個唯一OID與主鍵對應
- 不要使用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:
clear()
:清空一級快取。evict()
:清空一級快取中指定的某個物件。refresh()
:重新查詢資料庫,用資料庫中的資訊來更新一級快取與快照區。