先看一下结构图(点击下图看大图)
说明:
红色部门是DAO
蓝色部门是SERVICE
绿色部门是ACTION(或是Spring的Controller)
DAO部分说明
BaseDao是基类,所有的DAO都继承此BaseDao,BaseDao继承了HibernateDaoSupport,用HibernateTemplate实现了一些基础的方法(插删改查),以下是代码
package com.thd.dao;
import java.io.Serializable;
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;
import com.thd.bean.Page;
import com.thd.util.MyBeanUtils;
public class BaseDao extends HibernateDaoSupport {
/**
* @description 保存对象
* @param obj 保存的对象
*/
public void save(Object obj) {
this.getHibernateTemplate().save(obj);
};
/**
* @description 更新对象
* @param obj 更新的对象
*/
public void update(Object obj) {
this.getHibernateTemplate().update(obj);
}
/**
* @description 根据参数对象更新数据库对象
* @param original 根据此对象不为空的属性更新数据库中的对象
* @param id 需要更新对象的id
* @param nullProperties 需要设置为空的属性
* @throws Exception
*/
public void update(Object original,Serializable id,String[] nullProperties) throws Exception{
Object dest = this.findById(original.getClass(), id);
MyBeanUtils.copyNotNullProperties(dest, original);
MyBeanUtils.setObjNullProperties(dest, nullProperties);
this.getHibernateTemplate().update(dest);
}
/**
* @description 删除对象
* @param obj 删除的对象 对象要有主键
*/
public void delete(Object obj) {
this.getHibernateTemplate().delete(obj);
}
/**
* @description 根据id删除对象
* @param c 删除的对象类型
* @param id 删除的对象的主键
*/
public void delete(Class c,Serializable id){
Object obj = findById(c,id);
this.delete(obj);
}
/**
* @description 保存或更新对象
* @param obj 保存或更新的对象 有主键则是更新 没有主键则是保存
*/
public void saveOrUpdate(Object obj){
this.getHibernateTemplate().saveOrUpdate(obj);
}
/**
* @description 根据id查找对象
* @param c 对象的类
* @param id 对象的id
* @return
*/
@SuppressWarnings("unchecked")
public Object findById(Class c,Serializable id){
return this.getHibernateTemplate().get(c, id);
}
/**
* @description hql基础查询
* @param hql hql查询语句
* @param params 条件的值,对应hql中的"?"
* @param currPage 当前页
* @param pageSIze 每页显示条目数量
* @return
*/
@SuppressWarnings("unchecked")
public List<Object> findByHql(final String hql,final Object[] params,final int currPage,final int pageSize) {
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(hql);
if(params!=null && params.length>0){
for(int i = 0 , j = params.length ; i < j ; i++){
query.setParameter(i,params[i]);
}
}
if (currPage >= 1 && pageSize >= 1) {
query.setFirstResult((currPage - 1) * pageSize);
query.setMaxResults(pageSize);
}
return query.list();
}
});
}
/**
* @description 无参数的hql全部记录查询
* @param hql hql语句
* @return
*/
public List findByHql(String hql){
return findByHql(hql,null,0,0);
}
/**
* @description 带有参数的hql全部记录查询
* @param hql hql语句
* @param params 条件的值,对应hql中的"?"
* @return
*/
@SuppressWarnings("unchecked")
public List<Object> findByHql(final String hql,final Object[] params) {
return findByHql(hql,params,0,0);
}
/**
* @description 不带参数的hql分页查询
* @param hql hql语句
* @param currPage 当前页
* @param pageSize 每页显示条目数量
* @return
*/
public List<Object> findByHql(String hql,int currPage,int pageSize) {
return findByHql(hql,null,currPage,pageSize);
}
/**
* @description sql基础查询
* @param sql sql语句
* @param params 条件的值,对应sql语句中的"?"
* @param currPage 当前页
* @param pageSize 每页显示条目数量
* @return
*/
@SuppressWarnings("unchecked")
public List<Object> findBySql( final String sql,final Object[] params,final int currPage, final int pageSize) {
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException,SQLException {
Query query = s.createSQLQuery(sql);
if(params!=null && params.length>0){
for(int i = 0 , j = params.length ; i < j ; i++){
query.setParameter(i,params[i]);
}
}
if (currPage >= 1 && pageSize >= 1) {
query.setFirstResult((currPage - 1) * pageSize);
query.setMaxResults(pageSize);
}
List list = query.list();
return list;
}
});
}
/**
* @description 不带参数的sql全部记录查询
* @param sql sql语句
* @return
*/
public List<Object> findBySql(final String sql) {
return this.findBySql(sql, null, 0, 0);
}
/**
* @description 带参数的sql全部记录查询
* @param sql
* @param params
* @return
*/
@SuppressWarnings("unchecked")
public List<Object> findBySql(final String sql,final Object[] params) {
return this.findBySql(sql, params, 0, 0);
}
/**
* 不带参数的sql分页查询
* @param sql sql语句
* @param currPage 当前页
* @param pageSize 每页显示条目数量
*/
public List<Object> findBySql(final String sql,int currPage,int pageSize) {
return this.findBySql(sql, null, currPage, pageSize);
}
/**
* @description 执行sql语句
* @param sql
*/
@SuppressWarnings("unchecked")
public void executeSql(final String sql) {
this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createSQLQuery(sql);
query.executeUpdate();
return null;
}
});
}
/**
* @description 执行带"?"的sql语句
* @param sql sql语句
* @param params 条件的值,对应sql语句中的"?"
*/
@SuppressWarnings("unchecked")
public void executeSql(final String sql,final Object[] params) {
this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createSQLQuery(sql);
if(params!=null && params.length>0){
for(int i = 0 , j = params.length ; i < j ; i++){
query.setParameter(i,params[i]);
}
}
query.executeUpdate();
return null;
}
});
}
public Object getOne(List<Object> l ){
if( (l!=null) && !l.isEmpty()){
if(l.get(0)!=null){
return l.get(0);
}else{
return null;
}
}else{
return null;
}
}
@SuppressWarnings("unchecked")
public List pageSQL(String sql,Object[] obj,Page page){
List allResult = this.findBySql(sql, obj);
if (allResult != null && !allResult.isEmpty()) {
int rowsNum = allResult.size();
int temp = rowsNum % page.getPageSize(); // 取模
int pageNum = 0;
if (temp > 0) {// 如果有余数
pageNum = rowsNum / page.getPageSize() + 1;
} else if (temp == 0)
pageNum = rowsNum / page.getPageSize();
page.setListSize(rowsNum);// 设置总记录条数
page.setMaxPage(pageNum);// 设置最大页数
return this.findBySql(sql.toString(), obj, page.getCurrentPage(), page
.getPageSize());
} else {
page.setListSize(0);
page.setMaxPage(0);
page.setCurrentPage(1);
return null;
}
}
@SuppressWarnings("unchecked")
public List pageHQL(String hql,Object[] obj,Page page){
List allResult = this.findByHql(hql, obj);
if (allResult != null && !allResult.isEmpty()) {
int rowsNum = allResult.size();
int temp = rowsNum % page.getPageSize(); // 取模
int pageNum = 0;
if (temp > 0) {// 如果有余数
pageNum = rowsNum / page.getPageSize() + 1;
} else if (temp == 0)
pageNum = rowsNum / page.getPageSize();
page.setListSize(rowsNum);// 设置总记录条数
page.setMaxPage(pageNum);// 设置最大页数
return this.findByHql(hql.toString(), obj, page.getCurrentPage(), page
.getPageSize());
} else {
page.setListSize(0);
page.setMaxPage(0);
page.setCurrentPage(1);
return null;
}
}
}
对于所有模块的DAO,Spring配置中都注入到了DaoFactory中,DaoFactory代码如下
package com.thd.dao;
import com.thd.dao.tree.TreeDao;
import com.thd.dao.user.UserDao;
public class DaoFactory {
private UserDao userDao;
private TreeDao treeDao;
public TreeDao getTreeDao() {
return treeDao;
}
public void setTreeDao(TreeDao treeDao) {
this.treeDao = treeDao;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
DaoFactory中有所有模块的DAO提供给Service使用。
SERVICE部门说明
BaseServiceImpl是所有模块Service的基类,BaseServiceImpl有DaoFactory的引用 还有ServiceFactory的引用(因为有可能一个Service调用另外一个Service的方法,所以引用了ServiceFactory,ServiceFactory在下面有说明),所有模块的Service继承BaseServiceImpl后就可以拿到所有的DAO和Service。ServiceFactory分为两种IocServiceFactoryImpl和InjectionServiceFactoryImpl,他们都实现了ServiceFactory接口(此接口有所有模块Service的Setter Getter方法),只不过Getter方式不同,一个是通过Spring IOC容器注入然后获取Service Bean,一个是通过代码拿到Spring IOC中的Service Bean.ServiceFactory的实现注入到BaseServiceImpl以提供给所有模块的Service。
IocServiceFactoryImpl的代码如下:
package com.thd.serviceimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.thd.service.ServiceFactory;
import com.thd.service.tree.TreeService;
import com.thd.service.user.UserService;
/**
* @description 此类是通过从Spring ioc容器中直接获取service的封装
*
*/
public class IocServiceFactoryImpl implements ServiceFactory {
private ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:appContext-*.xml");
public UserService getUserService(){
return (UserService)factory.getBean("userService");
};
public TreeService getTreeService(){
return (TreeService)factory.getBean("treeService");
};
}
InjectionServiceFactoryImpl的代码如下:
package com.thd.serviceimpl;
import com.thd.service.ServiceFactory;
import com.thd.service.tree.TreeService;
import com.thd.service.user.UserService;
/**
* @description 此类是通过注入的方式来封装所有的service
*
*/
public class InjectionServiceFactoryImpl implements ServiceFactory{
private UserService userService;
private TreeService treeService;
public TreeService getTreeService() {
return treeService;
}
public void setTreeService(TreeService treeService) {
this.treeService = treeService;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
Action部分说明
ServiceFactory被注入到PubAction ,所有模块的Action继承PubAction获取ServiceFactory来拿到所有的Service。
最后事务切的是Service层
这样配置后 所有模块的Action可以拿到所有模块的Service来进行操作,模块的Service可以拿到所有的DAO,以及可以做到Service之前的相互调用,我感觉很方便
附件中是源码和图片
大家评评这么配置的优点和缺点,有什么地方还有不足的还望指教
- 描述: SSH框架结构
- 大小: 110.1 KB
分享到:
相关推荐
《J2EE SSH框架整合详解》 在Java企业级开发中,SSH(Struts、Spring、Hibernate)框架的整合是常见的技术实践,它能够提供强大的表现层、业务逻辑层和数据持久化层的支持。SSH框架整合的核心在于如何将这三个框架...
在IT行业中,SSH框架是Java企业级开发中的一个重要组合,主要由Spring、Struts和Hibernate三个框架构成。这个"j2ee ssh 框架整合"主题深入...学习并实践这样的整合案例,有助于开发者更好地理解和掌握SSH框架的应用。
在Java企业级开发中,SSH框架整合是相当关键的一个环节,它涉及到Spring、Struts和Hibernate这三个主流的开源框架。SSH框架的整合可以提供强大的业务逻辑处理能力,以及高效的持久层支持,使得开发者能更专注于业务...
J2ee Struts,Spring Framework,Hibernate 经典结合,项目源码。控制层、数据层、业务层分层 架构经典搭配,学习、研究的好东西。
在IT行业中,SSH2(Struts2、Spring、Hibernate)是一种经典的Java企业级应用开发框架组合,用于构建高效、可维护且易于扩展的Web应用程序。本篇将详细讲解J2EE SSH2架构的设计原理和整合过程,以及Struts2.1.8、...
### J2EE流行框架(SSH)详解:Struts、Hibernate、Spring 在现代软件开发领域,尤其是企业级应用开发中,Java技术栈以其强大的生态体系和成熟的技术解决方案,占据着举足轻重的地位。其中,Struts、Hibernate、...
此ppt主要讲解了J2EE,包括SSH框架,以及具体的操作和代码
以下是这三大框架的核心概念和它们在J2EE SSH2架构中的作用。 1. **Spring框架** Spring是Java企业级应用的核心框架,它提供了一个全面的编程和配置模型,简化了Java应用的开发。在SSH2架构中,Spring主要负责依赖...
**J2EE框架详解——构建企业级应用的基石** J2EE(Java 2 Platform, ...通过理解J2EE框架结构及其组件,开发者可以更好地组织代码,实现模块化开发,并有效地利用服务器资源,构建出高性能、可维护的企业级应用。
这个框架组合提供了一种高效、灵活且可扩展的解决方案,用于构建基于J2EE的应用程序。本篇文章将深入探讨SSH框架的每一个组成部分,并通过一个简单的实例来展示它们如何协同工作。 **Spring框架** Spring是一个全面...
2. SSH 框架结构 SSH 框架是由 Spring、Struts 和 Hibernate 三个主要组件组成的。其中,Spring 提供了 IoC 容器和 AOP 功能,Struts 负责处理用户请求和视图渲染,Hibernate 负责数据库持久层的操作。 3. Spring ...
### J2EE SSH框架介绍与应用 #### 一、引言 随着信息技术的快速发展,Java技术在企业级应用开发中的地位越来越重要。J2EE(Java 2 Platform, Enterprise Edition)作为一套完整的Java企业级应用解决方案,其核心是...
根据给定文件中的标题、描述、标签以及部分内容,可以总结并生成以下与J2EE SSH框架相关的知识点: ### J2EE SSH框架理论复习 #### 一、基础知识回顾 1. **J2EE(Java 2 Platform, Enterprise Edition)**: - 是...
完整的系统源码,个人理财管理平台,采用web应用的典型框架,集成Struts2、Spring以及hibernate框架。其中包括股票、基金以及存款投资产品的登记管理功能,并且在交易时间可以动态获取最新股票信息。 包括源码...
**基于J2EE框架的SSH整合** 在Java企业级开发中,SSH(Spring、Struts、Hibernate)是一个常见的集成框架,用于构建高效、灵活且可维护的Web应用程序。SSH框架结合了Spring的依赖注入(DI)和面向切面编程(AOP),...
J2EE 的 SSH 框架的搭建和性能优化 摘要: 本文主要介绍了 J2EE 的 SSH 框架的搭建和性能优化。SSH 框架是当前 Java Web 应用程序开发中的一种流行的架构模式,由 Spring、Struts 和 Hibernate 三个组件组成。本文...
这个"j2ee项目SSH框架网上购物"压缩包包含了SQL脚本文件,这些脚本通常用于初始化数据库结构,包括创建表、索引、存储过程等。用户可以导入到数据库管理系统中执行,快速设置好项目所需的数据环境。 【标签】"整个...
基本SSH框架实现,李刚轻量级SSH框架上的源码,Struts2+Spring3+Hibernate3,做为初学者是个很不错的学习源码!