大家用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;
}
}
}
分享到:
相关推荐
1. **Spring MVC**:Spring 框架的一部分,用于构建 Web 应用程序的模型-视图-控制器(MVC)架构。它使得业务逻辑与展示层分离,提高了代码的可维护性和可测试性。 2. **Spring 依赖注入(DI)**:Spring 的核心...
它提供了模型-视图-控制器(MVC)架构模式,使开发者可以将业务逻辑、数据展示和用户交互分离,提高代码的可维护性和可测试性。在Spring MVC中,Controller处理HTTP请求,Model存储业务数据,View负责数据的展示。 ...
在Java Web开发领域,Spring、Struts和Hibernate是三大核心框架,它们构成了经典的轻量级架构,也被称为SSH(Spring、Struts、Hibernate)框架。这个架构为开发人员提供了高效、灵活且可扩展的解决方案,使得企业级...
它提供了模型-视图-控制器(MVC)架构模式的实现,使得业务逻辑与用户界面分离,提高了代码的可测试性和可维护性。Spring MVC通过注解如@Controller、@RequestMapping等,可以让开发者在方法级别定义请求映射,简化...
这种架构模式因其高效、灵活和可扩展性而备受青睐。以下是对这个"JSF+Spring+Hibernate 架构的网上商店"的详细解析: ### JSF(JavaServer Faces) JSF 是一个用于构建用户界面的 Java 框架,它遵循 MVC(模型-视图...
总的来说,Struts+Spring+Hibernate架构为企业级应用提供了强大的支持,它集成了MVC设计模式、依赖注入和对象关系映射,实现了高效、灵活的Java Web开发。然而,随着技术的演进,例如Spring Boot的出现,SSH框架逐渐...
### 基于Struts、Hibernate与Spring的J2EE架构研究 #### 摘要与背景 本文探讨了如何利用Struts、Hibernate与Spring这三个开源框架构建一个强大的、高效的且易于扩展的J2EE分层架构。MVC(Model-View-Controller)...
Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序的模型-视图-控制器(MVC)架构。它提供了丰富的特性,如请求映射、数据绑定、异常处理和视图解析等。使用Spring MVC,开发者可以通过注解来简化配置,...
### 基于Struts、Hibernate和Spring的J2EE架构研究 #### 一、引言 随着互联网技术的发展和企业需求的日益多样化,软件开发领域面临着越来越多的挑战。为了解决这些问题,J2EE(Java 2 Platform, Enterprise ...
Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们各自负责不同的职责,但协同工作时可以构建出高效、灵活的企业级应用。这里我们将深入探讨这三个框架的核心概念、功能以及它们在实际项目中的应用。...
在IT行业中,Web开发是一个非常重要的领域,而Webwork、Spring和Hibernate是三个关键的开源框架,它们在构建复杂的企业级应用中起着至关重要的作用。这个"webwork spring hibernate整合实例源代码全部jar包"是针对...
Struts、Spring 和 Hibernate 是Java Web开发中的三个关键框架,它们各自解决不同的问题,并通过集成提供了强大的企业级应用开发能力。 Struts 是一个基于MVC(Model-View-Controller)设计模式的开源Web应用程序...
Spring、Hibernate和Struts是Java开发中非常重要的三个框架,它们构成了经典的MVC(Model-View-Controller)架构,被广泛应用于企业级Web应用开发。这些框架极大地简化了开发过程,提高了开发效率,并且提供了良好的...
这个"jsp+Spring+hibernate"博客系统展示了如何利用现代Java技术栈构建一个功能完善的Web应用。通过结合JSP的视图呈现、Spring的控制层管理和Hibernate的数据持久化,开发者能够快速、高效地开发出具有复杂业务逻辑...
综上所述,"gwt+spring+hibernate"的整合旨在展示如何在Java Web应用中同时利用GWT的富客户端特性、Spring的架构优势和Hibernate的数据持久化能力。通过这样的整合,开发者可以构建出用户体验良好、业务逻辑清晰且...
这样的集成使得开发人员可以利用Spring的IoC(Inversion of Control)和AOP能力,以及Hibernate对数据库的简便操作,同时,Struts2则负责处理HTTP请求和展示逻辑,实现了MVC模式的高效分工。这样的架构有助于提高...
SSH(Struts+Spring+Hibernate)是Java Web开发中常用的一种三层架构模式,它将应用程序分为表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer),以实现清晰的...
Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们的组合通常被称为SSH(Struts、Spring、Hibernate)。这个“struts+spring+hibernate开发 注册小实例”是为初学者设计的一个教程,目的是帮助他们快速...
在IT领域,尤其是Java开发社区中,Struts、Spring和Hibernate是三个极为重要的框架,它们各自在Web应用开发、业务逻辑管理和数据持久化方面扮演着核心角色。当这三者被整合到一起时,能够构建出功能强大、性能高效且...
- **Hibernate与Spring集成**:实践Hibernate与Spring框架的集成方案,包括事务管理、DAO层设计模式等。 ### 数据库操作 - **Oracle数据库**:介绍Oracle数据库的基本操作,如表的创建、查询、更新和删除等SQL语句...