zoukankan      html  css  js  c++  java
  • Hibernate 的复杂用法HibernateCallback

    HibernateTemplate还提供了一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式可通过如下两个方法完成:
    ● Object execute(HibernateCallback action)。
    ● List execute(HibernateCallback action)。
    这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装 Hibernate后灵活性不足的缺陷。
    HibernateCallback 是一个接口,该接口包含一个方法doInHibernate(org.hibernate. Session session),该方法只有一个参数Session。在开发中提供HibernateCallback实现类时,必须实现接口里包含的 doInHibernate方法,在该方法体内即可获得Hibernate Session的引用,一旦获得了Hibernate Session的引用,就可以完全以Hibernate的方式进行数据库访问。
    注意:doInHibernate方法内可以访问Session,该Session对象是绑定在该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证了对于复杂的持久层访问,依然可以使用Hibernate的访问方式。
    下面的代码对HibernateDaoSupport类进行扩展(虽然Spring 2.0的HibernateTemplate提供了一个分页方法setMaxResults,但仅此一个方法依然不能实现分页查询),这种扩展主要是为该类增加了3个分页查询的方法,分页查询时必须直接调用Hibernate的Session完成,因此,必须借助于HibernateCallBack的帮助。
    public class YeekuHibernateDaoSupport extends HibernateDaoSupport
    {
    /**
    * 使用hql 语句进行分页查询操作
    * @param hql 需要查询的hql语句
    * @param offset 第一条记录索引
    * @param pageSize 每页需要显示的记录数
    * @return 当前页的所有记录
    */
    public List findByPage(final String hql,
    final int offset, final int pageSize)
    {
    //HibernateDaoSupport已经包含了getHibernateTemplate()方法
    List list = getHibernateTemplate().executeFind(new
    HibernateCallback()
    {
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException
    //该方法体内以Hibernate方法进行持久层访问
    {
    List result = session.createQuery(hql)
    .setFirstResult(offset)
    .setMaxResults(pageSize)
    .list();
    return result;
    }
    });
    return list;
    }
    /**
    * 使用hql 语句进行分页查询操作
    * @param hql 需要查询的hql语句
    * @param value 如果hql有一个参数需要传入,value就是传入的参数
    * @param offset 第一条记录索引
    * @param pageSize 每页需要显示的记录数
    * @return 当前页的所有记录
    */
    public List findByPage(final String hql , final Object value ,
    final int offset, final int pageSize)
    {
    List list = getHibernateTemplate().executeFind(new
    HibernateCallback()
    {
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException
    {
    //下面查询的是最简单的Hiberante HQL查询
    List result = session.createQuery(hql)
    .setParameter(0, value)
    .setFirstResult(offset)
    .setMaxResults(pageSize)
    .list();
    return result;
    }
    });
    return list;
    }
    /**
    * 使用hql 语句进行分页查询操作
    * @param hql 需要查询的hql语句
    * @param values 如果hql有多个参数需要传入,values就是传入的参数数组
    * @param offset 第一条记录索引
    * @param pageSize 每页需要显示的记录数
    * @return 当前页的所有记录
    */
    public List findByPage(final String hql, final Object[] values,
    final int offset, final int pageSize)
    {
    List list = getHibernateTemplate().executeFind(new
    HibernateCallback()
    {
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException
    {
    Query query = session.createQuery(hql);
    for (int i = 0 ; i < values.length ; i++)
    {
    query.setParameter( i, values[i]);
    }
    List result = query.setFirstResult(offset)
    .setMaxResults(pageSize)
    .list();
    return result;
    }
    });
    return list;
    }
    }
    在上面的代码实现中,直接使用了getHibernateTemplate()方法,这个方法由Hibernate- DaoSupport提供。而YeekuHibernateDaoSupport是HibernateDaoSupport的子类,因此,可以直接使用该方法。
    当实现doInHibernate(Session session)方法时,完全以Hibernate的方式进行数据库访问,这样保证了Hibernate进行数据库访问的灵活性。
    注意:Spring提供的XxxTemplate和XxxCallBack互为补充,二者体现了Spring框架设计的用心良苦:XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷。
  • 相关阅读:
    tcp和udp的区别
    链路聚合配置
    TCP/IP协议
    ip数据报格式
    私有IP地址和公网IP地址
    ipconfig
    ipconfig
    命令更改ip地址2
    命令更改ip地址一
    路由器静态ip设置
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/5937588.html
Copyright © 2011-2022 走看看