我在 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{@Overridepublic void save(Object object) {getHibernateTemplate().save(object);//System.out.println("save "+object.toString());}@Overridepublic void delete(Object object) {getHibernateTemplate().delete(object);}@Overridepublic void update(Object object) {getHibernateTemplate().update(object);//改用saveOrUpdate,在评价的时候,第一次创建的时候Save,其他时候Update//getHibernateTemplate().saveOrUpdate(object);//System.out.println("update "+object.toString());}@SuppressWarnings("unchecked")@Overridepublic Object ReadSingle(final String targetName,final String propertyName, final Object value) {// TODO Auto-generated method stubreturn (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")@Overridepublic List<Object> ReadAll(String targetName) {// TODO Auto-generated method stubString hql="from "+targetName;return getHibernateTemplate().find(hql);}@SuppressWarnings("unchecked")@Overridepublic List<Object> ReadByProperty(final String targetName, final String propertyName,final Object value) {// TODO Auto-generated method stubreturn (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简单很多@Overridepublic Object get(int id) {// TODO Auto-generated method stubreturn getHibernateTemplate().get(Object.class, id);}@Overridepublic List<Object> ReadByPropertyList(final String targetName,final List<String> propertyName, final List<Object> value) {// TODO Auto-generated method stubreturn (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没有任何继承关系,当然不能这样转换。@Overridepublic Integer ReadCount(final String targetName) {// TODO Auto-generated method stubreturn (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();}});}@Overridepublic List<Object> ReadLimitedByOrder(final String targetName,final String propertyName, final int num, final String order) {// TODO Auto-generated method stubreturn (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();}});}@Overridepublic List<Object> ReadAllByOrder(String targetName, String propertyName,String order) {// TODO Auto-generated method stubString 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;@Overridepublic void save(Object object) {// TODO Auto-generated method stubbaseDao.save(object);}@Overridepublic void update(Object object) {// TODO Auto-generated method stubbaseDao.update(object);}@Overridepublic void delete(Object object) {// TODO Auto-generated method stubbaseDao.delete(object);}@Overridepublic Object ReadByID(String targetName,int id) {// TODO Auto-generated method stubreturn baseDao.ReadSingle(targetName,"id", id);}@SuppressWarnings("rawtypes")@Overridepublic List ReadAll(String targetName) {// TODO Auto-generated method stubreturn baseDao.ReadAll(targetName);}@SuppressWarnings("rawtypes")@Overridepublic List ReadAllByOrder(String targetName,String propertyName,String order) {// TODO Auto-generated method stubreturn baseDao.ReadAllByOrder(targetName,propertyName,order);}public BaseDao getBaseDao() {return baseDao;}public void setBaseDao(BaseDao baseDao) {this.baseDao = baseDao;}@Overridepublic List ReadByProperty(String targetName, String propertyName,Object propertyValue) {// TODO Auto-generated method stubreturn baseDao.ReadByProperty(targetName, propertyName, propertyValue);}@Overridepublic Object ReadSingle(String targetName, String propertyName,Object propertyValue) {// TODO Auto-generated method stubreturn baseDao.ReadSingle(targetName, propertyName, propertyValue);}@Overridepublic int ReadCount(String targetName) {// TODO Auto-generated method stubreturn baseDao.ReadCount(targetName);}@Overridepublic List ReadLimitedByOrder(String targetName, String propertyName,int num, String order) {return baseDao.ReadLimitedByOrder(targetName,propertyName,num,order);}@Overridepublic List ReadByPropertyList(String targetName,List<String> propertyName, List<Object> propertyValue) {// TODO Auto-generated method stubreturn 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 {// Fieldsprivate 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;}}
}

Struts2 + Spring + Hibernate 通用 Service 和 DAO相关推荐

  1. struts2+spring+hibernate

    ---恢复内容开始--- Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sessio ...

  2. 【struts2+spring+hibernate】ssh框架整合开发

    SSH框架整合 1 Struts2+Spring+Hibernate导包 Struts2导入jar包: * struts2/apps/struts2-blank.war/WEB-INF/lib/*.j ...

  3. Struts2+Spring+Hibernate搭建全解!

    Struts2+Spring+Hibernate是J2EE的最新流行框架.本篇是我搭建这个框架的经验总结,有很多人搭建这个框架总会遇到 大大小小的问题,网上也没有什么行之有效的方案或成体系的介绍,所以 ...

  4. Java Web项目源代码|CRM客户关系管理系统项目实战(Struts2+Spring+Hibernate)解析+源代码+教程

    客户关系管理 (CRM) CRM一般指客户关系管理 客户关系管理是指企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方式,向客户提供创新 ...

  5. Struts2+Spring+Hibernate 三大框架的合并集成

    这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样. 首先看一下 ...

  6. Spring、Struts2+Spring+Hibernate整合步骤

    所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...

  7. 联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码

    联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码 客户拜访记录的列表的显示, 客户拜访记录的保存, 客户拜访记录查询(条件 ...

  8. Struts2+Spring+Hibernate的整合

    整体程序结构 1.maven依赖 <!--实现Struts2+Spring+Hibernate的整合 --><dependencies><!--Spring --> ...

  9. SSH之IDEA2017整合Struts2+Spring+Hibernate

    摘要 IDEA无疑是Java编程的利器,在下面我们将介绍如何使用IDEA来整合SSH(Struts2 + Spring + Hibernate):介绍將分为三个部分来讲,分别是新建工程,Spring引 ...

最新文章

  1. Sciences:用膳食纤维钓出15株缓解糖尿病的细菌!
  2. 马斯克:“星链”卫星已能提供服务
  3. python怎么读write_Python如何读写文件?python写入文件读写操作详解
  4. Timer的schedule和scheduleAtFixedRate方法的区别解析
  5. 【统计学习】多元统计分析
  6. matlab编程 英文翻译,MATLAB编程,MATLAB programming,音标,读音,翻译,英文例句,英语词典...
  7. Ubuntu 14.04 / 13.10 / 13.04 / 12.04使用PPA安装NVIDIA GeForce显卡驱动
  8. Castle 开发系统文章
  9. 【华为云技术分享】云图说 | 云硬盘还可以共享?!不了解你就out了
  10. q learning简单理解_如何用简单例子讲解 Q learning 的具体过程?
  11. vue视频保存不下来_视频素材制作小技巧
  12. Python单机版经典塔防游戏源代码
  13. HTML网上书店代码,jsp网上书店系统(附源代码)
  14. [国家集训队]Tree I
  15. 徕卡 sl android app,相机入魔 徕卡SL DPReview测评结论
  16. 解决regedit taskmgr不能启动
  17. 使用多种方法在Word方框中打对勾√和叉叉×
  18. mysql 最大值65536_SQL server事物复制报错:要复制的 LOB 数据的长度(xxxxx)超出了配置的最大值 65536...
  19. 北大计算机学霸,揭秘:2018北大在京录取的学霸们有何特长(组图)
  20. 整理2004-2018年地级市进出口贸易总额数据

热门文章

  1. CCF201409-3 字符串匹配(解法二)(100分)(废除!!!)
  2. 似然函数(likelihood function)
  3. windows tensorflow 版本与升级
  4. 深度学习框架 —— tflearn 的学习
  5. Python 编程规范 —— TODO 注释(结合 PyCharm)
  6. 使用 Java API 操作 HBase
  7. 硬币等于骰子(在统计学意义上)
  8. 10安装报错0x8007000d_windows10:MySQL8.0.22版本安装教程
  9. python历史上的今天_历史上的今天接口调用示例
  10. python学了真的很有用吗-学习Python真的有必要参加培训吗?老男孩Python学习机构...