虚拟数据层:Struts2、Hibernate、Spring整合的泛型DAO

来源:互联网 发布:程序员打字都是盲打吗 编辑:程序博客网 时间:2024/05/21 19:41

Person.java:

     

      package com.yong.entity;

import org.apache.poi.hssf.model.Model;

public class Person implements Model
{
 private Integer id;
 
 private String name;
 
 private int age;

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }
}

 

Person.hbm.xml:

 

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
 <class name="com.yong.entity.Person" table="Person" lazy="false">
  <id name="id" column="id" type="java.lang.Integer">
   <generator class="native" />
  </id>
  <property name="name" type="java.lang.String" column="name" length="20" />
  <property name="age" type="java.lang.Integer" column="age" />
 </class>
</hibernate-mapping>

 

GenericDao:

 

    package org.csdn.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface GenericDao<T,ID extends Serializable>
{
 /**
     * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录.
     *
     * @param hql : 自定义的HQL语句
     */
 public void setHql(String hql);
 /**
     * 
     * @return 自定义的HQL语句
     */
 public String getHql();
 /**
     * 保存实体 
     *
     * @param entity :
     *               实体
     * @return 保存后得到的id
     */
 public ID save(T entity);
 /**
     * <p>
     * 删除实体
     * </p>
     *
     * @param entity :
     *               实体
     */
 public void remove(T entity);
 /**
     * <p>
     * 删除实体集合
     * </p>
     *
     * @param entities :
     *                 实体
     */
 public void removeAll(Collection<T> entities);
 /**
     * <p>
     * 修改实体
     * </p>
     *
     * @param entity :
     *               实体
     */
 public void modify(T entity);
 /**
     * <p>
     * 通过名字查找
     * </p>
     *
     * @param id :
     *           id
     * @return 找到的实体
     */
 public T findById(ID id);
 /**
     * <p/>
     * 查找全部实体
     * <p/>
     *
     * @return 所有实体的列表
     */
 public List<T> findAll();
 /**  
    * <p>  
    * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录  
    * </p>  
    *  
    * @return 记录总数  
    */
 public int getTotalRows();
 /**  
     * <p>  
     * 根据每页记录的数量,计算出总的分页数  
     * </p>  
     *  
     * @param size 每页记录的数量  
     * @return 分页总数  
     */
 public int getPageSize(int size);
 /**
     * <p/>
     * 根据给定的页码进行分页查找,这是纯Hibernate分页.
     * <p/>
     *
     * @param page : 要查询的页码
     *            
     * @param size : 每页记录数
     *            
     * @return 匹配的实体列表
     */
 public List<T> findByPage(final int page,final int size);
}

 

GenericDaoImpl:

 

    package org.csdn.dao.impl;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import org.csdn.dao.GenericDao;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class GenericDaoImpl<T,ID extends Serializable> implements GenericDao<T,ID> {
 
 // 具体的实体类型
 private Class<T> type;
 // Spring提供的Hibernate工具类
 private HibernateTemplate hibernateTemplate;
 // 查询条件
 private String hql;

 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }
 /**
     * <p>
     * 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型
     * <p>
     * 
     * @param type :
     *            实体类型
     */
 public GenericDaoImpl(Class<T> type)
 {
  this.type = type;
  this.hql = "from " + type.getName();
 }
 
 public GenericDaoImpl(HibernateTemplate hibernateTemplate)
 {
  this.hibernateTemplate = hibernateTemplate;
 }
 
 public List<T> findAll() {
  // TODO Auto-generated method stub
  return hibernateTemplate.find(hql);
 }

 public T findById(ID id) {
  // TODO Auto-generated method stub
  return (T) hibernateTemplate.get(type, id);
 }

 public List<T> findByPage(final int page,final int size) {
  // TODO Auto-generated method stub
  final int pageSize = this.getPageSize(size);
  final int totalRows = this.getTotalRows();
  return hibernateTemplate.executeFind(new HibernateCallback(){
   public List<T> doInHibernate(Session session)
    throws HibernateException, SQLException{
    //实际页码
    int actualPage = (page > pageSize)?pageSize:page;
    // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数
    int actualSize = (size > totalRows)?totalRows:size;
    // 计算请求页码的第一条记录的索引值
    int stateRow = (actualPage > 0)?(actualPage - 1)*actualSize : 0;
    Query query = session.createQuery(hql);
    // 设置第一条记录
    query.setFirstResult(stateRow);
    query.setMaxResults(actualSize);
    return query.list();
   }
  });
 }

 public String getHql() {
  // TODO Auto-generated method stub
  return hql;
 }

 public int getPageSize(int size) {
  // TODO Auto-generated method stub
  //最大页数
  int pageSize;
  //每页数据条数
  int actualSize;
  //总记录数
  int totalRows = this.getTotalRows();
  // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数
  actualSize = (size > totalRows)?totalRows:size;
  if(totalRows > 0)
  {
   pageSize = (totalRows % size == 0)?(totalRows / size):(totalRows / size + 1);
  }
  else
  {
   pageSize = 0;
  }
  return pageSize;
 }

 public int getTotalRows() {
  // TODO Auto-generated method stub
  String acHql = "select count(*) " + hql;
  return ((Long)hibernateTemplate.find(acHql).get(0)).intValue();
 }

 public void modify(T entity) {
  // TODO Auto-generated method stub
  hibernateTemplate.update(entity);
 }

 public void remove(Object entity) {
  // TODO Auto-generated method stub
  hibernateTemplate.delete(entity);
 }

 public void removeAll(Collection<T> entities) {
  // TODO Auto-generated method stub
  hibernateTemplate.deleteAll(entities);
 }

 public ID save(T entity) {
  // TODO Auto-generated method stub
  return (ID) hibernateTemplate.save(entity);
 }

 public void setHql(String hql) {
  // TODO Auto-generated method stub
  this.hql = hql;
 }

 public HibernateTemplate getHibernateTemplate() {
  return hibernateTemplate;
 }

}

 

GenericBiz:

 

    package org.csdn.biz;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface GenericBiz<T,ID extends Serializable>
{
 /**
  * 获取实体
  *
  * @param entity:
  *     实体
  */
 public void setP(Class p);
 /**
     * 保存实体 
     *
     * @param entity :
     *               实体
     * @return 保存后得到的id
     */
 public ID save(T entity);
 /**
     * <p>
     * 删除实体
     * </p>
     *
     * @param entity :
     *               实体
     */
 public void remove(T entity);
 /**
     * <p>
     * 删除实体集合
     * </p>
     *
     * @param entities :
     *                 实体
     */
 public void removeAll(Collection<T> entities);
 /**
     * <p>
     * 修改实体
     * </p>
     *
     * @param entity :
     *               实体
     */
 public void modify(T entity);
 /**
     * <p>
     * 通过名字查找
     * </p>
     *
     * @param id :
     *           id
     * @return 找到的实体
     */
 public T findById(ID id);
 /**
     * <p/>
     * 查找全部实体
     * <p/>
     *
     * @return 所有实体的列表
     */
 public List<T> findAll();
 /**  
    * <p>  
    * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录  
    * </p>  
    *  
    * @return 记录总数  
    */
 public int getTotalRows();
 /**  
     * <p>  
     * 根据每页记录的数量,计算出总的分页数  
     * </p>  
     *  
     * @param size 每页记录的数量  
     * @return 分页总数  
     */
 public int getPageSize(int size);
 /**
     * <p/>
     * 根据给定的页码进行分页查找,这是纯Hibernate分页.
     * <p/>
     *
     * @param page : 要查询的页码
     *            
     * @param size : 每页记录数
     *            
     * @return 匹配的实体列表
     */
 public List<T> findByPage(final int page,final int size);
}

 

GenericBizImpl:

 

    package org.csdn.biz.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.csdn.biz.GenericBiz;
import org.csdn.dao.GenericDao;

import com.yong.entity.Person;

public class GenericBizImpl<T,ID extends Serializable> implements GenericBiz<T,ID> {

 private GenericDao<T, ID> genericDao;
 
 private Class p;

 public Class getP() {
  return p;
 }

 public void setP(Class p) {
  this.p = p;
 }

 public List<T> findAll() {
  // TODO Auto-generated method stub
  genericDao.setHql("from " + p.getName());
  return genericDao.findAll();
 }

 public T findById(ID id) {
  // TODO Auto-generated method stub
  return genericDao.findById(id);
 }

 public List<T> findByPage(final int page,final int size) {
  // TODO Auto-generated method stub
  return genericDao.findByPage(page, size);
 }

 public int getPageSize(int size) {
  // TODO Auto-generated method stub
  return genericDao.getPageSize(size);
 }

 public int getTotalRows() {
  // TODO Auto-generated method stub
  return genericDao.getTotalRows();
 }

 public void modify(T entity) {
  // TODO Auto-generated method stub
  genericDao.modify(entity);
 }

 public void remove(T entity) {
  // TODO Auto-generated method stub
  genericDao.remove(entity);
 }

 public void removeAll(Collection<T> entities) {
  // TODO Auto-generated method stub
  genericDao.removeAll(entities);
 }

 public ID save(T entity) {
  // TODO Auto-generated method stub
  return genericDao.save(entity);
 }

 public void setGenericDao(GenericDao<T, ID> genericDao) {
  this.genericDao = genericDao;
 }
 
 

}