1.在上一章我们把spring和hibernate已经整合了,接下来验证一下是否整合成功。
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表。我测试了这个类中的所有方法都通过测试。
相关推荐
Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例代码。 其中包括如下文件: 介绍文档 Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例.docx Eclipse工程文件 SSH2.zip Zip包是Eclipse...
总结来说,这个demo项目提供了一个学习和实践Struts1.2、Spring2.5和Hibernate3.2集成的平台,涵盖了MVC设计模式、依赖注入、面向切面编程和对象关系映射等多个关键概念。通过深入研究和修改这个项目,开发者能够...
Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...
Struts2.12、Spring3.2和Hibernate4.2是Java开发中经典的MVC框架集合,常用于构建企业级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.5.0+spring4.1.6+hibernate4.2jar包"包含了这三个框架的特定版本,为开发者提供了一个集成的开发环境。下面将详细阐述这三个框架及其整合的关键知识点。 Struts2是MVC(Model-View-Controller)设计...
struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...
Struts2.3、Spring3.2和Hibernate4.2是三个非常重要的Java Web开发框架,它们在企业级应用中广泛使用。这篇文章将详细介绍这三个框架的整合过程以及各自的核心功能。 Struts2是一个基于MVC(Model-View-Controller...
Struts2、Spring和Hibernate是Java Web开发中的三...以上就是关于“Struts2+Spring2.5+Hibernate3.2整合示例”的主要知识点,这个整合实例涵盖了Java Web开发中的重要技术,对于开发者来说,深入学习和实践将非常有益。
总结来说,"struts2.1 + spring 2.5 + hibernate 3.2 增删改查"的例子涵盖了Web应用开发中的核心部分:前端请求处理(Struts2)、业务逻辑管理(Spring)和数据库操作(Hibernate)。这个例子为初学者提供了一个很好...
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
本demo采用struts2+spring4.0+hibernate4.2框架集成(内部包含所有jar包),有最dao最底层的代码,可在项目中直接使用,并实现了一个简单的登陆和查询,代码均测试通过,为打ssh框架的同学提供方便哦
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+Struts...
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
Struts2+Spring2.5+Hibernate3.2集成实例开发 附带我本人写的一个实例,如果默认数据库Oracle10g ,可以根据实际情况调整;文件较大,分为两个部分下载,同时下在完成后,执行Struts2+Spring+Hibernate.part1.rar...