Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术 一

[b]1.基本DAO泛型接口 [/b]


view plaincopy to clipboardprint?

package abu.csdn.dao;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* <p/>
* 使用泛型作为DAO的通用接口 这里没有提供按名称精确查找,和模糊查找 上述两个方法应该由各自的具体接口去定义
* <p/>
*
* @author Abu
* @param <T> :
* 持久化的实体Bean
* @param <ID> :
* 实体Bean的id
*/
public interface GenericDao<T, ID extends Serializable> {
/**
* 保存实体
*
* @param entity :
* 实体
* @return 保存后得到的id
*/
public ID save(T entity);
/**
* 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录.
*
* @param hql : 自定义的HQL语句
*/
public void setHql(String hql);
/**
*
* @return 自定义的HQL语句
*/
public String getHql();
/**
* <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 : 要查询的页码
* 查询的hql语句
* @param size : 每页记录数
* 分页信息,参见PageInfo
* @return 匹配的实体列表
*/
public List<T> findByPage(final int page, final int size);
}
package abu.csdn.dao; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * <p/> * 使用泛型作为DAO的通用接口 这里没有提供按名称精确查找,和模糊查找 上述两个方法应该由各自的具体接口去定义 * <p/> * * @author Abu * @param <T> : * 持久化的实体Bean * @param <ID> : * 实体Bean的id */ public interface GenericDao<T, ID extends Serializable> { /** * 保存实体 * * @param entity : * 实体 * @return 保存后得到的id */ public ID save(T entity); /** * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录. * * @param hql : 自定义的HQL语句 */ public void setHql(String hql); /** * * @return 自定义的HQL语句 */ public String getHql(); /** * <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 : 要查询的页码 * 查询的hql语句 * @param size : 每页记录数 * 分页信息,参见PageInfo * @return 匹配的实体列表 */ public List<T> findByPage(final int page, final int size); }


[b]2.基本DAO泛型接口的实现[/b]


view plaincopy to clipboardprint?

package abu.csdn.dao.impl;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import abu.csdn.dao.GenericDao;
/**
*
* @author Abu
*
* @param <T>
* @param <ID>
*/
public class GenericDaoImpl<T, ID extends Serializable> implements
GenericDao<T, ID> {
// 具体的实体类型
private Class<T> type;
// Spring提供的Hibernate工具类
private HibernateTemplate hibernateTemplate;
// 查询条件
private String hql;
/**
* <p>
* 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型
* <p>
*
* @param type :
* 实体类型
*/
public GenericDaoImpl(Class<T> type) {
this.type = type;
this.hql = "from " + type.getName();
}
/**
* <p>
* 因为这个类没有继承HibernateDaoSupport,所以现在由Spring注入HibernateTemplate
* </p>
*
* @param hibernateTemplate :
* Spring提供的Hibernate工具类
*/
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public void setHql(String hql) {
this.hql = hql;
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public String getHql() {
return hql;
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
String hql = "from " + type.getName();
return (List<T>) hibernateTemplate.find(hql);
}

@SuppressWarnings("unchecked")
public T findById(ID id) {
return (T) hibernateTemplate.get(type, id);
}
public void modify(T entity) {
hibernateTemplate.update(entity);
}
public void remove(T entity) {
hibernateTemplate.delete(entity);
}

public void removeAll(Collection<T> entities) {
hibernateTemplate.deleteAll(entities);
}
@SuppressWarnings("unchecked")
public ID save(T entity) {
return (ID) hibernateTemplate.save(entity);
}
public int getTotalRows() {
String actualHql = "select count(*) "
+ hql.substring(hql.indexOf("from"));
return ((Long) this.hibernateTemplate.find(actualHql).get(0))
.intValue();
}
public int getPageSize(int size) {
// 最大页数
int pageSize;
// 实际每页数据条数
int actualSize;
// 总记录数
int totalRows = this.getTotalRows();
// 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数
actualSize = (size > totalRows) ? totalRows : size;
if (totalRows > 0) {
pageSize = (totalRows % size == 0) ? (totalRows / actualSize)
: (totalRows / actualSize + 1);
} else {
pageSize = 0;
}
return pageSize;
}
@SuppressWarnings("unchecked")
public List<T> findByPage(final int page, final int size) {
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 startRow = (actualPage > 0) ? (actualPage - 1) * actualSize
: 0;
Query query = session.createQuery(hql);
// 设置第一条记录
query.setFirstResult(startRow);
query.setMaxResults(actualSize);
return (List<T>) query.list();
}
});
}
}
package abu.csdn.dao.impl; import java.io.Serializable; import java.sql.SQLException; import java.util.Collection; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; import abu.csdn.dao.GenericDao; /** * * @author Abu * * @param <T> * @param <ID> */ public class GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> { // 具体的实体类型 private Class<T> type; // Spring提供的Hibernate工具类 private HibernateTemplate hibernateTemplate; // 查询条件 private String hql; /** * <p> * 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型 * <p> * * @param type : * 实体类型 */ public GenericDaoImpl(Class<T> type) { this.type = type; this.hql = "from " + type.getName(); } /** * <p> * 因为这个类没有继承HibernateDaoSupport,所以现在由Spring注入HibernateTemplate * </p> * * @param hibernateTemplate : * Spring提供的Hibernate工具类 */ public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void setHql(String hql) { this.hql = hql; } public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public String getHql() { return hql; } @SuppressWarnings("unchecked") public List<T> findAll() { String hql = "from " + type.getName(); return (List<T>) hibernateTemplate.find(hql); } @SuppressWarnings("unchecked") public T findById(ID id) { return (T) hibernateTemplate.get(type, id); } public void modify(T entity) { hibernateTemplate.update(entity); } public void remove(T entity) { hibernateTemplate.delete(entity); } public void removeAll(Collection<T> entities) { hibernateTemplate.deleteAll(entities); } @SuppressWarnings("unchecked") public ID save(T entity) { return (ID) hibernateTemplate.save(entity); } public int getTotalRows() { String actualHql = "select count(*) " + hql.substring(hql.indexOf("from")); return ((Long) this.hibernateTemplate.find(actualHql).get(0)) .intValue(); } public int getPageSize(int size) { // 最大页数 int pageSize; // 实际每页数据条数 int actualSize; // 总记录数 int totalRows = this.getTotalRows(); // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数 actualSize = (size > totalRows) ? totalRows : size; if (totalRows > 0) { pageSize = (totalRows % size == 0) ? (totalRows / actualSize) : (totalRows / actualSize + 1); } else { pageSize = 0; } return pageSize; } @SuppressWarnings("unchecked") public List<T> findByPage(final int page, final int size) { 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 startRow = (actualPage > 0) ? (actualPage - 1) * actualSize : 0; Query query = session.createQuery(hql); // 设置第一条记录 query.setFirstResult(startRow); query.setMaxResults(actualSize); return (List<T>) query.list(); } }); } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值