先看一下结构图(点击下图看大图)
说明:
红色部门是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 框架整合实例,详细配置文件
J2EE SSH2架构设计 Struts2.1.8+Spring2.5.6+Hibernate3.3整合,采用AOP事务管理方式
J2EE流行框架(SSH)
J2ee Struts,Spring Framework,Hibernate 经典结合,项目源码。控制层、数据层、业务层分层 架构经典搭配,学习、研究的好东西。
详细讲解Struts+Spring+Hibernate整合过程,有截图。
压缩文件中包含所有的jar,coding中有笔记一步一步的教你如何添加他们 ,非常详尽的说明
J2EE的SSH框架是当前业内比较流行的主流开发框架,此文档详细介绍了搭建SSH框架的步骤以及配置文件的配置!
此ppt主要讲解了J2EE,包括SSH框架,以及具体的操作和代码
J2EE SSH2架构 Spring2.5.6+Struts2.1.8+hibernate3.3 采用struts2、spring2.5、hibernate3设计的demo集成
J2EE SSH框架(Struts,Spring,hibernate)学习笔记
通过实例展示了ssh框架的结构,适用于初学者
j2ee框架笔记1-JSP+JDBC_假分页笔记.pdf2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记.pdf
J2EE SSH事务配置 J2EE SSH事务配置 J2EE SSH事务配置 J2EE SSH事务配置
J2EE高级框架实战J2EE高级框架实战J2EE高级框架实战 几十个J2EE高级框架实战的PDF
完整的系统源码,个人理财管理平台,采用web应用的典型框架,集成Struts2、Spring以及hibernate框架。其中包括股票、基金以及存款投资产品的登记管理功能,并且在交易时间可以动态获取最新股票信息。 包括源码...
SSH技术字典,这样可以方便SSH架构的设计,主流J2EE框架设计,希望各位喜欢
J2EE 里 SSH框架理论复习,里面包含了Java、Servlet、SSH等技术
J2EE SSH Ajax 做了详细的介绍
基本SSH框架实现,李刚轻量级SSH框架上的源码,Struts2+Spring3+Hibernate3,做为初学者是个很不错的学习源码!