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

本文介绍了一个泛型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(); } }); } }
毫米波雷达系统工作在毫米波频段,通过发射与接收电磁波并解析回波信号,实现对目标的探测、定位及识别。相较于传统雷达技术,该系统在测量精度、环境抗干扰性及气象适应性方面表现更为优越。本研究聚焦于德州仪器开发的IWR1843DCA1000号毫米波雷达,系统探究其在多模态数据采集与多样化应用场景中的技术路径及创新实践。 IWR1843DCA1000传感器为款高度集成的毫米波探测设备,采用调频连续波技术与多输入多输出架构,可执行高精度目标测量及成像任务。研究过程中,团队对该设备的性能参数进行了全面评估,并在下列领域展开应用探索: 在数据采集环节,借助专用硬件接口连接雷达传感器,实现原始信号的高效捕获。团队研发了配套的数据采集程序,能够实时记录传感器输出并执行初步信号处理,为后续分析构建数据基础。 通过构建FMCW-MIMO雷达仿真平台,完整复现了雷达波的发射接收流程及信号处理机制。该仿真系统能够模拟目标运动状态及环境变量对雷达波形的影响,为系统性能验证与参数优化提供数字化实验环境。 基于高分辨率测距能力,结合目标检测与轨迹追踪算法,实现对人体运动模式的精确重构。通过点云数据的解析,为行为模式分析与场景理解提供多维信息支撑。 利用雷达回波信号的深度解析,生成表征人体空间分布的热力图像。该技术为复杂环境下的定位问题提供了直观可视化解决方案。 针对精细手势动作的识别需求,应用机器学习方法对雷达生成的点云序列进行特征提取与模式分类,建立手势动作的自动识别体系。 通过分析人体表面对毫米波信号的反射特性,开发非接触式生理参数监测方法,可有效检测呼吸韵律与心脏搏动频率等生命体征指标,为健康监护领域提供新的技术途径。 本研究的顺利开展,不仅深化了IWR1843DCA1000雷达系统的应用研究层次,同时为毫米波技术在多元领域的拓展应用建立了技术支撑体系。通过实证分析与仿真验证相结合的研究模式,该项目为行业应用提供了可靠的技术参照与实践范例,有力推动了毫米波雷达技术的产业化进程。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
基于直接模拟蒙特卡洛(DSMC)方法的气体分子运动仿真工具,为微观尺度气体动力学研究提供数值计算支持。该计算工具通过统计方法模拟稀薄条件下气体粒子的运动轨迹与碰撞行为,适用于航空航天工程、微纳流体系统等存在低密度气体效应的技术领域。 为便于高等院校理工科专业开展数值仿真教学,开发者采用矩阵实验室(Matlab)平台构建了模块化仿真程序。该程序兼容多个Matlab发行版本(2014a/2019b/2024b),内置标准化案例数据集可实现开箱即用。程序架构采用参数化设计理念,关键物理参数均通过独立变量模块进行管理,支持用户根据具体工况调整分子数密度、边界条件和碰撞模等参数。 代码实现遵循计算流体力学的最佳实践规范,主要特征包括:采用分层模块架构确保算法逻辑清晰,关键计算单元配备完整的物理注释,变量命名符合工程仿真惯例。这种设计既有利于初学者理解分子动力学模拟原理,也方便研究人员进行算法改进与功能拓展。 该教学工具主要面向计算机科学、电子工程、应用数学等专业的本科教学场景,可用于课程实验、综合设计项目及学位论文等学术活动。通过将抽象的气体动力学理论转化为可视化的数值实验,有效促进学生对统计物理与计算方法的融合理解。在工程应用层面,该工具能胜任微机电系统流场分析、高海拔空气动力学特性研究、纳米孔道气体输运等现象的定量评估。 随着微纳制造与空间技术的发展,稀薄气体仿真在半导体工艺优化、临近空间飞行器设计等前沿领域的应用价值日益凸显。本仿真工具通过提供可靠的数值实验平台,为相关领域的科研创新与人才培养提供技术支持。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值