您的位置:首页 > 编程语言 > Java开发

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

2010-09-20 15:47 651 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: