作者:张纪豪(转载请注明出处)
(三)、数据访问层设计与数据分页
数据访问层的设计非常重要,在一个较大的项目中,应该利用泛型技术做一个公共数据访问组件,由于本主题要阐述的是分页,所以不搞那么复杂。也因如此,服务层内容也省掉。
在com.zhangjihao.dao包中建立两个接口和两个对应的实现类:
BookDao接口
package com.zhangjihao.dao;
import java.util.List;
import com.zhangjihao.bean.Page;
import com.zhangjihao.domain.Book;
public interface BookDao {
public abstract void save(Book book);
public abstract void update(Book book);
public abstract void delete(Book book);
public abstract Book getBook(Integer id);
//数据分页
public abstract List listAllBooks(Page page);
}
BookDaoImpl数据访问组件
package com.zhangjihao.dao; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import com.zhangjihao.bean.Page; import com.zhangjihao.domain.Book; @Repository("BookDao") //交给Spring管理 @Transactional //声明Spring管理事务 public class BookDaoImpl implements BookDao { //在Spring容器里取得Hibernate的session工厂对象 @Resource protected SessionFactory sessionFactory; public void save(Book book) { sessionFactory.getCurrentSession().persist(book); } public void update(Book book) { sessionFactory.getCurrentSession().merge(book); } public void delete(Book book){ sessionFactory.getCurrentSession().delete(book); } public Book getBook(Integer id) { return (Book)sessionFactory.getCurrentSession().get(Book.class, id); } //数据分页 @SuppressWarnings("unchecked") public List listAllBooks(Page page) { Query query = sessionFactory.getCurrentSession().createQuery("select count(*) from Book"); //得到总记录并保存到page对象中 long l = (Long)query.uniqueResult(); page.setTotalCount((int)l); query = sessionFactory.getCurrentSession().createQuery("from Book"); //注意下面这个分页参数 query.setFirstResult(page.getFirst()).setMaxResults(page.getPageSize()).setFetchSize(page.getPageSize()); return query.list(); } }
NewsDao接口
package com.zhangjihao.dao; import java.util.List; import com.zhangjihao.bean.Page; import com.zhangjihao.domain.News; public interface NewsDao { public abstract void save(News news); public abstract void update(News news); public abstract void delete(News news); public abstract News getNews(Integer id); //数据分页 public abstract List listAllNews(Page page); }
NewsDaoImpl数据访问组件
package com.zhangjihao.dao; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.zhangjihao.bean.Page; import com.zhangjihao.domain.News; @Repository("NewsDao") //交给Spring管理 @Transactional //声明Spring管理事务 public class NewsDaoImpl implements NewsDao { @Resource protected SessionFactory sessionFactory; public void save(News news) { sessionFactory.getCurrentSession().save(news); } public void delete(News news) { sessionFactory.getCurrentSession().delete(news); } public void update(News news) { sessionFactory.getCurrentSession().merge(news); } public News getNews(Integer id) { return (News)sessionFactory.getCurrentSession().get(News.class, id); } public List listAllNews(Page page) { Query query = sessionFactory.getCurrentSession().createQuery("select count(*) from News"); //得到总记录并保存到page对象中 long l = (Long)query.uniqueResult(); page.setTotalCount((int)l); query = sessionFactory.getCurrentSession().createQuery("from News"); //注意下面这个分页参数 query.setFirstResult(page.getFirst()).setMaxResults(page.getPageSize()).setFetchSize(page.getPageSize()); return query.list(); } }
listAllBooks和listAllNews两方法返回的就是一页的数据。