- 浏览: 67070 次
- 性别:
- 来自: 杭州
最新评论
-
sybell:
写得好啊,刚入门的web前端开发者,很好的食材的。
使用struts2+prototype.js创建无刷新注册检测 -
wangjhcy:
刚接触 jquery mobile 这个例子没运动起来。谁有可 ...
移动web开发学习一:jquery mobile 和 scrollview的整合 -
cdwen:
发现cpage没有改变的原因了,我自己把更多...给屏蔽了。。 ...
移动web开发学习一:jquery mobile 和 scrollview的整合 -
cdwen:
作为移动web应用新人,拿lz这个代码,写了个提供服务的ser ...
移动web开发学习一:jquery mobile 和 scrollview的整合 -
mihc9275:
碰到个问题,请教一下,我刚才用了jquery.mobile.s ...
移动web开发学习一:jquery mobile 和 scrollview的整合
接上篇所说,如果懂得这个思想,其实很简单了,况且有spring的HibernateDaoSupport坐阵,你的代码会更精简,会更优化。话不多说,贴上代码先看一下吧:
java 代码
- /**
- * 负责为单个Entity对象提供CRUD操作的Hibernate DAO基类.
子类只要在类定义时指定所管理Entity的Class,
- * 即拥有对单个Entity对象的CRUD操作.
- *
- *
- */
- @SuppressWarnings("unchecked")
- abstract public class HibernateBaseDao<t></t> extends HibernateDaoSupport {
- protected Class<t></t> entityClass;// DAO所管理的Entity类型.
- /**
- * 在构造函数中将泛型T.class赋给entityClass.
- */
- public HibernateBaseDao() {
- entityClass = GenericsUtils.getSuperClassGenricType(getClass());
- }
- /**
- * 取得entityClass.JDK1.4不支持泛型的子类可以抛开Class<t></t> entityClass,重载此函数达到相同效果。
- */
- protected Class<t></t> getEntityClass() {
- return entityClass;
- }
- /**
- * 根据ID获取对象.
- *
- * @see HibernateGenericDao#getId(Class,Object)
- */
- public T load(Serializable id) {
- return (T) getHibernateTemplate().load(getEntityClass(), id);
- }
- /**
- * 根据ID获取对象,使用hinbernate get().
- *
- * @see HibernateGenericDao#getId(Class,Object)
- */
- public T get(Serializable id) {
- return (T) getHibernateTemplate().get(getEntityClass(), id);
- }
- /**
- * 获取全部对象
- *
- * @see HibernateGenericDao#getAll(Class)
- */
- public List<t></t> getAll() {
- return getHibernateTemplate().loadAll(getEntityClass());
- }
- /**
- * 获取全部对象,带排序参数.
- *
- */
- public List<t></t> getAll(String orderBy, boolean isAsc) {
- Assert.hasText(orderBy);
- if (isAsc)
- return getHibernateTemplate().findByCriteria(
- DetachedCriteria.forClass(getEntityClass()).addOrder(
- Order.asc(orderBy)));
- else
- return getHibernateTemplate().findByCriteria(
- DetachedCriteria.forClass(getEntityClass()).addOrder(
- Order.desc(orderBy)));
- }
- /**
- * 保存对象.
- */
- public Serializable save(Object o) {
- return getHibernateTemplate().save(o);
- }
- /**
- * 更新对象
- *
- * @param o
- */
- public void update(Object o) {
- getHibernateTemplate().update(o);
- }
- /**
- * 保存或更新对象
- *
- * @param o
- */
- public void saveOrUpdate(Object o) {
- getHibernateTemplate().saveOrUpdate(o);
- }
- /**
- * 删除对象.
- */
- public void remove(Object o) {
- getHibernateTemplate().delete(o);
- }
- /**
- * 根据ID移除对象.
- *
- * @see HibernateGenericDao#removeById(Class,Serializable)
- */
- public void removeById(Serializable id) {
- remove(load(id));
- }
- public void flush() {
- getHibernateTemplate().flush();
- }
- public void clear() {
- getHibernateTemplate().clear();
- }
- /**
- * 创建Query对象.
- * 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
- * 留意可以连续设置,如下:
- *
- * @param values
- * 可变参数.
- */
- public Query createQuery(String hql, Object... values) {
- Assert.hasText(hql);
- Query query = getSession().createQuery(hql);
- for (int i = 0; i < values.length; i++) {
- query.setParameter(i, values[i]);
- }
- return query;
- }
- /**
- * 取得Entity的Criteria.
- *
- */
- public Criteria createCriteria() {
- return getSession().createCriteria(getEntityClass());
- }
- /**
- * 取得Entity的Criteria.
- *
- */
- public Criteria createCriteria(Criterion... criterions) {
- Criteria criteria = createCriteria();
- for (Criterion c : criterions) {
- criteria.add(c);
- }
- return criteria;
- }
- /**
- * 取得Entity的Criteria,带排序参数.
- *
- */
- public Criteria createCriteria(String orderBy, boolean isAsc,
- Criterion... criterions) {
- Assert.hasText(orderBy);
- Criteria criteria = createCriteria(criterions);
- if (isAsc)
- criteria.addOrder(Order.asc(orderBy));
- else
- criteria.addOrder(Order.desc(orderBy));
- return criteria;
- }
- /**
- * 根据hql查询,直接使用HibernateTemplate的find函数.
- *
- * @param values
- * 可变参数,见{@link #createQuery(String,Object...)}
- */
- public List find(String hql, Object... values) {
- Assert.hasText(hql);
- return getHibernateTemplate().find(hql, values);
- }
- /**
- * 根据属性名和属性值查询对象.
- *
- * @return 符合条件的对象列表
- */
- public List<t></t> findBy(String propertyName, Object value) {
- Assert.hasText(propertyName);
- return createCriteria(Restrictions.eq(propertyName, value)).list();
- }
- /**
- * 根据属性名和属性值查询对象,带排序参数.
- */
- public List<t></t> findBy(Class<t></t> entityClass, String propertyName,
- Object value, String orderBy, boolean isAsc) {
- Assert.hasText(propertyName);
- Assert.hasText(orderBy);
- return createCriteria(orderBy, isAsc,
- Restrictions.eq(propertyName, value)).list();
- }
- /**
- * 根据属性名和属性值查询对象,带排序参数.
- *
- * @return 符合条件的对象列表
- */
- public List<t></t> findBy(String propertyName, Object value, String orderBy,
- boolean isAsc) {
- return findBy(getEntityClass(), propertyName, value, orderBy, isAsc);
- }
- /**
- * 根据属性名和属性值查询单个对象.
- *
- * @return 符合条件的唯一对象 or null
- */
- public T findUniqueBy(String propertyName, Object value) {
- Assert.hasText(propertyName);
- return (T) createCriteria(Restrictions.eq(propertyName, value))
- .uniqueResult();
- }
- /**
- * 分页查询函数,使用hql.
- *
- * @param pageNo
- * 页号,从1开始.
- */
- public Page<t></t> pagedQuery(String hql, int pageNo, int pageSize,
- Object... values) {
- Assert.hasText(hql);
- Assert.isTrue(pageNo >= 1, "pageNo should start from 1");
- // Count查询
- String countQueryString = " select count (*) "
- + removeSelect(removeOrders(hql));
- List countlist = getHibernateTemplate().find(countQueryString, values);
- long totalCount = (Long) countlist.get(0);
- if (totalCount < 1)
- return new Page();
- // 实际查询返回分页对象
- int startIndex = Page.getStartOfPage(pageNo, pageSize);
- Query query = createQuery(hql, values);
- List<t></t> list = query.setFirstResult(startIndex).setMaxResults(pageSize)
- .list();
- return new Page<t></t>(startIndex, totalCount, pageSize, list);
- }
- /**
- * 分页查询函数,使用已设好查询条件与排序的
Criteria
. - *
- * @param pageNo
- * 页号,从1开始.
- * @return 含总记录数和当前页数据的Page对象.
- */
- public Page<t></t> pagedQuery(Criteria criteria, int pageNo, int pageSize) {
- Assert.notNull(criteria);
- Assert.isTrue(pageNo >= 1, "pageNo should start from 1");
- CriteriaImpl impl = (CriteriaImpl) criteria;
- // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作
- Projection projection = impl.getProjection();
- List<criteriaimpl.orderentry></criteriaimpl.orderentry> orderEntries;
- try {
- orderEntries = (List) BeanUtils.forceGetProperty(impl,
- "orderEntries");
- BeanUtils.forceSetProperty(impl, "orderEntries", new ArrayList());
- } catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
- // 执行查询
- int totalCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- // 将之前的Projection和OrderBy条件重新设回去
- criteria.setProjection(projection);
- if (projection == null) {
- criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
- }
- try {
- BeanUtils.forceSetProperty(impl, "orderEntries", orderEntries);
- } catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
- // 返回分页对象
- if (totalCount < 1)
- return new Page();
- int startIndex = Page.getStartOfPage(pageNo, pageSize);
- List<t></t> list = criteria.setFirstResult(startIndex).setMaxResults(
- pageSize).list();
- return new Page<t></t>(startIndex, totalCount, pageSize, list);
- }
- /**
- * 分页查询函数,根据entityClass和查询条件参数创建默认的
Criteria
. - *
- * @param pageNo
- * 页号,从1开始.
- * @return 含总记录数和当前页数据的Page对象.
- */
- public Page<t></t> pagedQuery(int pageNo, int pageSize, Criterion... criterions) {
- Criteria criteria = createCriteria(criterions);
- return pagedQuery(criteria, pageNo, pageSize);
- }
- /**
- * 分页查询函数,根据entityClass和查询条件参数,排序参数创建默认的
Criteria
. - *
- * @param pageNo
- * 页号,从1开始.
- * @return 含总记录数和当前页数据的Page对象.
- */
- public Page<t></t> pagedQuery(int pageNo, int pageSize, String orderBy,
- boolean isAsc, Criterion... criterions) {
- Criteria criteria = createCriteria(orderBy, isAsc, criterions);
- return pagedQuery(criteria, pageNo, pageSize);
- }
- /**
- * 判断对象某些属性的值在数据库中是否唯一.
- *
- * @param uniquePropertyNames
- * 在POJO里不能重复的属性列表,以逗号分割 如"name,loginid,password"
- */
- public boolean isUnique(Object entity, String uniquePropertyNames) {
- Assert.hasText(uniquePropertyNames);
- Criteria criteria = createCriteria().setProjection(
- Projections.rowCount());
- String[] nameList = uniquePropertyNames.split(",");
- try {
- // 循环加入唯一列
- for (String name : nameList) {
- criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(
- entity, name)));
- }
- // 以下代码为了如果是update的情况,排除entity自身.
- String idName = getIdName(getEntityClass());
- // 取得entity的主键值
- Serializable id = getId(entity);
- // 如果id!=null,说明对象已存在,该操作为update,加入排除自身的判断
- if (id != null)
- criteria.add(Restrictions.not(Restrictions.eq(idName, id)));
- } catch (Exception e) {
- ReflectionUtils.handleReflectionException(e);
- }
- return (Integer) criteria.uniqueResult() == 0;
- }
- /**
- * 取得对象的主键值,辅助函数.
- */
- public Serializable getId(Object entity) throws NoSuchMethodException,
- IllegalAccessException, InvocationTargetException {
- Assert.notNull(entity);
- Assert.notNull(getEntityClass());
- return (Serializable) PropertyUtils.getProperty(entity,
- getIdName(getEntityClass()));
- }
- /**
- * 取得对象的主键名,辅助函数.
- */
- public String getIdName(Class clazz) {
- Assert.notNull(clazz);
- ClassMetadata meta = getSessionFactory().getClassMetadata(clazz);
- Assert.notNull(meta, "Class " + clazz
- + " not define in hibernate session factory.");
- String idName = meta.getIdentifierPropertyName();
- Assert.hasText(idName, clazz.getSimpleName()
- + " has no identifier property define.");
- return idName;
- }
- /**
- * 去除hql的select 子句,未考虑union的情况,用于pagedQuery.
- *
- * @see #pagedQuery(String,int,int,Object[])
- */
- private static String removeSelect(String hql) {
- Assert.hasText(hql);
- int beginPos = hql.toLowerCase().indexOf("from");
- Assert.isTrue(beginPos != -1, " hql : " + hql
- + " must has a keyword 'from'");
- return hql.substring(beginPos);
- }
- /**
- * 去除hql的orderby 子句,用于pagedQuery.
- *
- * @see #pagedQuery(String,int,int,Object[])
- */
- private static String removeOrders(String hql) {
- Assert.hasText(hql);
- Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*",
- Pattern.CASE_INSENSITIVE);
- Matcher m = p.matcher(hql);
- StringBuffer sb = new StringBuffer();
- while (m.find()) {
- m.appendReplacement(sb, "");
- }
- m.appendTail(sb);
- return sb.toString();
- }
- /**
- * 根据页码和每页的长度返回对象集合
- *
- * @param pageNo
- * 页码
- * @param pageSize
- * 每页的长度
- * @return
- */
- public List<t></t> getObjects(int pageNo, int pageSize) {
- Criteria criteria = this.createCriteria();
- return this.pagedQuery(criteria, pageNo, pageSize).getResult();
- }
- }
有了这个DAO后,你再让其它的实体DAO继承这个BASEDAO,比如:
java 代码
- public class ProductDAO extends HibernateBaseDao <product></product> {
- //public void otherMethod(){...}
- }
就大功告成,所谓的OO,就让泛型帮你完成,烦人的对象转换就此终结。
有兴趣的朋友可以参考springside的源码,它更详细。
评论
2 楼
maomao113
2008-09-11
看过几遍 原来是你的···呵呵 ···我以前收藏了的
1 楼
maomao113
2008-09-11
好熟悉的代码·· 怎么会那么像啊····恩··郁闷 请问贵姓···
相关推荐
总结来说,这个"基于Struts2+hibernate+spring 注解开发的学生信息管理系统"是一个利用Java Web三大框架的典型应用,实现了学生信息的基本操作。通过优化前端设计,可以进一步提升系统的整体质量和用户体验。在实际...
在SSH系统中,Spring主要负责管理整个应用的组件,包括Struts2的Action、Hibernate的数据访问对象(DAO)等。通过Spring的IoC容器,我们可以实现松耦合和更好的测试性。同时,Spring还提供了与Hibernate的集成,简化...
Struts2、Hibernate3和Spring3是Java Web开发中的三个核心框架,它们组合在一起被称为SSH(Struts2、Spring、Hibernate)集成框架。这个框架体系为开发者提供了强大的模型-视图-控制器(MVC)架构支持,数据持久化...
Struts2、Hibernate和Spring是Java开发中三大主流框架,它们的整合应用在企业级Web应用开发中极为常见。这个管理系统就是基于这三个框架的集成,提供了高效、灵活且可维护的解决方案。 Struts2作为MVC(Model-View-...
1. word文档记录了Struts2+Hibernate3+Spring2.5整合详细步骤,附有操作步骤的图示参考,并给出了各个步骤的注意事项; 2. 源代码实例包括一个完整模块的增删改查操作,可直接运行,可以在此基础上直接进行自己系统...
Struts2、Hibernate3.3和Spring3.0是Java Web开发中著名的三大框架,它们分别负责MVC模式中的Action层、持久化层和依赖注入与业务逻辑管理。本实例将详细阐述如何将这三个框架整合在一起,实现一个完整的CRUD(创建...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的整合应用广泛用于构建复杂的Web应用程序,如本例中的图书馆管理系统。这个系统实现了用户登录和注册功能,并且提供了对书籍表的操作,包括增、删、改...
2. Spring 作为整体的容器,管理所有组件的生命周期,包括Struts2的Action、Hibernate的数据访问对象(DAO)以及DWR的远程接口。Spring的DI特性使得各组件之间的依赖关系得以解耦。 3. Hibernate 作为持久层框架,...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们的组合,通常被称为SSH(Struts2+Spring+Hibernate)或SSH2。这个“Struts2+Hibernate+Spring基于单表的增删改查code”项目是一个典型的Java Web应用...
Struts2、Hibernate和Spring是Java企业级应用中常用的三个开源框架,它们分别负责MVC模式中的表现层、持久层和业务层管理。SSH(Struts2+Spring+Hibernate)框架整合是Java Web开发中常见的一种技术栈,能有效地提高...
### Struts2+Hibernate3.2+Spring2.0架构搭建详解 #### 一、环境搭建与配置 在本教程中,我们将详细讲解如何搭建基于Struts2+Hibernate3.2+Spring2.0的软件架构。这个组合常被称为SSH(Struts-Spring-Hibernate)...
在整合这些技术时,通常会使用Spring4作为核心容器,管理所有组件的生命周期,包括Struts2的Action和Hibernate4的数据访问对象(DAO)。Struts2处理HTTP请求,调用Spring管理的业务服务,而这些服务又依赖于...
Struts2、Hibernate和Spring是Java企业级应用中三大核心框架,它们的整合使用能够构建出高效、可维护性高的Web应用程序。本篇将深入剖析这三者如何协同工作,并提供实际范例应用。 首先,Struts2作为MVC(模型-视图...
2. **配置文件**:struts-config.xml定义Struts的配置,spring-beans.xml管理Spring的bean,hibernate.cfg.xml配置Hibernate的数据库连接,可能还有实体类的映射文件(hbm.xml或使用注解)。 3. **JSP页面**:展示...
Struts2、Spring4和Hibernate4是Java Web开发中的三大主流框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个最新的项目系统整合了这三个框架,旨在提供一个高效、灵活且易于维护的开发环境。下面将详细...
Struts2+Spring+Hibernate 中的Action单元测试环境搭建 在软件开发中,单元测试是一种非常重要的测试方法,可以帮助我们确保代码的可靠性和稳定性。在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境...
3. 配置Struts2:在struts.xml文件中配置Struts2的动作映射,指定Action类,同时配置Spring插件,使得Action类由Spring管理。 4. 配置Hibernate:设置hibernate.cfg.xml文件,定义数据库连接、实体类等信息。 5. ...
Struts2、Hibernate和Spring是Java Web开发中的三个核心框架,它们共同构成了经典的SSH(Struts2、Spring、Hibernate)架构。这篇博客“Struts2+Hibernate+Spring框架搭建(三)”着重介绍如何整合这三个框架,构建...
- 配置 Struts2 使用 Spring 管理对象:`<constant name="struts.objectFactory" value="spring"/>` - 导入默认配置文件:`<include file="struts-default.xml"/>` - 定义 Action 类:`...