分頁:
主要的代碼塊:(明天實現分頁的封裝)
1 package com.cy.beans;
2
3 import java.util.List;
4
5 /**
6 * 定義一個分頁對象
7 * @author acer
8 *
9 */
10 public class Pager {
11
12 private int page;//當前頁碼
13 private int pageTotal;//總頁碼
14 private int rowsTotal;//總條數
15 private int rows;//每頁顯示條數
16 private String hql;//分頁語句
17 private List<?> list;//返回的數據集合
18
19
20 public Pager() {
21 super();
22 }
23
24 public String getHql() {
25 return hql;
26 }
27
28
29
30 public void setHql(String hql) {
31 this.hql = hql;
32 }
33
34
35
36 public int getPage() {
37 return page;
38 }
39 public void setPage(int page) {
40 this.page = page;
41 }
42 public int getPageTotal() {
43 return pageTotal;
44 }
45 public void setPageTotal(int pageTotal) {
46 this.pageTotal = pageTotal;
47 }
48 public int getRowsTotal() {
49 return rowsTotal;
50 }
51 public void setRowsTotal(int rowsTotal) {
52 this.rowsTotal = rowsTotal;
53 pageTotal = rowsTotal%rows==0 ? rowsTotal/rows : rowsTotal/rows+1;
54 }
55 public int getRows() {
56 return rows;
57 }
58 public void setRows(int rows) {
59 this.rows = rows;
60 }
61 public List<?> getList() {
62 return list;
63 }
64 public void setList(List<?> list) {
65 this.list = list;
66 }
67
68
69 @Override
70 public String toString() {
71 return "Pager [list=" + list + ", page=" + page + ", pageTotal="
72 + pageTotal + ", rows=" + rows + ", rowsTotal=" + rowsTotal
73 + "]";
74 }
75
76
77 }
UserDaoImpl.java中的分頁方法代碼:
1 public Pager pagerff(Pager p, Map<String, Object> pram) {
2 Session session = null;
3 Transaction tx = null;
4 try {
5 session=HibernateUtils.getSessionFactory().openSession();
6 tx=session.beginTransaction();
7 String hql=p.getHql();//獲取查詢語句
8 Query query= session.createQuery(hql).setCacheable(true);
9 //設置參數
10 query.setProperties(pram);
11 //查詢具體數據
12 int count=query.list().size();
13 p.setRowsTotal(count);
14 int nowPage=1;
15 if(p.getPage()>0){
16 nowPage=p.getPage();
17 }
18 //指定從那個對象開始查詢,參數的索引位置是從0開始的,
19 query.setFirstResult((p.getPage()-1)*p.getRows());
20 //分頁時,一次最多產尋的對象數
21 query.setMaxResults(p.getRows());
22 List<?> list1=query.list();
23 p.setList(list1);
24 tx.commit();
25
26 } catch (Exception e) {
27 e.printStackTrace();
28 tx.rollback();
29 }finally{
30 session.close();
31 }
32 return p;
33 }
這個分頁里主要使用了兩個方法。
setFirstResult():設置從哪條數據開始查詢的(分頁的索引是從0開始的);
setProperties():設置每頁顯示的條數。
hibernate查詢實現
hibernate中查詢對象的方式有:OID查詢,HQL查詢,標准對象(條件)查詢,本地sql查詢。
使用例子UserBean.java
1 package com.cy.beans;
2
3 import java.io.Serializable;
4
5 public class UserBean implements Serializable {
6
7 private static final long serialVersionUID = 1L;
8
9 private Integer id;
10 private String userName;
11 private String password;
12 public UserBean() {
13 super();
14 }
15
16 public Integer getId() {
17 return id;
18 }
19
20 public void setId(Integer id) {
21 this.id = id;
22 }
23
24 public String getUserName() {
25 return userName;
26 }
27 public void setUserName(String userName) {
28 this.userName = userName;
29 }
30 public String getPassword() {
31 return password;
32 }
33 public void setPassword(String password) {
34 this.password = password;
35 }
36 @Override
37 public String toString() {
38 return "UserBean [id=" + id + ", userName=" + userName + ", password="
39 + password + "]";
40 }
41
42
43 }
先要定義IUserDao.java的接口。
一:OID查詢:就是根據對象的id來查詢(主要看看UserDaoImpl.java中實現的方法)
1 public UserBean getUser(Class<?> cls, Serializable pk) {
2 // Class<?> cls 泛型,表示某一類的Object。
3 Session session = null;//獲得session
4 Transaction tx = null;//事務
5 UserBean user=null; //對象
6 try {
7 session=HibernateUtils.getSessionFactory().openSession();
8 tx=session.beginTransaction();//開啟事務
9 user=(UserBean)session.get(cls, pk);//查詢 這里的pk指的就是id
10 tx.commit();//提交事務
11 } catch (Exception e) {
12 e.printStackTrace();
13 tx.rollback();//回滾事務
14 }finally{
15 session.close();//關閉session
16 }
17 return user;
18 }
二:HQL查詢:
hql(Hibernate Query Language)是一種面向對象的查詢語言。也是在Hibernate應用最廣的一種查詢方式。
完整的HQL語法:
Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc
示例1:
UserDaoImpl.java
1 public List<?> findUser(String sql, Map<String, Object> pram) {
2 Session session = null;
3 Transaction tx = null;
4 List<?> list=null;
5 try {
6 session=HibernateUtils.getSessionFactory().openSession();
7 tx=session.beginTransaction();
8 Query query= session.createQuery(sql).setCacheable(true);
9 String userName=pram.get("userName").toString();
10 String password=pram.get("password").toString();
11 query.setString("userName", '%'+userName+'%');
12 query.setString("password",password);
13 list=query.list();
14 tx.commit();
15
16 } catch (Exception e) {
17 e.printStackTrace();
18 tx.rollback();
19 }finally{
20 session.close();
21 }
22 return list;
23 }
UserServerImpl.java
1 @Override
2 public List<?> findUser(Map<String,Object>pram) {
3 //模糊查詢
4 String hql="from UserBean where 1=1 and userName like :userName and password =:password";
5 return iusUserDao.findUser(hql, pram);
6 }
示例2:(這個就直接寫了)
String hql="from UserBean as user where user.userName='kitty2'";
Query query=session.createQuery(hql);
List userList=query.list();
通過上面的例子可以看出HQL查詢的基本操作步驟為:
1 創建Query對象: Query query= session.createQuery(sql)
2 動態綁定參數
3 通過調用Query對象的list()方法執行查詢數據
注意:HQL語句本身大小寫無關,但是其中出現的類名和屬性名必須注意大小寫區分。
三:條件查詢:主要用了Criteria,Criterion接口,Expression和Restrictions類組成。
UserDaoImpl.java
1 @Override
2 public List<?> findUser(Class<?> cls, String userName) {
3 Session session = null;
4 Transaction tx = null;
5 List<?> list=null;
6 try {
7 session=HibernateUtils.getSessionFactory().openSession();
8 tx=session.beginTransaction();
9 //通過session的createCriteria()方法創建Criteria對象
10 Criteria criteria = session.createCriteria(cls);
11 //設定查詢條件
12 //(String propertyName, String value, MatchMode matchMode)
13 /* MatchMode.START:字符串在最前面的位置.相當於"like 'value%'"
14 MatchMode.END:字符串在最后面的位置.相當於"like '%value'"
15 MatchMode.ANYWHERE:字符串在中間匹配.相當於"like '%value%'"
16 MatchMode.EXACT:字符串精確匹配.相當於"like 'value'" */
17 criteria.add(Restrictions.like("userName", userName, MatchMode.ANYWHERE));
18 //調用Criteria類的list()方法執行查詢
19 list = criteria.list();
20 tx.commit();
21
22 } catch (Exception e) {
23 e.printStackTrace();
24 tx.rollback();
25 }finally{
26 session.close();
27 }
28 return list;
29 }
通過以上可以看出使用這個方法來查詢數據有個局限就是要在session的條件下才可以。所以我們通常是使用離線條件查詢
離線條件查詢:DetachedCriteria(離線條件查詢),可以脫離Session對象單獨存在。(在項目中也多用離線條件查詢)。
示例:
1 @Override
2 public List<?> findUser(Class<?> cls, String userName) {
3 Session session = null;
4 Transaction tx = null;
5 List<?> list=null;
6 try {
7 session=HibernateUtils.getSessionFactory().openSession();
8 tx=session.beginTransaction();
9 DetachedCriteria dc=DetachedCriteria.forClass(cls);
10 //創建條件查詢
11 dc.add(Restrictions.eq("userName", "kitty"));
12 //綁定當前的session
13 Criteria c=dc.getExecutableCriteria(session);
14 list=c.list();
15 tx.commit();
16
17 } catch (Exception e) {
18 e.printStackTrace();
19 tx.rollback();
20 }finally{
21 session.close();
22 }
23 return list;
24 }
Restrictions常用限定查詢方法:
Restrictions.eq 等於
Restrictions.allEq 使用Map,使用key/value進行多個等於的比對
Restrictions.gt 大於 >
Restrictions.ge 大於等於 >=
Restrictions.lt 小於 <
Restrictions.le 小於等於 <=
Restrictions.between 對應SQL的BETWEEN子句
Restrictions.like 對應SQL的LIKE子句
Restrictions.in 對應SQL的in子句
Restrictions.and and關系
Restrictions.or or關系
四:本地SQL查詢
對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。
String sql="select * from t_user";
SQLQuery query=session.createSQLQuery(sql);
query.addEntity(UserBean.class);
list=query.list();

