虚拟数据层: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;
}
}
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;
}
}
相关文章推荐
- 虚拟数据层 Struts2、Hibernate、Spring整合的泛型DAO Version 2010.9.27
- Struts2、Hibernate、Spring整合的泛型DAO Version 2010.9.27
- Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术
- Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术
- spring2.5整合hibernate3.3的泛型Dao并加入spring jdbc的支持
- spring2.5整合hibernate3.3的泛型Dao并加入spring jdbc的支持
- Struts2_Spring_Hibernate整合及测试_4(标准)_通过反射获取泛型真实类型
- spring2.5整合hibernate3.3的泛型Dao并加入spring jdbc的支持
- spring2.5整合hibernate3.3的泛型Dao并加入spring jdbc的支持
- spring整合struts2和hibernate在删除关联数据的时候特别注意
- spring2.5整合hibernate3.3的泛型Dao并加入spring jdbc的支持
- Struts2-Spring3-Hibernate3整合开发
- SSH框架的整合详解(Struts2 + Spring + Hibernate)
- hibernate 与 spring整合,SessionFactory初始化hibernate,Session数据的增删改查
- Spring整合Struts2和Hibernate+Maven(一)之Maven项目创建
- 整合Struts2,Spring,Hibernate
- Struts2 Spring 整合, Spring 使用 configLocation属性 联接hibernate.cfg.xml 找到不Action
- Struts2与Spring、Hibernate三者整合的过程示例
- Spring3.x_Struts2.x_Hibernate3.x整合之OpenSessionInView的实现
- Struts2 + Hibernate+ Spring 整合过程经验