Hibernate註意項
阿新 • • 發佈:2019-04-13
查詢 fig integer incr 需要 creat 檢測 查詢語句 持久 </generator>
Hibernate實體規則
1.持久化類提供無參數構造
2.成員變量私有,提供getset訪問,提供實行
3.持久化類屬性,盡量使用包裝類型
4.持久化類需要提供oid與數據庫中的主鍵列對應
5.不要使用final修飾class
實體類創建的註意事項
主鍵類型:
自然主鍵(少見):表的業務列中,有某項業務列符合,必須有,並且不重復的特征時,該列可以作為主鍵使用
代理主鍵(常見):創建一個無意義的列作為主鍵
主鍵生成策略:
<!-- generator 主鍵生成策略 identity:主鍵自增,由數據庫來維護主鍵值,錄入時不需要指定主鍵 increment(不用):主鍵自增,由hibernate來維護,每次插入會先查詢表中最大值,+1做為主鍵值(多人同時插入時會導致數據丟失) sequence:Oracle中的主鍵生成策略 hilo:高低位算法,數據庫屬性自增的算法,由hibernate來維護,與increment不一樣,這個hilo算法能夠保證數據庫主鍵永遠不一樣
native:hilo+sequence+identity三選一策略,檢測到非oracle支持主鍵自增,那選擇identity,檢測到是oracle,選擇sequence
自增的方法,hilo遇到不支持自增不支持sequence,市面目前沒有這種數據庫uuid:產生一個隨機字符串作為主鍵
-->
<generator class="native">
對象狀態:
對象分為三種狀態:
瞬時狀態:沒有id,沒有與session關聯
持久化狀態:有id,與session有關聯
托管狀態:有id,沒有與session關聯
package com.littlepage.state; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.littlepage.entity.Customer;public class Demo { public static void main(String[] args) { Configuration conf=new Configuration().configure(); SessionFactory sf=conf.buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); Customer cus=new Customer();//沒有id,沒有與session關聯=瞬時狀態 cus.setName("Poly");//瞬時 cus.setAge(15); session.save(cus);//持久化狀態 tx.commit(); session.close();//遊離狀態 sf.close(); } }
瞬時-->持久化-->托管
狀態流程
進階-一級緩存:
一級緩存提高數據庫操作的效率。
緩存:暫時存儲在內存上。第一次接觸是在IO流裏面,緩存的目的是為了提高效率。(預加載)
HQL查詢語句:
Configuration conf=new Configuration().configure(); SessionFactory sf=conf.buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); //1.書寫HQL語句 String hql="from Customer where age=15";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //3.返回list結果 List<Customer> list=query.list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); session.close();//遊離狀態 sf.close();
?占位符查詢
//1.書寫HQL語句 String hql="from Customer where age=?";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置參數 query.setInteger(0, 15);
命名占位符查詢
//1.書寫HQL語句 String hql="from Customer where age=:age";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置參數 query.setParameter("age", 15);
分頁查詢
//1.書寫HQL語句 String hql="from Customer";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置分頁信息 query.setFirstResult(3);//起始值索引 query.setMaxResults(2);//每頁的多少
Criteria查詢 Criteria criteria=session.createCriteria(Customer.class); List<Customer> list=criteria.list(); for (Customer customer : list) { System.out.println(customer); }
約束條件 Criteria criteria=session.createCriteria(Customer.class); criteria.add(Restrictions.eq("age", 12)); List<Customer> list=criteria.list(); for (Customer customer : list) { System.out.println(customer); }
聚合函數查詢
Criteria criteria=session.createCriteria(Customer.class); criteria.setProjection(Projections.rowCount()); Long count=(Long)criteria.uniqueResult(); System.out.println(count);
//原生SQL查詢 String sql="select * from t_customer"; SQLQuery query=session.createSQLQuery(sql); List<Object[]> list = query.list(); for (Object[] objects : list) { for (Object objects2 : objects) { System.out.print(objects2+"\t"); } System.out.println(); }
//原生SQL查詢2 String sql="select * from t_customer"; SQLQuery query=session.createSQLQuery(sql); query.addEntity(Customer.class); List<Customer> list=query.list(); for (Customer customer : list) { System.out.println(customer); }
分別在什麽情況下進行使用
HQL查詢:查詢多表查詢,不是復雜多表使用
Creteria查詢:單表查詢
SQL原生查詢:復雜的業務查詢
Hibernate註意項