我在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; } } }
相关推荐
《轻量级Java EE企业应用实战:Struts2+Spring3+Hibernate整合开发(第3版)》介绍了Java EE领域的三个开源框架:Struts 2、Spring和Hibernate。其中Struts 2升级到2.2.1,Spring升级到3.0.5,Hibernate升级到了...
用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统。 其中用Dwr去进行用户注册的用户是否存在的验证。 全部业务控制交由Spring去进行处理。事务处理也...
《轻量级Java EE企业应用实战:Struts2+Spring3+Hibernate整合开发(第3版)》介绍了Java EE领域的三个开源框架:Struts 2、Spring和Hibernate。其中Struts 2升级到2.2.1,Spring升级到3.0.5,Hibernate升级到了...
struts2.3.4+spring3.2.0+hibernate4+hibernate_generic_dao struts hibernate spring最大化使用注释 基于spring的远程调用
SSH整合示例(详情见我博客专栏)之前的博客我们总结了spring基础、spring分别整合struts2、hibernate、mybatis等,今天我们来同时整合下 struts、spring、hibernate,也就是所谓的 ssh 。 整合流程: 1 首先整合...
使用struts2、hibernate、spring、dwr整合的简单项目。包括级联等 注意:csdn上面显示为chm文件。该文件为.7z的压缩文件。用压缩软件可以打开的 csdn弄错了
1. word文档记录了Struts2+Hibernate3+Spring2.5整合详细步骤,附有操作步骤的图示参考,并给出了各个步骤的注意事项; 2. 源代码实例包括一个完整模块的增删改查操作,可直接运行,可以在此基础上直接进行自己系统...
总结,该例示注释非常详细,演示Spring托管Hibernate和Struts的Action, 以及Spring的事务声明(包括1.x与2.x的用法)与非事务声明的使用方式。 使用DWR可以方便的使用Spring托管的持久层功能。 目的:希望广大Java...
基于struts+spring+hibernate开发的人力资源管理系统,人事管理系统,是初学者的首选的好例子!希望能给大家带来学习的用处!~~~~
本demo采用struts2+spring4.0+hibernate4.2框架集成(内部包含所有jar包),有最dao最底层的代码,可在项目中直接使用,并实现了一个简单的登陆和查询,代码均测试通过,为打ssh框架的同学提供方便哦
采用Struts2+Spring2.5+Hibernate3.2 直接使用 Dao层,去除业务层
《轻量级Java EE企业应用实战:Struts2+Spring3+Hibernate整合开发(第3版)》介绍了Java EE领域的三个开源框架:Struts 2、Spring和Hibernate。其中Struts 2升级到2.2.1,Spring升级到3.0.5,Hibernate升级到了...
12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...
Struts2+Hibernate+Spring整合实例,登陆注册实例,简单来说,Spring通过IoC容器上管(Struts2)Action的创建并依赖注入给控制器,下管(hibernate)SessionFactory的创建并依赖注入给DAO组件,是一个巨大的工厂
NULL 博文链接:https://jsrookie.iteye.com/blog/294756
1)JSP+javabean+DAO(Ajax:anywhere) 2)Struts+spring+hibernate3(AJax:DOJO) 3)JSF+richfaces+seam+EJB 总共3个完整的实例,并配有需求分析~~~~~~~~,绝对经典!
struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+...
《轻量级Java EE企业应用实战:Struts2+Spring3+Hibernate整合开发(第3版)》介绍了Java EE领域的三个开源框架:Struts 2、Spring和Hibernate。其中Struts 2升级到2.2.1,Spring升级到3.0.5,Hibernate升级到了...
MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5的,hibernate版本较多些至3.2,首先选版本就选择最优的,struts2没的选只有2.1.6版的,所以先导入struts2支持,然后是spring选的是2.0,问题就出在...
struts2+spring+hibernate这个小项目实现了对Equipment的增删改查操作 对初学者有很大的帮助。完整版。包括了dao,action,domain,service,util。