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表。我测试了这个类中的所有方法都通过测试。
相关推荐
这是一个struts 1.2 + spring 2.5 + hibernate 3.2框架demo, 运行环境为eclipse 3.2 + tomcat 5.5 + oracle 11g
Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例代码。 其中包括如下文件: 介绍文档 Struts2.3 + Spring3.2 + Hibernate4.1 + HTML5 + CSS3开发示例.docx Eclipse工程文件 SSH2.zip Zip包是Eclipse...
struts2+spring2.5+hibernate3.2整合完整项目,带数据库脚本 ,mysql,tomcat,myeclipse完整工程
struts2.3+spring3.2+hibernate4.2整合,项目环境我搭建好了,大家可以参考学习 有好的建议希望多提出来!
struts2.5.0+spring4.1.6+hibernate4.2jar包
个人总结的搭建 Struts2.0 + Hibernate3.2 + Spring2.5 的说明 包含了所有jar包的名称以及有冲突jar包的名称(以便删除)。
前几天更换了最新版本的ssh,发现这次变化还是挺大的,费了很大劲才整理好,这是我整理的struts2.3.12+spring3.2+hibernate4.1.9 web网站框架,希望大家用的时候可以省点事吧,里面有用spring代理写的接口调用。
struts2.1 + spring 2.5 + hibernate 3.2 增删改查 详细例子
Struts2+hibernate3.2+Spring2.0架构搭建的菜鸟实例,按照每一步搭建自己的软件架构
cdst ssh代码生成器,免费的,功能强悍的struts2+spring2.5+hibernate3.2的一套 代码生成系统。.zip cdst ssh代码生成器,免费的,功能强悍的struts2+spring2.5+hibernate3.2的一套 代码生成系统。.zip cdst ssh代码...
struts2+Spring2.5+Spring3.2)实现登录.struts2+Spring2.5+Spring3.2)实现登录.struts2+Spring2.5+Spring3.2)实现登录。
struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...
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框架的同学提供方便哦
完整的struts1.2+hibernate3.2+spring2.5框架集成 完整的dwr2.0+spring2.5集成 处理的dwr2.0+hibernate3.2集成的问题
struts2+spring2.5+hibernate3.2 找了半天没看到。自己整了一个。
ssh(struts2.3.4+spring3.2+hibernate4.1.1)整合中jar包作用介绍 讲得很详细
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...