首先拿到session
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
//hibernate3
SessionFactory sf = cfg.buildSessionFactory();
//open
Session session = sf.openSession();//管理對象的
session可以開啓提交事務:
session.beginTransaction();//開啓事務
session.getTransaction().commit();//提交 正式進庫
1. 唯一標識OID的檢索方式 (基礎)
* session.get(對象.class,OID)Employee emp = (Employee) session.get(Employee.class, 7788);
session.load(對象.class)
Employee emp3=(Employee)session.load(Employee.class, 6000)
System.out.println(emp3.getEmpno()); //拿主鍵時,不查庫,不發sql
System.out.println(emp3.getEname()); //拿 非主鍵時,才查庫
2. HQL的檢索方式 (重要)
* HQL(Hibernate Query Language) 是面向對象的查詢語言, 它和 SQL 查詢語言有些相似
* 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式
HQL與SQL的關係
* HQL 查詢語句是面向對象的,Hibernate負責解析HQL查詢語句, 然後根據對象-關係映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應的 SQL 語句.
* HQL 查詢語句中的主體是域模型中的類及類的屬性
* SQL 查詢語句是與關係數據庫綁定在一起的. SQL查詢語句中的主體是數據庫表及表的字段
3. QBC的檢索方式(重要)
* Query By Criteria -- 條件查詢
(1)查所有: Criteria crt = session.createCriteria(Employee.class);
List<Employee> list = crt.list();//查所有
(2)crt.addOrder(Order.desc("ename"));//排序
(3)多條件
Criteria crt= session.createCriteria(Employee.class);
//排序
crt.addOrder(Order.desc("ename"));//根據員工姓名倒排
//條件
crt.add(Restrictions.like("ename", "%A%"));
crt.add(Restrictions.gt("sal", new Double(1500)));//1500D
//分頁
crt.setFirstResult(0);
crt.setMaxResults(3);
* 條件查詢使用Criteria接口的add方法,用來傳入條件。
* 使用Restrictions的添加條件的方法,來添加條件,例如:
* Restrictions.eq -- 相等
* Restrictions.gt -- 大於號
* Restrictions.ge -- 大於等於
* Restrictions.lt -- 小於
* Restrictions.le -- 小於等於
* Restrictions.between -- 在之間
* Restrictions.like -- 模糊查詢
* Restrictions.in -- 範圍
* Restrictions.and -- 並且
* Restrictions.or -- 或者
(4)
// HQL帶Criterion條件的查詢
Criteria crtr = session.createCriteria(Product.class);
// like
crtr.add(Restrictions.like("productCode", "%10%"));
// sal>1500
crtr.add(Restrictions.gt("unitPrice", new Double(5)));
crtr.createAlias("category", "categoryT");//添加關聯表條件前置條件
//可以通過配置第3個參數,增加來改變hibernate的連接行爲
//crtr.createAlias("dept", "dept1",Criteria.LEFT_JOIN);
//增加分類名稱 like 果
crtr.add(Restrictions.like("categoryT.categoryName", "%果%"));//添加關聯表條件3
List<Product> ps = crtr.list();
4. 對象的導航的方式
如果一個表中包含了另外一個表的主鍵,創建該表對應的實體類的時候,其外鍵對應的屬性爲另外一個表的id對應的實體。
(不清不楚的)
5. SQL檢索方式(瞭解)
基本語法
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_linkman where lkm_gender = ?");
sqlQuery.setParameter(0,"男");
sqlQuery.addEntity(Linkman.class);
List<Linkman> list = sqlQuery.list();
System.out.println(list);
tr.commit();
1. HQL基本的查詢格式
* 支持方法鏈的編程,即直接調用list()方法
* 簡單的代碼如下
* session.createQuery("from Employee").list();
2. 使用別名的方式
* 可以使用別名的方式
* session.createQuery("from Employee c").list();
* session.createQuery("select c from Employee c").list();
3. 排序查詢
* 排序查詢和SQL語句中的排序的語法是一樣的
* 升序
* session.createQuery("from Employee order by ename asc").list();
* 降序
* session.createQuery("from Employee order by ename desc").list();
4. 分頁查詢
* Hibernate框架提供了分頁的方法,咱們可以調用方法來完成分頁
* 兩個方法如下
* setFirstResult(a) -- 從哪條記錄開始,如果查詢是從第一條開啓,值是0
* setMaxResults(b) -- 每頁查詢的記錄條數
* 演示代碼如下
* List<Employee> list = session.createQuery("from Employee").setFirstResult(0).setMaxResults().list();
5. 帶條件的查詢
* setParameter("?號的位置,默認從0開始","參數的值"); 不用考慮參數的具體類型
* 按位置綁定參數的條件查詢(指定下標值,默認從0開始)
* 按名稱綁定參數的條件查詢(HQL語句中的 ? 號換成 :名稱 的方式)
* 例如代碼如下
//1 按位置綁定參數
Query query4=session.createQuery("from Employee s where ename like ? and hiredate>?");
query4.setParameter(0, "%A%"); //?從0開始,不分類型
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date dd=null;
try {
dd=df.parse("1981-06-01");
} catch (ParseException e) {
e.printStackTrace();
}
query4.setParameter(1, dd); //傳java.util.date
List<Employee> lst4=query4.list();
for(Employee s:lst4){
System.out.println(s.getEname()+" "+s.getJob());
}
//2 按名稱綁定參數
Query query5=session.createQuery("from Employee s where ename like :name ");
query5.setParameter("name", "%A%"); //?從0開始,不分類型
List<Employee> lst5=query5.list();
for(Employee s:lst5){
System.out.println(s.getEname()+" "+s.getJob());
}
HQL的投影查詢
例子:TestHibernate3.java
1. 投影查詢就是想查詢某一字段的值或者某幾個字段的值
2. 投影查詢的案例
* 如果查詢多個字段,例如下面這種方式
String hql2="select empno,ename from Employee s where s.empno=7788";
Query query2=session.createQuery(hql2);
List<Object[]> lst2=query2.list();
for(Object[] s:lst2){
System.out.println(s[0]+" "+s[1]);
}
* 如果查詢兩個字段,也可以把這兩個字段封裝到對象中
* 先在持久化類中提供對應字段的構造方法
* 使用下面這種HQL語句的方式
String hql3="select new Employee(empno,ename) from Employee s where s.empno=7788";
Query query3=session.createQuery(hql3);
List<Employee> lst3=query3.list();
for(Employee s:lst3){
System.out.println(s.getEname());
}
HQL的聚合函數查詢
1. 獲取總的記錄數
Transaction tr = session.beginTransaction();
List<Number> list = session.createQuery("select count(c) from Employee c").list();
Long count = list.get(0).longValue();
System.out.println(count);
tr.commit();
2. 獲取某一列數據的和
Transaction tr = session.beginTransaction();
List<Number> list = session.createQuery("select sum(c.cust_id) from Employee c").list();
Long count = list.get(0).longValue();
System.out.println(count);
tr.commit();
三、 QBC檢索方式
0. QBC:Query By Criteria 按條件進行查詢
1. 簡單查詢,使用的是Criteria接口
List<Customer> list = session.createCriteria(Customer.class).list();
for (Customer customer : list) {
System.out.println(customer);
}
2. 排序查詢
* 需要使用addOrder()的方法來設置參數,參數使用org.hibernate.criterion.Order對象
* 具體代碼如下:
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(XXX.class);
// 設置排序
criteria.addOrder(Order.desc("lkm"));
List<XXX> list = criteria.list();
for (XXX s : list) {
System.out.println(s);
}
tr.commit();
3. 分頁查詢
* QBC的分頁查詢也是使用兩個方法
* setFirstResult();
* setMaxResults();
* 代碼如下:
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(XXX.class);
// 設置排序
criteria.addOrder(Order.desc("lkm"));
//分頁
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<XXX> list = criteria.list();
for (XXX s : list) {
System.out.println(s);
}
tr.commit();
4. 條件查詢(Criterion是查詢條件的接口,Restrictions類是Hibernate框架提供的工具類,使用該工具類來設置查詢條件)
* 條件查詢使用Criteria接口的add方法,用來傳入條件。
* 使用Restrictions的添加條件的方法,來添加條件,例如:
* Restrictions.eq -- 相等
* Restrictions.gt -- 大於號
* Restrictions.ge -- 大於等於
* Restrictions.lt -- 小於
* Restrictions.le -- 小於等於
* Restrictions.between -- 在之間
* Restrictions.like -- 模糊查詢
* Restrictions.in -- 範圍
* Restrictions.and -- 並且
* Restrictions.or -- 或者
* 測試代碼如下
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(XXX.class);
// 設置排序
criteria.addOrder(Order.desc("lkm"));
// 設置查詢條件
criteria.add(Restrictions.or(Restrictions.eq("gender", "男"), Restrictions.gt("lkm", 3L)));
criteria.add(Restrictions.like("name","%A%"));
List<XXX> list = criteria.list();
for (XXX s : list) {
System.out.println(s);
}
tr.commit();
5. 聚合函數查詢(Projection的聚合函數的接口,而Projections是Hibernate提供的工具類,使用該工具類設置聚合函數查詢)
* 使用QBC的聚合函數查詢,需要使用criteria.setProjection()方法
* 具體的代碼如下
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(XXX.class);
criteria.setProjection(Projections.rowCount());
List<Number> list = criteria.list();
Long count = list.get(0).longValue();
System.out.println(count);
tr.commit();
離線條件查詢
1). 離線條件查詢使用的是DetachedCriteria接口進行查詢,
離線條件查詢對象在創建的時候,不需要使用Session對象,
只是在查詢的時候使用Session對象即可。
2). 創建離線條件查詢對象
* DetachedCriteria criteria = DetachedCriteria.forClass(XXX.class);
具體的代碼如下
Transaction tr = session.beginTransaction();
DetachedCriteria criteria = DetachedCriteria.forClass(XXX.class);
// 設置查詢條件
criteria.add(Restrictions.eq("gender", "男"));
// 查詢數據
List<XXX> list = criteria.getExecutableCriteria(session).list();
for (XXX s : list) {
System.out.println(s);
}
tr.commit();