hibernate分页和strtus标签显示分页超链接

第一种是单独使用hibernate的分页,从session中得到query接口,设置开始的结果集,和查询的个数,来分页。或者查询所有的结果集的list,采用list方法的截取功能。不过这种方法效率太低,根本不会是用这种方法。

public List<Student> findAll() {

          String hql = "FROM Student";

          Query q =HibernateUtils.getSession().createQuery(hql);

          List list = q.list();

       returnlist;

    }

public  List<Student> findByPage1(int pageNow) {

       List list = findAll();

          list = list.subList((pageNow-1)*pagesize),pageNow*pagesize);

       returnlist;

    }

 

    public List<Student> findByPage2(int pageNow) {

       List list = null;

          String hql = "FROM Student ";

          Query q =HibernateUtils.getSession().createQuery(hql);

          q.setFirstResult((pageNow-1)*pagesize);

           q.setMaxResults(pagesize);

          list = q.list();

       returnlist;

    }

 

这里一些代码示例中,为了代码简洁,有的地方就没判断了,比如最后一页显示不满足pagesize条数时候会报错,需要自己修改下代码。

 第二种是使用继承hibernateDAOSupport类来实现dao的方式,看到一篇很好描述HibernateDaoSupport类使用的例子,特此在这和大家分享一下

1、        继承了HibernateDaoSupport类的类获取session时,已不可用SessionFactory.OpenSessioon的形式来获 取Session了,由于HibernateDaoSupport本身已有获取session的方法getSession(),所以直接用Session se=this.getSession();来获取,

2、        在依据hql获取用户信息时,继承了HibernateDaoSupport类的类中不能在使用Query类了,而是用List<Ssh>  list = this.getHibernateTemplate().find(hql);形式来获取实体类集合

实例:

  1. public String print(int id) {  
  2.  
  3.        Session se =this.getSession();//获取Session对象 
  4.  
  5. String hql = "from Ssh where id=" + id;  
  6.  
  7.        //依据hql获取实体集合,此处不要用Query类来实现 
  8.  
  9.        List<Ssh> list = this.getHibernateTemplate().find(hql);  
  10.  
  11.        String a = list.get(0).getName();  
  12.  
  13.        return a;  
  14.  
  15.     }  

 第三种就是使用HibernateCallback 代码如下

public List findAllByPage( final int pageNow, final int pageSize){

List list = (List) getHibernateTemplate().execute(
             new HibernateCallback() {
                 int size=pageNow*pageSize-pageSize;
         public Object doInHibernate(Session session)
                 throws HibernateException {
             Query q =session.createQuery("from Author order by author_id");
              q.setFirstResult(size);
              q.setMaxResults(pageSize);
              List cats = q.list();
             return cats;
         }
     });//内部类,返回一个List
      return list;
     }

 

用Struts标签代替for循环的例子:

Java代码
  1. <s:bean name= "org.apache.struts2.util.Counter"id= "counter" >   
  2.   <s:param name="first" value="1" />   
  3.   <s:param name="last" value="10" />   
  4.   <s:iterator>   
  5.     counter:<s:property value="current-1"/>   
  6.   </s:iterator>   
  7. </s:bean>   

其中first属性指定循环起始值,last指定循环终止值,其它相关属性可以查看org.apache.struts2.util.Counter类源码。在下面迭代器中输入循环的当前值,即:current-1

 

这里是我分页的例子,需要的时候修改下使用:

<s:beanname="org.apache.struts2.util.Counter"id="counter">

   <s:paramname="first"value="1"/>

   <s:paramname="last"value="#request.pageNums"/>

    <s:iftest="#request.pageNow!=1"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageUp"/>">&lt;上一页</a></s:if>

   <s:iterator>

      <ahref="student/show?pageNow=<s:property/>">[<s:property/>]</a>

   </s:iterator>

    <s:iftest="#request.pageNow!=#request.pageNums"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageDown"/>">下一页&gt;</a></s:if>

</s:bean>

 

 

hibernate的部分知识:

 

添加ja项目对hibernate的支持就不详细说了,添加jar包,hibernate.xml的配置文件,POJO(javabean+bean.hbm.xml)

Hibernate的crud步骤:

得到configuration,得到sessionFactory,得到session,得到事物,crud操作,事物提交,关闭session。代码如下:

Configuration cfg = newConfiguration().configure();

       SessionFactorysf = cfg.buildSessionFactory();

       Sessionsession = sf.openSession();

       session.beginTransaction();

       session.save(u);

       session.getTransaction().commit();

       session.close();

如果要hibernate生成数据库表的话:

Configuration cfg = new Configuration().configure();

   SchemaExport se = new SchemaExport(cfg);

   se.create(true, true); 这样就能将数据库实体生成相应的表了。

 

这里也说下hibernate的实体的三种状态吧

瞬态:新建出来的实体的对象,没有存到数据库去,数据库中没有对应的实体记录。

持久态:存入数据库中,接受session的管理

游离态:由于session的关闭或者其他原因,脱离session的管理,但数据库中又相应的实体记录。

下面拿来一段网上的三张状态的描述:

Hibernate三种状态之一:临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;

Hibernate三种状态之二:持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

Hibernate三种状态之三:游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;



Hibernate
三种状态中游离对象和临时对象异同:

两者都不会被Session关联,对象属性和数据库可能不一致;

游离对象由持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;

Hibernate和SQL的关系:

在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库;

 

有时候面试笔试会问到或者考到这个问题。就是get()load()之间到底是什么区别。

   

 get(),采用get方法加载数据库中的数据,如果不存在,返回null

 load(),延迟加载,在执行load方法的时候不会发出sql语句,只是返回一个CGLIB代理对象,只有在真正第一次使用查询出对象的时候才发出SQL语句查询数据库;采用load方法加载数据库中的数据,如果不存在,则抛出异常

 

Query接口的使用:

1,Query查询所有记录:

 Query query = session.createQuery("fromUser");

 

2,Query的分页:      

 //设置从的几条开始查询

 query.setFirstResult(3);

 //设置查询多少条

 query.setMaxResults(2);

 

hibernate的实体类映射文件的配置主键:

<generator class="native" />设置主键的自动增长

    class="native/uuid/identity/sequence"

    native----Hibernate完成的数字自增1,2,3...

    uuid----生成一个32位的字符串

    identity----sqlserver的自增

    sequence----oracle的自增(1,2,...)

    assigned----手动分配主键

采用<composite-id></composite-id>设置联合主键

<property/>标签将普通属性映射成表字段

    name

    column

    length

    type(指定数据库中该字段的类型:一般情况下不需要指定)

    updatetrue|false  该字段不会出现在update的Sql语句中

    inserttrue|false

    unique 唯一性

    not-null 是否为空

实体类的设计原则(POJO):

    1,实现一个默认的无参的构造方法

    2,提供一个标识属性

    3,使用非final的类(影响预加载)

    4,为持久化字段声明访问器(提供get和set方法)

 

 

Struts标签代替for循环:

分页的例子:

<s:beanname="org.apache.struts2.util.Counter"id="counter">

   <s:paramname="first"value="1"/>

   <s:paramname="last"value="#request.pageNums"/>

    <s:iftest="#request.pageNow!=1"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageUp"/>">&lt;上一页</a></s:if>

   <s:iterator>

      <ahref="student/show?pageNow=<s:property/>">[<s:property/>]</a>

   </s:iterator>

    <s:iftest="#request.pageNow!=#request.pageNums"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageDown"/>">下一页&gt;</a></s:if>

</s:bean>

 

Hibernate的工具类

 

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

 

publicclass HibernateUtils {

 

    privatestatic Sessionsess =null;

    privatestatic SessionFactorysf = null;

    static {

        Configurationcfg = new Configuration().configure();

        sf = cfg.buildSessionFactory();

    }

    publicstatic Session getSession() {

        sess =sf.openSession();

        returnsess;

    }

   

    publicstaticvoid release(Object o){

        if(oinstanceof Session) {

            ((Session)o).close();

        }

        sf.close();

    }

}

 

 

Hibernate单独框架的crud和分页操作代码:

publicclass StudentDAOImpl{

 

    static Sessionsess =null;

   

    publicvoid add(Student s) {

       sess = HibernateUtils.getSession();

       sess.save(s);

       System.out.println("save(s)");

       HibernateUtils.release(sess);

    }

 

    publicvoid deleteBySno(String sno) {

       sess = HibernateUtils.getSession();

       Student s = (Student) sess.get(sno, Student.class);

       sess.delete(s);

       HibernateUtils.release(sess);

    }

 

    publicvoid deleteAll() {

       sess = HibernateUtils.getSession();

       Query query = sess.createQuery("fromStudent");

       Iterator iter = query.list().iterator();

       while(iter.hasNext()) {

           sess.delete(iter.next());

       }

       HibernateUtils.release(sess);

    }

 

    publicvoid edit(Student s) {

       sess = HibernateUtils.getSession();

       sess.update(s);

       HibernateUtils.release(sess);

    }

 

    public Student findByName(String name) {

       Student s = null;

       sess = HibernateUtils.getSession();

       Query query = sess.createQuery("fromStudent s where s.name = name");

       List list = query.list();

       Iterator iter = list.iterator();

       while(iter.hasNext()) {

           s = (Student) iter.next();

       }

       HibernateUtils.release(sess);

       return s;

    }

 

    public Student findBySno(String sno) {

       Student s = null;

       sess = HibernateUtils.getSession();

       Query query = sess.createQuery("fromStudent s where s.sno = sno");

       List list = query.list();

       Iterator iter = list.iterator();

       while(iter.hasNext()) {

           s = (Student) iter.next();

       }

       HibernateUtils.release(sess);

       return s;

    }

 

    publicstatic List<Student> findAll() {

       List list = null;

          String hql = "FROM Student ";

          Query q =HibernateUtils.getSession().createQuery(hql);

          list = q.list();

       returnlist;

    }

    publicstatic List<Student> findByPage(int pageNow) {

       List list = null;

          String hql = "FROM Student ";

          Query q =HibernateUtils.getSession().createQuery(hql);

         q.setFirstResult(pageNow*10);

           q.setMaxResults(pagesize);

          list = q.list();

       returnlist;

      

    }

    publicstaticint getRowNums() {

       returnfindAll().size();

    }

    staticintpagesize = 10;

    intRowNums ;

    intpageNums ;

 

    publicstaticint getPageNums() {

       returngetRowNums()/pagesize ==0?getRowNums()/pagesize:getRowNums()/pagesize+1;

    }

   

}

 

spring集成后的hibernate增删改查和分页:

publicclass StudentDAOImplextends HibernateDaoSupportimplements StudentDAO{

    privateintpagesize = 10;//每页显示十条,固定死

 

    publicint getRowNums() {//得到记录条数

       return findAll().size();

    }

 

    publicint getPageNums() {//得到页数

       return getRowNums()/pagesize ==0?getRowNums()/pagesize:getRowNums()/pagesize+1;

    }

 

    publicvoid add(Student s) {

       getHibernateTemplate().save(s);

    }

 

    publicvoid deleteBySno(String sno) {

       getHibernateTemplate().delete(findBySno(sno));

    }

 

    publicvoid deleteAll() {

       getHibernateTemplate().deleteAll(findAll());

    }

 

    publicvoid edit(Student s) {

       getHibernateTemplate().update(s);

    }

 

    public Student findByName(String name) {

       return (Student)getHibernateTemplate().find("from Student s where s.name = ?", name).get(0);

    }

 

    public Student findBySno(String sno) {

       return (Student)getHibernateTemplate().find("from Student s where s.sno = ?", sno).get(0);

    }

 

    public List<Student> findAll() {

       return(List<Student>)getHibernateTemplate().find("from Student");

    }

   

    public List<Student> findByPage(int pageNow) {

       List list = null;

          String hql = "FROM Student ";

          Session session=this.getSession();

          Query query =session.createQuery(hql);

         

         query.setFirstResult((pageNow-1)*pagesize);

          if(pageNow==getPageNums()){

              query.setMaxResults(getRowNums()-(pageNow-1)*pagesize);

           } else {

              query.setMaxResults(pagesize);

           }

          list = query.list();

          session.close();

       returnlist;

      

    }

   

 

/*  public  List<Student>findByPage(finalint pageNow) {

       return this.getHibernateTemplate().executeFind(newHibernateCallback() {

 

           public Object doInHibernate(Session session)

                  throws HibernateException, SQLException {

              String hql = "from Student";

              Query query = session.createQuery(hql);

              query.setFirstResult((pageNow-1)*pagesize);

              if(pageNow==getPageNums()) {

                  query.setMaxResults(getRowNums()-(pageNow-1)*pagesize);

              } else {

                  query.setMaxResults(pagesize);

              }

              List list = query.list();

             

              return list;

           }

       });

    }*/

 

 

    /*public List<Student> findByPage(int pageNow) {

       List list = findAll();

      

       if(pageNow==getPageNums()) {

           list = list.subList(pageNow*10-9, getRowNums()-1);

       } else {

           list = list.subList(pageNow*10-9,pageNow*10);

       }

       return list;

    }*/

   

 

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值