昨天的作业  分页:

主要的代码块:(明天实现分页的封装)

 package com.cy.beans;

 import java.util.List;

 /**
* 定义一个分页对象
* @author acer
*
*/
public class Pager { private int page;//当前页码
private int pageTotal;//总页码
private int rowsTotal;//总条数
private int rows;//每页显示条数
private String hql;//分页语句
private List<?> list;//返回的数据集合 public Pager() {
super();
} public String getHql() {
return hql;
} public void setHql(String hql) {
this.hql = hql;
} public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageTotal() {
return pageTotal;
}
public void setPageTotal(int pageTotal) {
this.pageTotal = pageTotal;
}
public int getRowsTotal() {
return rowsTotal;
}
public void setRowsTotal(int rowsTotal) {
this.rowsTotal = rowsTotal;
pageTotal = rowsTotal%rows==0 ? rowsTotal/rows : rowsTotal/rows+1;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
} @Override
public String toString() {
return "Pager [list=" + list + ", page=" + page + ", pageTotal="
+ pageTotal + ", rows=" + rows + ", rowsTotal=" + rowsTotal
+ "]";
} }

UserDaoImpl.java中的分页方法代码:

 public Pager pagerff(Pager p, Map<String, Object> pram) {
Session session = null;
Transaction tx = null;
try {
session=HibernateUtils.getSessionFactory().openSession();
tx=session.beginTransaction();
String hql=p.getHql();//获取查询语句
Query query= session.createQuery(hql).setCacheable(true);
//设置参数
query.setProperties(pram);
//查询具体数据
int count=query.list().size();
p.setRowsTotal(count);
int nowPage=1;
if(p.getPage()>0){
nowPage=p.getPage();
}
//指定从那个对象开始查询,参数的索引位置是从0开始的,
query.setFirstResult((p.getPage()-1)*p.getRows());
//分页时,一次最多产寻的对象数
query.setMaxResults(p.getRows());
List<?> list1=query.list();
p.setList(list1);
tx.commit(); } catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
return p;
}

这个分页里主要使用了两个方法。

setFirstResult():设置从哪条数据开始查询的(分页的索引是从0开始的);
setProperties():设置每页显示的条数。

hibernate查询实现

 hibernate中查询对象的方式有:OID查询,HQL查询,标准对象(条件)查询,本地sql查询。

使用例子UserBean.java

 package com.cy.beans;

 import java.io.Serializable;

 public class UserBean implements Serializable  {

     private static final long serialVersionUID = 1L;

     private Integer id;
private String userName;
private String password;
public UserBean() {
super();
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserBean [id=" + id + ", userName=" + userName + ", password="
+ password + "]";
} }

先要定义IUserDao.java的接口。

一:OID查询:就是根据对象的id来查询(主要看看UserDaoImpl.java中实现的方法)

 public UserBean getUser(Class<?> cls, Serializable pk) {
// Class<?> cls 泛型,表示某一类的Object。
Session session = null;//获得session
Transaction tx = null;//事务
UserBean user=null; //对象
try {
session=HibernateUtils.getSessionFactory().openSession();
tx=session.beginTransaction();//开启事务
user=(UserBean)session.get(cls, pk);//查询 这里的pk指的就是id
tx.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
tx.rollback();//回滚事务
}finally{
session.close();//关闭session
}
return user;
}

二:HQL查询:

hql(Hibernate Query Language)是一种面向对象的查询语言。也是在Hibernate应用最广的一种查询方式。

完整的HQL语法:

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

示例1:

UserDaoImpl.java

 public List<?> findUser(String sql, Map<String, Object> pram) {
Session session = null;
Transaction tx = null;
List<?> list=null;
try {
session=HibernateUtils.getSessionFactory().openSession();
tx=session.beginTransaction();
Query query= session.createQuery(sql).setCacheable(true);
String userName=pram.get("userName").toString();
String password=pram.get("password").toString();
query.setString("userName", '%'+userName+'%');
query.setString("password",password);
list=query.list();
tx.commit(); } catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
return list;
}

UserServerImpl.java

 @Override
public List<?> findUser(Map<String,Object>pram) {
//模糊查询
String hql="from UserBean where 1=1 and userName like :userName and password =:password";
return iusUserDao.findUser(hql, pram);
}

示例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

 @Override
public List<?> findUser(Class<?> cls, String userName) {
Session session = null;
Transaction tx = null;
List<?> list=null;
try {
session=HibernateUtils.getSessionFactory().openSession();
tx=session.beginTransaction();
//通过session的createCriteria()方法创建Criteria对象
Criteria criteria = session.createCriteria(cls);
//设定查询条件
//(String propertyName, String value, MatchMode matchMode)
/* MatchMode.START:字符串在最前面的位置.相当于"like 'value%'"
MatchMode.END:字符串在最后面的位置.相当于"like '%value'"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%value%'"
MatchMode.EXACT:字符串精确匹配.相当于"like 'value'" */
criteria.add(Restrictions.like("userName", userName, MatchMode.ANYWHERE));
//调用Criteria类的list()方法执行查询
list = criteria.list();
tx.commit(); } catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
return list;
}

通过以上可以看出使用这个方法来查询数据有个局限就是要在session的条件下才可以。所以我们通常是使用离线条件查询

离线条件查询:DetachedCriteria(离线条件查询),可以脱离Session对象单独存在。(在项目中也多用离线条件查询)。

示例:

 @Override
public List<?> findUser(Class<?> cls, String userName) {
Session session = null;
Transaction tx = null;
List<?> list=null;
try {
session=HibernateUtils.getSessionFactory().openSession();
tx=session.beginTransaction();
DetachedCriteria dc=DetachedCriteria.forClass(cls);
//创建条件查询
dc.add(Restrictions.eq("userName", "kitty"));
//绑定当前的session
Criteria c=dc.getExecutableCriteria(session);
list=c.list();
tx.commit(); } catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
return list;
}

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();

Hibernate 分页 查询的更多相关文章

  1. Hibernate分页查询小结

    通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE 是最简单的,但是功能也是最弱的,QBE的功能不是特别强大, ...

  2. Hibernate分页查询的两个方法

    Hibernate中HQL查询语句有一个分页查询, session.setMaxResult(参数)和session.setFirstResult(参数) 如果只设置session.setMaxRes ...

  3. hibernate分页查询的各种方法

    统计总数: public Integer countAll1() { String hql = "select count(*) from News as news"; List ...

  4. hibernate分页查询的实现

    在mysql中新建数据好USER表,字段有3个,分别是id.username.password,贴上脚本仅供参考     create table `ding`.`user`(         `id ...

  5. [Hibernate] 分页查询

    @Test public void test9(){ //根据部门编号进行分组,再根据每个部门总工资>5000 Session ss=HibernateUtil.getSession(); St ...

  6. Hibernate分页查询报错

    不知道什么原因,就是这里报错的

  7. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  8. Hibernate分页功能数据重复问题

    今天遇到一个很憋屈的问题那就是hibernate分页查询中出现重复数据,本来一直没有在意,以为是数据问题,但是一查程序和数据都没有问题,继续深入查看,找到问题了就是order By 时出的问题,唉.. ...

  9. 用Hibernate和Struts2+jsp实现分页查询、修改删除

    1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...

随机推荐

  1. 前端开发 - jQuery

    本节内容 一.jQuery概述 二.选择器 三.操作DOM 四.修改DOM结构 五.事件 六.动画 七.AJAX(待续) 八.扩展(待续) 一.jQuery概述 jQuery 是一个 JavaScri ...

  2. DOS和批处理基本命令

    http://www.cnblogs.com/leizhao/archive/2013/03/07/2949026.html 1.rem和:: rem注释命令,该命令后的内容不被执行,但能回显 ::注 ...

  3. [Proposal]MyTools

    [名称]:MyTools [需求分析]:现在市场上常用的移动端工具类APP,要么功能单一,如手电筒,录音机,指南针等,要么虽然有多种功能的整合,但只是单一的堆砌,内部依然是一个个独立的功能模块,并未形 ...

  4. Maven的阿里云镜像

    打开“Maven安装目录/conf/settings.xml”文件,找到<mirrors>节点,添加: <mirror> <id>nexus-aliyun</ ...

  5. 剑指offer编程题Java实现——面试题4后的相关题目

    题目描述: 有两个排序的数字A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的. 还是利用从后向前比较两个数组中的数字的方式来 ...

  6. ASP.NET CORE之上传文件夹

    最近闲余时间在做一个仿百度网盘的项目,其中就有一个上传文件夹的功能.查了下网上好像对这个问题的描述比较少,所以在此记录一下. 1.网上找来找去发现webkitdirectory这个东西,H5的一个新的 ...

  7. apache ab

    ab -p postfile.json -T 'application/json' -n 100 -c 10 -v 2 http://192.168.1.103:3002/checkStashSlot ...

  8. Postgres 的 Range 类型

    mysql 不支持 Range 类型 零.介绍 1. 适用场景: a.可以用于实现 是否满足薪资需求 的功能 b.可以用于实现 是否符合上线时间 的功能 一.定义 1.类型范围 Postgres Se ...

  9. django基础之二

    一.什么是架构? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的We ...

  10. 02-01 Java关键字、标识符、注释、常量和进制问题、变量和数据类型

    1:关键字 (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这样的高级记事本会对关键字有特殊颜 ...