作者:张纪豪(转载请注明出处)
(三)、数据访问层设计与数据分页
数据访问层的设计非常重要,在一个较大的项目中,应该利用泛型技术做一个公共数据访问组件,由于本主题要阐述的是分页,所以不搞那么复杂。也因如此,服务层内容也省掉。
在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两方法返回的就是一页的数据。
本文介绍了一个项目中数据访问层的设计方法,并通过具体示例展示了如何使用Hibernate进行数据分页,包括Book和News实体的分页操作。

被折叠的 条评论
为什么被折叠?



