我在Struts2 + Spring + Hibernate 项目开发中总结出了一个Service 和 DAO,可以用于处理任何的pojo(bean)。使用这两个Service 和 DAO可以极大地提高开发的效率,不必再分别针对不同的pojo编写对应的Service 和 DAO。内容如下:
DAO:
接口:BaseDao.java
package dao; import java.util.List; /** * @author 雷霄骅 * 对Object的DAO操作 * 提供了通用的一些方法 */ public interface BaseDao { public void save(Object object); public void delete(Object object); public void update(Object object); public Object ReadSingle(String targetName,String propertyName,Object value); public List<Object> ReadByProperty(String targetName,String propertyName,Object value); public List<Object> ReadAll(String targetName); public List<Object> ReadAllByOrder(String targetName,String propertyName,String order); public Object get(int id); public List<Object> ReadByPropertyList(String targetName,List<String> propertyName, List<Object> value); public Integer ReadCount(String targetName); public List<Object> ReadLimitedByOrder(String targetName, String propertyName,int num, String order); }
实现:BaseDaoImpl.java
package dao; import java.sql.SQLException; 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.support.HibernateDaoSupport; /** * @author 雷霄骅 * HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作, * Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,就可完成大多数DAO对象的CRUD操作。 */ public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao{ @Override public void save(Object object) { getHibernateTemplate().save(object); //System.out.println("save "+object.toString()); } @Override public void delete(Object object) { getHibernateTemplate().delete(object); } @Override public void update(Object object) { getHibernateTemplate().update(object); //改用saveOrUpdate,在评价的时候,第一次创建的时候Save,其他时候Update //getHibernateTemplate().saveOrUpdate(object); //System.out.println("update "+object.toString()); } @SuppressWarnings("unchecked") @Override public Object ReadSingle(final String targetName,final String propertyName, final Object value) { // TODO Auto-generated method stub return (Object) getHibernateTemplate().execute(new HibernateCallback() { /*doInHibernate()。session的创建和销毁,一切都在程序内部完成。*/ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = "from "+targetName+" as "+targetName+" where "+targetName+"." + propertyName + "=:value"; Query query = session.createQuery(hql); query.setParameter("value", value); return query.uniqueResult(); } }); } @SuppressWarnings("unchecked") @Override public List<Object> ReadAll(String targetName) { // TODO Auto-generated method stub String hql="from "+targetName; return getHibernateTemplate().find(hql); } @SuppressWarnings("unchecked") @Override public List<Object> ReadByProperty(final String targetName, final String propertyName, final Object value) { // TODO Auto-generated method stub return (List<Object>) getHibernateTemplate().execute(new HibernateCallback() { /*doInHibernate()。session的创建和销毁,一切都在程序内部完成。*/ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = "from "+targetName+" as "+targetName+" where "+targetName+"." + propertyName + "=:value"; Query query = session.createQuery(hql); query.setParameter("value", value); return query.list(); } }); } //比ReadByProperty简单很多 @Override public Object get(int id) { // TODO Auto-generated method stub return getHibernateTemplate().get(Object.class, id); } @Override public List<Object> ReadByPropertyList(final String targetName, final List<String> propertyName, final List<Object> value) { // TODO Auto-generated method stub return (List<Object>) getHibernateTemplate().execute(new HibernateCallback() { /*doInHibernate()。session的创建和销毁,一切都在程序内部完成。*/ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = "from "+targetName+" as "+targetName; //------------------------------- for(int i=0;i<propertyName.size();i++){ String propertynametemp= propertyName.get(i); Object propertyvaluetemp= value.get(i); if(propertynametemp!=null){ if(i==0){ hql=hql+" where "+targetName+"." + propertynametemp + "=" + propertyvaluetemp +" "; }else{ hql=hql+" and "+targetName+"." +propertynametemp + "=" + propertyvaluetemp +" "; } } } //------------------------------- Query query = session.createQuery(hql); //当返回的数据不是一条的时候,不用uniqueresult(),而用list() return query.list(); } }); } //这里在Hibernate2.0之前版本list.get(0)返回的是Integer类型. //但是在Hibernate3.0以后版本list.get(0)返回的是Long类型. //所以在这里不可以由Long型强转成Integer类型. //Integer属于不可更改类型,而且Long和Integer没有任何继承关系,当然不能这样转换。 @Override public Integer ReadCount(final String targetName) { // TODO Auto-generated method stub return (Integer) getHibernateTemplate().execute(new HibernateCallback() { /*doInHibernate()。session的创建和销毁,一切都在程序内部完成。*/ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = "select count(*) from "+targetName; //System.out.println(hql); //注:java.lang.Number是Integer,Long的父类. return ((Number)session.createQuery(hql).iterate().next()).intValue(); } }); } @Override public List<Object> ReadLimitedByOrder(final String targetName, final String propertyName, final int num, final String order) { // TODO Auto-generated method stub return (List<Object>) getHibernateTemplate().execute(new HibernateCallback() { /*doInHibernate()。session的创建和销毁,一切都在程序内部完成。*/ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql ="from "+targetName+" as "+targetName+ " order by "+targetName+"." + propertyName+ " " + order; Query query = session.createQuery(hql); query.setMaxResults(num); //当返回的数据不是一条的时候,不用uniqueresult(),而用list() return query.list(); } }); } @Override public List<Object> ReadAllByOrder(String targetName, String propertyName, String order) { // TODO Auto-generated method stub String hql="from "+targetName+" as "+targetName+ " order by "+targetName+"." + propertyName+ " " + order; return getHibernateTemplate().find(hql); } }
Service:
接口:BaseService.java
package service; import java.util.List; /** * @author 雷霄骅 * 对Object的Service * 提供了一些通用的方法 */ public interface BaseService { public void save(Object object); public void update(Object object); public void delete(Object object); public Object ReadByID(String targetName,int id); @SuppressWarnings("rawtypes") public List ReadAll(String targetName); public List ReadAllByOrder(String targetName,String propertyName,String order); @SuppressWarnings("rawtypes") public List ReadByProperty(String targetName,String propertyName,Object propertyValue); public List ReadByPropertyList(String targetName,List<String> propertyName,List<Object> propertyValue); public List ReadLimitedByOrder(String targetName,String propertyName,int num,String order); public Object ReadSingle(String targetName,String propertyName,Object propertyValue); public int ReadCount(String targetName); }
实现:BaseServiceImpl.java
package service; import java.util.ArrayList; import java.util.List; import dao.BaseDao; /** * @author 雷霄骅 * 对Object的Service * 提供了一些通用的方法 */ public class BaseServiceImpl implements BaseService { private BaseDao baseDao; @Override public void save(Object object) { // TODO Auto-generated method stub baseDao.save(object); } @Override public void update(Object object) { // TODO Auto-generated method stub baseDao.update(object); } @Override public void delete(Object object) { // TODO Auto-generated method stub baseDao.delete(object); } @Override public Object ReadByID(String targetName,int id) { // TODO Auto-generated method stub return baseDao.ReadSingle(targetName,"id", id); } @SuppressWarnings("rawtypes") @Override public List ReadAll(String targetName) { // TODO Auto-generated method stub return baseDao.ReadAll(targetName); } @SuppressWarnings("rawtypes") @Override public List ReadAllByOrder(String targetName,String propertyName,String order) { // TODO Auto-generated method stub return baseDao.ReadAllByOrder(targetName,propertyName,order); } public BaseDao getBaseDao() { return baseDao; } public void setBaseDao(BaseDao baseDao) { this.baseDao = baseDao; } @Override public List ReadByProperty(String targetName, String propertyName, Object propertyValue) { // TODO Auto-generated method stub return baseDao.ReadByProperty(targetName, propertyName, propertyValue); } @Override public Object ReadSingle(String targetName, String propertyName, Object propertyValue) { // TODO Auto-generated method stub return baseDao.ReadSingle(targetName, propertyName, propertyValue); } @Override public int ReadCount(String targetName) { // TODO Auto-generated method stub return baseDao.ReadCount(targetName); } @Override public List ReadLimitedByOrder(String targetName, String propertyName, int num, String order) { return baseDao.ReadLimitedByOrder(targetName,propertyName,num,order); } @Override public List ReadByPropertyList(String targetName, List<String> propertyName, List<Object> propertyValue) { // TODO Auto-generated method stub return baseDao.ReadByPropertyList(targetName,propertyName,propertyValue); } }
这样,在Action层调用方法的时候,可以直接调用BaseService相应的方法完成操作。
举一个例子:
有这么一个名字叫Blog的pojo:
package bean; import java.sql.Timestamp; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * Blog entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "blog", catalog = "vqe") public class Blog implements java.io.Serializable { // Fields private Integer id; private Admin admin; private String title; private Timestamp modifytime; private String content; // Constructors /** default constructor */ public Blog() { } /** full constructor */ public Blog(Admin admin, String title, Timestamp modifytime, String content) { this.admin = admin; this.title = title; this.modifytime = modifytime; this.content = content; } // Property accessors @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "adminid") public Admin getAdmin() { return this.admin; } public void setAdmin(Admin admin) { this.admin = admin; } @Column(name = "title", length = 200) public String getTitle() { return this.title; } public void setTitle(String title) { this.title = title; } @Column(name = "modifytime", length = 19) public Timestamp getModifytime() { return this.modifytime; } public void setModifytime(Timestamp modifytime) { this.modifytime = modifytime; } @Column(name = "content", length = 10000) public String getContent() { return this.content; } public void setContent(String content) { this.content = content; } }
该类代表博客的一篇文章。
在Action层只需调用BaeService对应的方法就能完成相应的操作。换句话说,只要把pojo的类的名字当一个字符串传递给ReadByID这种的函数,就可以实现相应的功能。
//根据ID读取: Blog blog=(Blog) baseService.ReadByID("Blog", blogid); //添加: baseService.save(blog); //修改: baseService.update(blog); //删除: baseService.delete(blog); //读取所有(根据时间降序) List<Blog> resultblog=baseService.ReadAllByOrder("Blog","modifytime","desc"); //读取num条(根据时间降序) List<Blog> resultblog=baseService.ReadLimitedByOrder("Blog","modifytime",num,"desc");
完整的实现Blog(博客)的增删改查的Action示例:
package action; import java.sql.Timestamp; import java.util.Date; import java.util.List; import java.util.Map; import service.BaseService; import bean.Admin; import bean.Blog; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * @author 雷霄骅 * Action */ public class BlogAct extends ActionSupport { private int blogid; private int num; private Blog blog; private List<Blog> resultblog; private BaseService baseService; public int getBlogid() { return blogid; } public void setBlogid(int blogid) { this.blogid = blogid; } public Blog getBlog() { return blog; } public void setBlog(Blog blog) { this.blog = blog; } public BaseService getBaseService() { return baseService; } public void setBaseService(BaseService baseService) { this.baseService = baseService; } public List<Blog> getResultblog() { return resultblog; } public void setResultblog(List<Blog> resultblog) { this.resultblog = resultblog; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String Add(){ try{ //-------------------------------- ActionContext context = ActionContext.getContext(); Map sessionMap = context.getSession(); Admin admin=(Admin)sessionMap.get("admin"); //-------------------------------- blog.setModifytime( new Timestamp(new Date().getTime())); blog.setAdmin(admin); baseService.save(blog); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } public String Delete(){ try{ blog=(Blog) baseService.ReadByID("Blog", blogid); baseService.delete(blog); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } public String Read(){ try{ blog=(Blog) baseService.ReadByID("Blog", blogid); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } public String Update(){ try{ //-------------------------------- ActionContext context = ActionContext.getContext(); Map sessionMap = context.getSession(); Admin admin=(Admin)sessionMap.get("admin"); //-------------------------------- blog.setModifytime( new Timestamp(new Date().getTime())); blog.setAdmin(admin); baseService.update(blog); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } public String ReadAll(){ try{ resultblog=baseService.ReadAllByOrder("Blog","modifytime","desc"); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } public String ReadLimitedByOrder(){ try{ resultblog=baseService.ReadLimitedByOrder("Blog","modifytime",num,"desc"); return SUCCESS; } catch(Exception ex){ ex.printStackTrace(); return ERROR; } } }
相关推荐
Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...
Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...
Struts2、Spring4和Hibernate4是Java Web开发中的三大主流框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个最新的项目系统整合了这三个框架,旨在提供一个高效、灵活且易于维护的开发环境。下面将详细...
Struts2+Spring+Hibernate 中的Action单元测试环境搭建 在软件开发中,单元测试是一种非常重要的测试方法,可以帮助我们确保代码的可靠性和稳定性。在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境...
Struts2、Spring4和Hibernate5是Java Web开发中的三个重要框架,它们分别负责MVC模式中的动作控制、依赖注入和持久化管理。这三者的整合可以构建出高效、稳定且易于维护的企业级应用。 **Struts2** 是一个基于MVC...
Struts2、Spring4和Hibernate是Java开发中的三大框架,它们在构建企业级Web应用程序时起着核心作用。本教程将深入探讨这三个框架如何协同工作,以实现高效、灵活和可扩展的电子商务平台。 首先,Struts2是一个基于...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
Struts2、Spring3和Hibernate4是Java Web开发中的三个核心框架,它们分别负责MVC(Model-View-Controller)架构中的控制层、业务层和服务层。本示例结合这三个框架,提供了一种完整的三层架构实现,以提高开发效率和...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的整合应用极大地提升了开发效率和项目的可维护性。在本示例中,我们将探讨如何将这三个框架集成在一起,实现一个完整的MVC(模型-视图-控制器)架构。 ...
Struts1、Spring2和Hibernate2是Java Web开发中的三个重要框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个整合例子旨在展示如何将这三个框架协同工作,以构建一个完整的Java Web应用程序。 Struts1是...
例如,Struts2的Action可以通过Spring注入所需的Service或DAO层对象,以便调用业务方法。AOP常用于日志记录、事务管理等,例如,在添加、删除或修改书籍时,可以使用AOP来处理事务,确保数据的一致性。 Hibernate...
Struts2、Spring3和Hibernate4是Java Web开发中的三个核心框架,它们分别负责MVC模式中的动作控制、依赖注入和服务层管理以及持久化层的数据操作。这篇博客文章结合这三个框架,探讨了如何构建一个完整的Java Web...
Struts2、Spring4和Hibernate4是Java Web开发中的三个核心框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个"struts2+spring4+hibernate4工程搭建源码"提供了使用这三个框架集成开发的示例代码,对于学习...
Struts2、Spring2和Hibernate3是Java Web开发中的经典技术栈,被广泛应用于企业级应用的构建。这个实例结合了这三大框架,提供了一个完整的功能模块,包括用户注册、数据查询、搜索以及分页显示,非常适合初学者进行...
其中,Struts2、Spring与Hibernate作为经典的“SSH”组合(Struts-Spring-Hibernate),在Java Web开发领域占据着重要的地位。本文旨在通过一个简单的登录示例项目,详细介绍如何在Netbeans IDE环境下构建基于Struts...
4. **Service和DAO层**:创建业务服务层和数据访问对象层,Spring管理这些Bean并提供事务控制。 5. **数据访问**:使用Hibernate的Session和Criteria API进行数据库操作,或者使用HQL(Hibernate Query Language)...
Struts2、Spring2和Hibernate3是经典的Java Web开发框架组合,它们在企业级应用中广泛使用,构建了MVC(Model-View-Controller)架构的基础。这个完整的案例旨在展示如何将这三个框架集成,实现数据的增删查操作。...
Struts2、Spring3、Hibernate4、Maven和EasyUI是Java Web开发中常见的技术栈,它们各自在应用开发中扮演着重要的角色。这个视频教程应该是针对初学者,旨在介绍如何将这些技术整合到一起,构建一个完整的Web应用程序...
Struts2是一个基于MVC设计模式的Web应用框架,Spring2.5提供了全面的持久化、事务管理和依赖注入功能,而Hibernate3.3则是一个强大的对象关系映射(ORM)框架,用于简化数据库操作。 在这个整合中,jbpm4作为流程...