Spring+Hibernate整合 火推06

2018-01-13 11:14:02来源:oschina作者:1350048638人点击

分享
Spring+Hibernate整合

结构图:



搭建步骤:


1:导包

org.springframework
spring-orm
4.3.7.RELEASE

2:配置hibernateTemplate(applicationContext.xml中)




3:配置sessionFactory(applicationContext.xml中)





4:开启hibernate事务




5:启用事务注解


6:将hibernate.cfg.xml中的jdbc连接信息,注释掉

重构代码,使用hibernate进行数据查询:


1:将原来的jdbc实现类中的注解注释掉
2:增加NoteDao的接口实现类(使用hibernateTemplate)
3:在写操作的action头部,增加注解,使其变为可读可写状态

代码如下:


HibernateDaoImpl.java:


@Repository
public class HibernateDaoImpl implements NoteDao{
@Resource
private HibernateTemplate hibernateTemplate;@Override
public List queryNoteByuserId(Integer userId) {
String hql = "from Note where userId=?";
List list = (List) hibernateTemplate.find(hql, userId);
return list;
}
@Override
public int deleteNoteById(Integer id) {
Note note = hibernateTemplate.get(Note.class, id);
if (note != null) {
hibernateTemplate.delete(note);
return 1;
}
return 0;
}
}

DeleteAction.java:


增加注解:
@Transactional(readOnly=false)//默认是true,为只读状态,false是可读可写状态

重新部署启动,查看结构和控制台


OpenSessionInViewFilter

需求:



请求流程:


问题流程:
/listDetail.do-->filter-->action--->DAO(service)-->hibernate(session关闭)--->result--->listDetail.jsp(note)
解决方法:
/listDetail.do-->filter-->action--->DAO(service)-->hibernate(session不关闭)--->result--->listDetail.jsp(note)

如何让session不关闭:


将session交给spring来处理---OpenSessionInViewFilter可以集中管理sessionFactory

需要在web.xml中配置:


需要注意的是:此filter必须在struts2配置文件之前(有加载顺序的问题)


nosession
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter


nosession
/*

开发步骤:


1:配置struts.xml中action组件


/WEB-INF/jsp/listDetail.jsp

2:增加listDetail.jsp文件

笔记详情


发布时间:${note.publishTime }


收藏人数:${note.likeCount }


笔记内容:${note.context }


3:增加listDetailAction.java @Controller
@Scope("prototype")
public class ListDetailAction {
private Integer id;//接收笔记主键ID
public Note note;//前端传值${note.publishTime}
@Resource
private NoteDao noteDao;
public String execute(){
note = noteDao.queryNoteById(id);
return "success";
}
public Note getNote() {
return note;
}
public void setNote(Note note) {
this.note = note;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
4:在NoteDao中,增加查询方法
/**
* 根据笔记主键ID,查询笔记详情
* @param id
* @return
*/
public Note queryNoteById(Integer id);
5:实现接口方法(先使用get后使用load)
@Override
public Note queryNoteById(Integer id) {
//Note note = hibernateTemplate.get(Note.class, id);
Note note = hibernateTemplate.load(Note.class, id);
return note;
}
6:在web.xml中配置组件,解决nosession问题


nosession
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter


nosession
/*

7:部署,启动,访问ManyToOne、OneToMany

需求:



开发步骤:


1:修改Note.java文件,增加Usernote变量,并增加getter和setter方法
@ManyToOne//多对1
@JoinColumn(name="userId")//关联字段----一般建议将外键进行注释取消
public Usernote usernote;
2:注释掉Note.java中外键字段userId
3:在Usernote.java文件中,增加note列表变量,增加getter和setter方法
@OneToMany//1对多
@JoinColumn(name="userId")
public List notes;4:修改listDetail.jsp文件,增加C标签

笔记详情


发布时间:${note.publishTime }


发布人:${note.usernote.username }


收藏人数:${note.likeCount }


笔记内容:${note.context }


其它笔记内容:



${note1.context }

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>二级缓存、查询缓存

一级缓存:


session独享

二级缓存:


需求增加配置,并且依赖于配置内存文件echcache.xml---内存、磁盘
session共享

目的:


第一次进行数据查询的时候,此时缓存中是没有对象数据,则开启事务,进行sql查询,第二次进行相同数据查询的时候,此时缓存中是已经存在之前查询过的数据,则直接从缓存中获取,而非查询数据库执行sql
为了提高程序的性能和降低数据库访问的压力瓶颈
true

org.hibernate.cache.ehcache.EhCacheRegionFactory

实体对象类中,增加缓存注解:
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

查询缓存:


依赖于二级缓存,如果说想使用查询缓存,则前提条件,必须开启二级缓存
true
hibernateTemplate.setCacheQueries(true);//开启查询缓存

使用:


1:导包

org.hibernate
hibernate-ehcache
4.2.21.Final
nginx+tomcat集群

参考资料:


https://mp.weixin.qq.com/s?_biz=MzIxMjg4NDU1NA==&mid=2247483847&idx=1&sn=4d3c6d6c331342cc930cb4cfc0ca465c&chksm=97be0ce2a0c985f427f0462a9be9dd49b963a1e09ea86ef68f081afb8a21f96f247708fbc52d&scene=21#wechatredirect

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台