`
ouly2
  • 浏览: 1365 次
社区版块
存档分类
最新评论

简洁的spring ,hibernate web架构模式

阅读更多
大家用spring hibernate,ibatis开放web应用时,所谓3层架构,Dao,service,然后web层,但是据我的经验,一个熟手的代码编写者最终大量的时间都花在业务的实现,特别是service不应为了实现基本的crud的动态参数查询而专门去写dao接口,dao实现,service接口,service实现,还没有写业务逻辑,心都已经疲了,所以这些常规的操作要把她们都封装起来,用一个很简洁的调用方式,不要为了所谓的设计而设计,要符合实际开发状态而实践高效的模式。。。(个人经验,希望大家交流)

使用这个抽象的service基类,相关领域继承她实现自己的service(个人建议实现的领域相关service应该要封装实现具体的逻辑,而不是CRUD,和一些查询),也可以空实现;
配置事务,由spring接管事务的管理。
下面代码看起来长,其实也就是几个很简单的公共方法,就能搞定日常开放的数据库操作,
把时间花在下具体的业务逻辑上,不要总是把时间化在接口和接口实现上;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import ly.tool.utils.ref.ReflectUtils;

import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.jhzp.domain.Article;
import com.jhzp.domain.base.BaseDomain;

public abstract class BaseService {
	
	protected Logger log=Logger.getLogger(getClass());

	@Autowired
	private SessionFactory sessionFactory;
	@Autowired
	private SqlMapClient sqlMapClient;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	protected Session getHibernateSession(){
		return this.getSessionFactory().getCurrentSession();
	}
	protected HibernateTemplate getHibernateTemplate() {
		return new HibernateTemplate(this.sessionFactory);
	}

	protected SqlMapClient getSqlMapClient() {
		return sqlMapClient;
	}

	protected void setSqlMapClient(SqlMapClient sqlMapClient) {
		this.sqlMapClient = sqlMapClient;
	}
	/**
	 * ibatis 动态参数查询 ,返回的类型要在sql语句及ibatis配置文件中写好
	 */
	@Transactional(readOnly=true)
	public List ilist(String selectId,Map params) throws SQLException{
		return this.getSqlMapClient().queryForList(selectId, params);
	}
	
	/**
	 * 20140707 新增通用方法 
	 */
	@Transactional
	public void delete(BaseDomain domain,Integer id){
		Object obj=this.getHibernateSession().get(domain.getClass(),id);
		this.getHibernateSession().delete(obj);
	}
	@Transactional
	public void update(BaseDomain domain,Integer id){
		Object obj=this.getHibernateSession().get(domain.getClass(),id);
		this.getHibernateSession().update(obj);
	}
	@Transactional(readOnly=true)
	public Object getById(Class clazz,Integer id){
		return this.getHibernateSession().get(clazz, id);
	}
	@Transactional
	public void create(BaseDomain domain){
		this.getHibernateSession().save(domain);
	}
	
	@Transactional(readOnly=true)
	public List hlistByParams(Class dclazz,Map<String,Object> params){
		log.info("传递的查询参数:"+params);
		return this.queryByParam(getHibernateSession(), dclazz, params);
	}
	@Transactional(readOnly=true)
	public List hlistByHqlAndParams(String hql,Map<String,Object> params){
		return this.queryByParamAndHql(getHibernateSession(),hql, params);
	}
	
	/**
	 * hibernate 动态参数查询 ,查询参数形式只能是: name=:name,
	 * 其他形式的查询使用自定义hql的查询queryByParamAndHql
	 */
	protected List queryByParam(Session session,Class dclazz,Map<String,Object> params){
		List<String> fnamel=ReflectUtils.listPropNames(dclazz);
		Set<String> pnames=params.keySet();
		List<String> pnamel=new ArrayList<String>();
		Iterator<String> iter=pnames.iterator();
		while(iter.hasNext()){
			String pname=iter.next();
			if(null!=params.get(pname) && fnamel.contains(pname)){
				pnamel.add(pname);
			}
		}
		String hql="from "+dclazz.getSimpleName();
		if(pnamel.size()>0){
			hql=hql+" where ";
		}
		StringBuilder sdb=new StringBuilder();
		sdb.append(hql);
		int count=0;
		for(String pname:pnamel){
			if(!fnamel.contains(pname)){
				log.info(" pname: "+pname+"参数跟属性名不同,返回了,fnamel列表: "+fnamel);
				return null;
			}
			
			if(count>0){
				sdb.append(" and "+ pname+" = :"+pname);
			}else
				sdb.append(pname+" = :"+pname);
			count++;
		}
		hql=sdb.toString();
		log.info("打印生成的hql: "+hql);
		Query query=session.createQuery(hql);
		for(String pname:pnamel){
			Object obj=params.get(pname);
			if(obj instanceof String){
				query.setParameter(pname, obj);
			}else if(obj instanceof BigDecimal){
				query.setBigDecimal(pname, ((BigDecimal)obj));
			}else if(obj instanceof BigInteger){
				query.setBigInteger(pname, ((BigInteger)obj));
			}else if(obj instanceof Boolean){
				query.setBoolean (pname, ((Boolean)obj));
			}else if(obj instanceof Byte){
				query.setByte(pname, ((Byte)obj));
			}else if(obj instanceof Calendar){
				query.setCalendar(pname, ((Calendar)obj));
			}else if(obj instanceof Date){
				log.info("应用到了"+Date.class);
				query.setDate(pname, ((Date)obj));
			}else if(obj instanceof Double){
				query.setDouble(pname, ((Double)obj));
			}else if(obj instanceof Integer){
				query.setDouble(pname, ((Integer)obj));
			}else if(obj instanceof Locale){
				query.setLocale(pname, ((Locale)obj));
			}else if(obj instanceof Long){
				query.setLong(pname, ((Long)obj));
			}else{
				query.setParameter(pname, obj);
			}
			
		}
		
		return query.list();
//		return null; 
	}
	 
	/**
	 * 自定义hql,传递动态的参数
	 */
	protected List queryByParamAndHql(Session session,String hql,Map<String,Object> params){
		Query query=session.createQuery(hql);
		for(String pname:params.keySet()){
			if(hql.contains(pname)){
				Object obj=params.get(pname);
				if(obj instanceof String){
					query.setParameter(pname, obj);
				}else if(obj instanceof BigDecimal){
					query.setBigDecimal(pname, ((BigDecimal)obj));
				}else if(obj instanceof BigInteger){
					query.setBigInteger(pname, ((BigInteger)obj));
				}else if(obj instanceof Boolean){
					query.setBoolean (pname, ((Boolean)obj));
				}else if(obj instanceof Byte){
					query.setByte(pname, ((Byte)obj));
				}else if(obj instanceof Calendar){
					query.setCalendar(pname, ((Calendar)obj));
				}else if(obj instanceof Date){
					log.info("应用到了"+Date.class);
					query.setDate(pname, ((Date)obj));
				}else if(obj instanceof Double){
					query.setDouble(pname, ((Double)obj));
				}else if(obj instanceof Integer){
					query.setDouble(pname, ((Integer)obj));
				}else if(obj instanceof Locale){
					query.setLocale(pname, ((Locale)obj));
				}else if(obj instanceof Long){
					query.setLong(pname, ((Long)obj));
				}else{
					query.setParameter(pname, obj);
				}
			}
		}
		
		try {
			return query.list();
		} catch (Exception e) {
			e.printStackTrace();
			log.error("第二查询出错了。");
			return null;
		}
	}
}

分享到:
评论

相关推荐

    spring hibernate web工程包

    1. **Spring MVC**:Spring 框架的一部分,用于构建 Web 应用程序的模型-视图-控制器(MVC)架构。它使得业务逻辑与展示层分离,提高了代码的可维护性和可测试性。 2. **Spring 依赖注入(DI)**:Spring 的核心...

    springmvc spring hibernate整合Demo

    它提供了模型-视图-控制器(MVC)架构模式,使开发者可以将业务逻辑、数据展示和用户交互分离,提高代码的可维护性和可测试性。在Spring MVC中,Controller处理HTTP请求,Model存储业务数据,View负责数据的展示。 ...

    Java Web 基于Spring Struts Hibernate 轻量级架构开发基础

    在Java Web开发领域,Spring、Struts和Hibernate是三大核心框架,它们构成了经典的轻量级架构,也被称为SSH(Spring、Struts、Hibernate)框架。这个架构为开发人员提供了高效、灵活且可扩展的解决方案,使得企业级...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    它提供了模型-视图-控制器(MVC)架构模式的实现,使得业务逻辑与用户界面分离,提高了代码的可测试性和可维护性。Spring MVC通过注解如@Controller、@RequestMapping等,可以让开发者在方法级别定义请求映射,简化...

    jsf+spring+hibernate架构的网上商店

    这种架构模式因其高效、灵活和可扩展性而备受青睐。以下是对这个"JSF+Spring+Hibernate 架构的网上商店"的详细解析: ### JSF(JavaServer Faces) JSF 是一个用于构建用户界面的 Java 框架,它遵循 MVC(模型-视图...

    struts+spring+hibernate架构

    总的来说,Struts+Spring+Hibernate架构为企业级应用提供了强大的支持,它集成了MVC设计模式、依赖注入和对象关系映射,实现了高效、灵活的Java Web开发。然而,随着技术的演进,例如Spring Boot的出现,SSH框架逐渐...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序的模型-视图-控制器(MVC)架构。它提供了丰富的特性,如请求映射、数据绑定、异常处理和视图解析等。使用Spring MVC,开发者可以通过注解来简化配置,...

    基于Struts,Hibernate和Spring的J2EE架构研究

    ### 基于Struts、Hibernate和Spring的J2EE架构研究 #### 一、引言 随着互联网技术的发展和企业需求的日益多样化,软件开发领域面临着越来越多的挑战。为了解决这些问题,J2EE(Java 2 Platform, Enterprise ...

    struts2 spring hibernate框架技术与项目实战 光盘源码 中

    Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们各自负责不同的职责,但协同工作时可以构建出高效、灵活的企业级应用。这里我们将深入探讨这三个框架的核心概念、功能以及它们在实际项目中的应用。...

    webwork spring hibernate整合实例源代码全部jar包

    在IT行业中,Web开发是一个非常重要的领域,而Webwork、Spring和Hibernate是三个关键的开源框架,它们在构建复杂的企业级应用中起着至关重要的作用。这个"webwork spring hibernate整合实例源代码全部jar包"是针对...

    struts-spring-hibernate图解

    Struts、Spring 和 Hibernate 是Java Web开发中的三个关键框架,它们各自解决不同的问题,并通过集成提供了强大的企业级应用开发能力。 Struts 是一个基于MVC(Model-View-Controller)设计模式的开源Web应用程序...

    Spring,hibernate,struts jar 最新jar包

    Spring、Hibernate和Struts是Java开发中非常重要的三个框架,它们构成了经典的MVC(Model-View-Controller)架构,被广泛应用于企业级Web应用开发。这些框架极大地简化了开发过程,提高了开发效率,并且提供了良好的...

    jsp+Spring+hibernate 博客系统

    这个"jsp+Spring+hibernate"博客系统展示了如何利用现代Java技术栈构建一个功能完善的Web应用。通过结合JSP的视图呈现、Spring的控制层管理和Hibernate的数据持久化,开发者能够快速、高效地开发出具有复杂业务逻辑...

    gwt+spring+hibernate

    综上所述,"gwt+spring+hibernate"的整合旨在展示如何在Java Web应用中同时利用GWT的富客户端特性、Spring的架构优势和Hibernate的数据持久化能力。通过这样的整合,开发者可以构建出用户体验良好、业务逻辑清晰且...

    struts2.1.8 集成 spring hibernate需要的 核心 jar

    这样的集成使得开发人员可以利用Spring的IoC(Inversion of Control)和AOP能力,以及Hibernate对数据库的简便操作,同时,Struts2则负责处理HTTP请求和展示逻辑,实现了MVC模式的高效分工。这样的架构有助于提高...

    SSH(Struts+Spring+Hibernate)三层架构.

    SSH(Struts+Spring+Hibernate)是Java Web开发中常用的一种三层架构模式,它将应用程序分为表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer),以实现清晰的...

    struts+spring+hibernate开发 注册小实例

    Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们的组合通常被称为SSH(Struts、Spring、Hibernate)。这个“struts+spring+hibernate开发 注册小实例”是为初学者设计的一个教程,目的是帮助他们快速...

    Struts Spring Hibernate 整合教程

    在IT领域,尤其是Java开发社区中,Struts、Spring和Hibernate是三个极为重要的框架,它们各自在Web应用开发、业务逻辑管理和数据持久化方面扮演着核心角色。当这三者被整合到一起时,能够构建出功能强大、性能高效且...

    java javaee struts2 spring hibernate免费学习视频教程

    - **Hibernate与Spring集成**:实践Hibernate与Spring框架的集成方案,包括事务管理、DAO层设计模式等。 ### 数据库操作 - **Oracle数据库**:介绍Oracle数据库的基本操作,如表的创建、查询、更新和删除等SQL语句...

Global site tag (gtag.js) - Google Analytics