`
fishergay
  • 浏览: 33604 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts2.12+Spring3.2+hibernate4.2集成2

    博客分类:
  • SSH
 
阅读更多

1.在上一章我们把springhibernate已经整合了,接下来验证一下是否整合成功。

2.在项目中添加一个实体类User

package com.lysoft.bean.user;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "t_user")
public class User implements Serializable {
	private static final long serialVersionUID = 4239100106344646509L;
	private Integer id;
	private String userName;
	private String firstName;
	private Date createTime;

	@Id @GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 50, nullable = false)
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	@Temporal(TemporalType.TIMESTAMP)
	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

}

3. 为了项目简化项目的CRUD,抽取出通用的接口来进行操作。

Dao层代码

package com.lysoft.dao.base;

import java.io.Serializable;
import java.util.List;

/**
 * 通用Dao接口
 * @author liang
 * @param <T> 实体对象
 * @param <PK> 主键
 */
public interface IBaseDao<T extends Serializable, PK extends Serializable> {
	/**
	 * 保存实体
	 * @param entity
	 */
	public void add(T entity);
	
	/**
	 * 删除实体
	 * @param ids
	 */
	public void delete(PK... ids);
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 添加或更新实体
	 * @param entity
	 */
	public void addOrUpdate(T entity);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T find(PK id);
	
	/**
	 * 查询实体, 使用get方式, 不支持延迟加载
	 * @param id
	 * @return
	 */
	public T get(PK id);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T load(PK id);
	
	/**
	 * 获取记录总数
	 * @return
	 */
	public Long getCount();
	
	/**
	 * 查询所有实体
	 * @return
	 */
	public List<T> listAll();

	/**
	 * 执行SQL 放入一级缓存
	 */
	public void flush();
	
	/**
	 * 从一级缓存中清楚某个对象
	 * @param entity
	 */
	public void evict(T entity);
	
	/**
	 * 清理一级缓存
	 */
	public void clear();	

}

 

package com.lysoft.dao.base.hibernate;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.lysoft.dao.base.IBaseDao;

public abstract class BaseHibernateDao<T extends Serializable, PK extends Serializable> implements IBaseDao<T, PK> {
	
	private Class<T> entityClass;
	
	@Resource
	private SessionFactory sessionFactory;
	
	public Session getSession() {
		return sessionFactory.getCurrentSession();
	}
	
	@PostConstruct
    @SuppressWarnings("unchecked")
    public void init() {
		//getClass()是多态的,指的是运行期间的对象所属的类型
		//如:UserDaoImpl extends BaseHibernateDao 即运行期间getClass()的类型是UserDaoImpl
        this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

	@Override
	public void add(T entity) {
		getSession().save(entity);
	}

	@Override
	public void delete(PK... ids) {
		if (null != ids) {
			for (Serializable id : ids) {
				getSession().delete(getSession().load(entityClass, id));
			}
		}
	}
	
	public void addOrUpdate(T entity) {
		getSession().saveOrUpdate(entity);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T find(PK id) {
		return (T) getSession().load(entityClass, id);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public T get(PK id) {
		return (T) getSession().get(entityClass, id);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public T load(PK id) {
		return (T) getSession().load(entityClass, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> listAll() {
		return getSession().createQuery("from " + getEntityName(entityClass)).list();
	}

	@Override
	public void update(T entity) {
		getSession().update(entity);
	}

	@Override
	public Long getCount() { 
		return (Long)getSession().createQuery("select count(" + getCountField(entityClass) + ") from " + getEntityName(entityClass) + " as o").uniqueResult();
	}
	
	@Override
	public void clear() {
		getSession().clear();
	}

	@Override
	public void evict(T entity) {
		getSession().evict(entity);
	}

	@Override
	public void flush() {
		getSession().flush();
	}
	
	/**
	 * 获取实体类名称
	 * @param <E>
	 * @param entityClass
	 * @return
	 */
	private static <E> String getEntityName(Class<E> entityClass) {
		String entityName = entityClass.getSimpleName();
		Entity entity = entityClass.getAnnotation(Entity.class);
		//如果实体类Entity注解上面重命名了实体名称
		if (null != entity.name() && !"".equals(entity.name())) {
			entityName = entity.name();
		}
		return entityName;
	}
	
	/**
	 * 获取统计属性,该方法是为了解决hibernate解析联合主键select count(o) from Xxx o
	 * 语句BUG而增加,hibernate对此hql解析后的sql为select count(field1,field2,...),显示使用count()统计多个字段是错误的
	 * @param <E>
	 * @param clazz
	 * @return
	 */
	private static <E> String getCountField(Class<E> clazz) {
		String out = "o";
		try {
			PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
			for (PropertyDescriptor propertydesc : propertyDescriptors) {
				Method method = propertydesc.getReadMethod();
				if (method != null && method.isAnnotationPresent(EmbeddedId.class)) {					
					PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
					out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class") ? ps[1].getName() : ps[0].getName());
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
        return out;
	}

}

 Service层代码

package com.lysoft.service.base;

import java.io.Serializable;
import java.util.List;

/**
 * 通用Service接口
 * @author liang
 * @param <T> 实体对象
 * @param <PK> 主键
 */
public interface IBaseService<T extends Serializable, PK extends Serializable>  {
	/**
	 * 保存实体
	 * @param entity
	 */
	public void add(T entity);
	
	/**
	 * 删除实体
	 * @param ids
	 */
	public void delete(PK... ids); 
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 添加或更新实体
	 * @param entity
	 */
	public void addOrUpdate(T entity);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T find(PK id);
	
	/**
	 * 查询实体, 使用get方式, 不支持延迟加载
	 * @param id
	 * @return
	 */
	public T get(PK id);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T load(PK id);
	
	/**
	 * 获取记录总数
	 * @return
	 */
	public Long getCount();
	
	/**
	 * 查询所有实体
	 * @return
	 */
	public List<T> listAll();
	
	/**
	 * 执行SQL 放入一级缓存
	 */
	public void flush();
	
	/**
	 * 从一级缓存中清楚某个对象
	 * @param entity
	 */
	public void evict(T entity);
	
	/**
	 * 清理一级缓存
	 */
	public void clear();
	
}

 

package com.lysoft.service.base.impl;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import com.lysoft.dao.base.IBaseDao;
import com.lysoft.service.base.IBaseService;

public abstract class BaseServiceImpl<T extends Serializable, PK extends Serializable> implements IBaseService<T, PK> {

	@Resource
	protected IBaseDao<T, PK> hibernateDao;

	@Override
	public void add(T entity) { 
		hibernateDao.add(entity);
	}
 
	@Override
	public void delete(PK... ids) {
		hibernateDao.delete(ids);
	} 
	
	public void addOrUpdate(T entity) {
		hibernateDao.addOrUpdate(entity);
	}

	@Override
	public T find(PK id) {
		return hibernateDao.find(id);
	}
	
	@Override
	public T get(PK id) {
		return hibernateDao.get(id);
	}
	
	@Override
	public T load(PK id) {
		return hibernateDao.load(id);
	}

	@Override
	public Long getCount() {
		return hibernateDao.getCount();
	}

	@Override
	public List<T> listAll() {
		return hibernateDao.listAll();
	}

	@Override
	public void update(T entity) {
		hibernateDao.update(entity);
	}
	
	@Override
	public void clear() {
		hibernateDao.clear();
	}

	@Override
	public void evict(T entity) {
		hibernateDao.evict(entity);
	}

	@Override
	public void flush() {
		hibernateDao.flush();
	}
	
}

 4. junit测试, 需要加入jar包 junit-4.11.jar  hamcrest-core-1.3.jar  hamcrest-library-1.3.jar

package com.lysoft.service.user.impl;

import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;

import java.util.Date;

import javax.annotation.Resource;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.lysoft.bean.user.User;
import com.lysoft.service.user.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-*.xml")
@Transactional
public class UserServiceImplTest {

	@Resource
	private UserService userService;
	private User user;
	private int userId;
	
	@Before
	public void initData() {
		user = new User();
		userId = 20633;
		user.setId(userId);
		user.setUserName("20130339");
		user.setFirstName("张三");
		user.setCreateTime(new Date());
	}
	
	@Test
	public void testAdd() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testDelete() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testFind() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testGet() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testLoad() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		u = userService.load(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testGetCount() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		long count = userService.getCount();
		assertThat(count, greaterThan(0L));
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testUpdate() {
		userService.add(user);
		
		User u = userService.find(userId);
		u.setUserName(u.getUserName() + "modify");
		userService.update(u);
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

}

5.在数据库中手动创建一个库,名称叫ssh2,并修改spring 配置文件中数据源的数据库名称.

6.运行UserServiceImplTest 类当中的testAdd方法,测试通过,会在数据库中生成一张t_user表。我测试了这个类中的所有方法都通过测试。

 

 

 

 

分享到:
评论
2 楼 blue_1110 2013-07-16  
如何这些代码中,写入了其他的serviceImpl,就会报错
1 楼 sunlongan666 2013-05-23  
缺少UserService,望楼主不全

相关推荐

    Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3 开发示例

    Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例代码。 其中包括如下文件: 介绍文档 Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例.docx Eclipse工程文件 SSH2.zip Zip包是Eclipse...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    总结来说,这个demo项目提供了一个学习和实践Struts1.2、Spring2.5和Hibernate3.2集成的平台,涵盖了MVC设计模式、依赖注入、面向切面编程和对象关系映射等多个关键概念。通过深入研究和修改这个项目,开发者能够...

    struts2+spring2.5+hibernate3.2整合完整项目,带数据库脚本

    Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...

    Struts2.12+Spring3.2+hibernate4.2集成示例代码

    Struts2.12、Spring3.2和Hibernate4.2是Java开发中经典的MVC框架集合,常用于构建企业级Web应用。这个集成示例代码提供了如何将这三个框架协同工作的详细步骤,使得开发者能够更好地理解和掌握它们的交互机制。 ...

    struts2.3.12+spring3.2+hibernate4.1.9 web网站框架

    前几天更换了最新版本的ssh,发现这次变化还是挺大的,费了很大劲才整理好,这是我整理的struts2.3.12+spring3.2+hibernate4.1.9 web网站框架,希望大家用的时候可以省点事吧,里面有用spring代理写的接口调用。

    cdst ssh代码生成器,免费的,功能强悍的struts2+spring2.5+hibernate3.2的一套 代码生成系统。.zip

    cdst ssh代码生成器,免费的,功能强悍的struts2+spring2.5+hibernate3.2的一套 代码生成系统。.zip cdst ssh代码生成器,免费的,功能强悍的struts2+spring2.5+hibernate3.2的一套 代码生成系统。.zip cdst ssh代码...

    struts2.5.0+spring4.1.6+hibernate4.2jar包

    这个"struts2.5.0+spring4.1.6+hibernate4.2jar包"包含了这三个框架的特定版本,为开发者提供了一个集成的开发环境。下面将详细阐述这三个框架及其整合的关键知识点。 Struts2是MVC(Model-View-Controller)设计...

    struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版

    struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...

    struts2.3+spring3.2+hibernate4.2

    Struts2.3、Spring3.2和Hibernate4.2是三个非常重要的Java Web开发框架,它们在企业级应用中广泛使用。这篇文章将详细介绍这三个框架的整合过程以及各自的核心功能。 Struts2是一个基于MVC(Model-View-Controller...

    struts2+spring2.5+Hibernate3.2整合示例

    Struts2、Spring和Hibernate是Java Web开发中的三...以上就是关于“Struts2+Spring2.5+Hibernate3.2整合示例”的主要知识点,这个整合实例涵盖了Java Web开发中的重要技术,对于开发者来说,深入学习和实践将非常有益。

    struts2.1 + spring 2.5 + hibernate 3.2 增删改查

    总结来说,"struts2.1 + spring 2.5 + hibernate 3.2 增删改查"的例子涵盖了Web应用开发中的核心部分:前端请求处理(Struts2)、业务逻辑管理(Spring)和数据库操作(Hibernate)。这个例子为初学者提供了一个很好...

    Struts2+spring2.0+hibernate3.2

    Struts2+spring2.0+hibernate3.2整合带全部jar包 Struts2+spring2.0+hibernate3.2整合带全部jar包 Struts2+spring2.0+hibernate3.2整合带全部jar包

    Struts2+Spring2.5+Hibernate3.2集成实例开发2

    Struts2+Spring2.5+Hibernate3.2集成实例开发2 Struts2+Spring2.5+Hibernate3.2集成实例开发2

    struts2+spring4.0+hibernate4.2集成

    本demo采用struts2+spring4.0+hibernate4.2框架集成(内部包含所有jar包),有最dao最底层的代码,可在项目中直接使用,并实现了一个简单的登陆和查询,代码均测试通过,为打ssh框架的同学提供方便哦

    用户登录(Struts1.2+Spring2.5+Hibernate3.2)

    1、可以运行(发布后,删除\Tomcat 6.0\webapps\ssh\WebRoot\WEB-INF\lib下的asm-2.2.3.jar) 2、采用Struts1.2 + Spring2.5 + Hibernate3.2 整合开发 3、SSH入门级实例

    SSH整合(Spring3.2+Struts2.3.12+Hibernate4.2)学习

    最新版SSH整合(Spring3.2+Struts2.3.12+Hibernate4.2)学习最新版SSH整合(Spring3.2+Struts2.3.12+Hibernate4.2)学习最新版SSH整合(Spring3.2+Struts2.3.12+Hibernate4.2)学习最新版SSH整合(Spring3.2+Struts...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...

    Struts2+Spring2.5+Hibernate3.2集成实例开发

    Struts2+Spring2.5+Hibernate3.2集成实例开发 附带我本人写的一个实例,如果默认数据库Oracle10g ,可以根据实际情况调整;文件较大,分为两个部分下载,同时下在完成后,执行Struts2+Spring+Hibernate.part1.rar...

Global site tag (gtag.js) - Google Analytics