一.批量插入余黎,使用for循環(huán)可以方便的批量插入
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
for (int i = 0; i < 10; i++) {
Product p = new Product();
p.setName("iphone"+i);
p.setPrice(i);
s.save(p);
}
s.getTransaction().commit();
s.close();
sf.close();
二.對象狀態(tài)
瞬時:指的是沒有和hibernate發(fā)生任何關(guān)系,在數(shù)據(jù)庫中也沒有對應(yīng)的記錄懂傀,一旦JVM結(jié)束,這個對象也就消失了
持久: 指得是一個對象和hibernate發(fā)生聯(lián)系句旱,有對應(yīng)的session,并且在數(shù)據(jù)庫中有對應(yīng)的一條記錄
脫管:指的是一個對象雖然在數(shù)據(jù)庫中有對應(yīng)的一條記錄抡驼,但是它所對應(yīng)的session已經(jīng)關(guān)閉了
Product p = new Product();
p.setName("p1");
System.out.println("此時p是瞬時狀態(tài)");
s.save(p);
System.out.println("此時p是持久狀態(tài)");
s.getTransaction().commit();
s.close();
System.out.println("此時p是脫管狀態(tài)");
三.通過id獲取對象
Product p =(Product) s.get(Product.class, 6);
//需要傳遞一個類對象鬼廓,畢竟需要知道獲取的是哪個對象
//除了get之外還可以使用load獲取對象
System.out.println("id=6的產(chǎn)品名稱是: "+p.getName());
四.根據(jù)id把對象刪除掉
注意:hibernate在刪除一條數(shù)據(jù)之前,先要通過id把這條記錄取出來
Product p =(Product) s.get(Product.class, 5);
s.delete(p);
五.修改一個對象的屬性致盟,并更新到數(shù)據(jù)庫
Product p =(Product) s.get(Product.class, 6);//根據(jù)id獲取該對象
System.out.println(p.getName());
p.setName("iphone-modified");
//修改該對象的屬性
s.update(p);
//通過session的update方法把變化更新到數(shù)據(jù)庫中
六.HQL(Hibernate Query Language)
hibernate專門用于查詢數(shù)據(jù)的語句
有別于SQL碎税,HQL更接近面向?qū)ο蟮乃季S方式
String name = "iphone";
Query q =s.createQuery("from Product p where p.name like ?");
//注意前面沒有select *,不需要,用的是類名Product而不是表product_
//首先根據(jù)hql創(chuàng)建一個Query對象
q.setString(0, "%"+name+"%");
//設(shè)置參數(shù)馏锡,這里基0,根據(jù)name進(jìn)行模糊查詢
List<Product> ps= q.list();
//通過Query對象的list()方法即返回查詢的結(jié)果了
for (Product p : ps) {
System.out.println(p.getName());
}
七.Criteria進(jìn)行數(shù)據(jù)查詢
完全是面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)查詢
將不再看到有sql語句的痕跡
String name = "iphone";
Criteria c= s.createCriteria(Product.class);
//1. 通過session的createCriteria創(chuàng)建一個Criteria 對象
c.add(Restrictions.like("name", "%"+name+"%"));
//2. Criteria.add 增加約束雷蹂。 在本例中增加一個對name的模糊查詢(like)
List<Product> ps = c.list();
//3. 調(diào)用list()方法返回查詢結(jié)果的集合
for (Product p : ps) {
System.out.println(p.getName());
}
除此之外,Criteria還可以很方便的進(jìn)行分頁查詢和獲取總數(shù)
八.標(biāo)準(zhǔn)SQL查詢
多表聯(lián)合查詢并且有分組統(tǒng)計函數(shù)的情況下效率較高
String name = "iphone";
String sql = "select * from product_ p where p.name like '%"+name+"%'";
Query q= s.createSQLQuery(sql);
//使用Session的createSQLQuery方法執(zhí)行標(biāo)準(zhǔn)SQL語句
List<Object[]> list= q.list();
//因為標(biāo)準(zhǔn)SQL語句有可能返回各種各樣的結(jié)果
//比如多表查詢杯道,分組統(tǒng)計結(jié)果等等匪煌。
//不能保證其查詢結(jié)果能夠裝進(jìn)一個Product對象中
//所以返回的集合里的每一個元素是一個對象數(shù)組
//然后再通過下標(biāo)把這個對象數(shù)組中的數(shù)據(jù)取出來。
for (Object[] os : list) {
for (Object filed: os) {
System.out.print(filed+"\t");
}
System.out.println();
}