Spring+Hibernate整合 火推06

 

Spring+Hibernate整合

結構圖:html

搭建步驟:前端

1:導包

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

2:配置hibernateTemplate(applicationContext.xml中)

    <!-- 配置hibernateTemplate -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

3:配置sessionFactory(applicationContext.xml中)

    <!-- 配置sessionfactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="c3p0"></property>
        <property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
    </bean>

4:開啓hibernate事務

    <!-- 配置事務 -->
    <bean id="txManger" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

5:啓用事務註解

    <!-- hibernate的代理註解事務
    transaction-manager:表明的是註解事務
    proxy-target-class:默認屬性值爲false,表明不開啓事務,也就是不支持事務註解,原生的jdk代理模式
                           若是屬性值爲true,則表明開啓事務註解,而且此時使用的事務代理模式爲cglib動態代理
                        若是屬性值爲true,annotation:默認支持的是隻讀狀態(readonly=true),
                            若是是寫操做,須要在action類名前面增長註解,屬性設置爲可讀可寫狀態(readonly=false)
 -->
<tx:annotation-driven transaction-manager="txManger" proxy-target-class="true"/>

6:將hibernate.cfg.xml中的jdbc鏈接信息,註釋掉

重構代碼,使用hibernate進行數據查詢:java

1:將原來的jdbc實現類中的註解註釋掉
2:增長NoteDao的接口實現類(使用hibernateTemplate)
3:在寫操做的action頭部,增長註解,使其變爲可讀可寫狀態

代碼以下:nginx

HibernateDaoImpl.java:web

@Repository
public class HibernateDaoImpl implements NoteDao{

    @Resource
    private HibernateTemplate hibernateTemplate;


    @Override
    public List<Note> queryNoteByuserId(Integer userId) {
        String hql = "from Note where userId=?";
        List<Note> list = (List<Note>) 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); //delete裏面是object類型,所以根據id查詢到的note用note傳值進行刪除
            return 1;
        }
        return 0;
    }

}

DeleteAction.java:spring

增長註解:

    @Transactional(readOnly=false)//默認是true,爲只讀狀態,false是可讀可寫狀態

從新部署啓動,查看結構和控制檯sql

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不關閉:tomcat

將session交給spring來處理---OpenSessionInViewFilter能夠集中管理sessionFactory

須要在web.xml中配置:

須要注意的是:此filter必須在struts2配置文件以前(有加載順序的問題)

<!-- 將session交給spring來處理,集中管理session的關閉 -->
<filter>
    <filter-name>nosession</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>nosession</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

開發步驟:

1:配置struts.xml中action組件

    <!-- 詳情功能action -->
    <action name="listDetail" class="listDetailAction" method="execute">
        <result name="success" type="dispatcher">/WEB-INF/jsp/listDetail.jsp</result>
    </action>

2:增長listDetail.jsp文件

    <h1>筆記詳情</h1>
    <h3>發佈時間:${note.publishTime }</h3>
    <h3>收藏人數:${note.likeCount }</h3>
    <h3>筆記內容:${note.context }</h3>

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問題

    <!-- 將session交給spring來處理,集中管理session的關閉 ,須要配置到struts2組件filter以前-->
    <filter>
        <filter-name>nosession</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>nosession</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

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<Note> notes;


4:修改listDetail.jsp文件,增長C標籤

    <h1>筆記詳情</h1>
    <h3>發佈時間:${note.publishTime }</h3>
    <h3>發佈人:${note.usernote.username }</h3>
    <h3>收藏人數:${note.likeCount }</h3>
    <h3>筆記內容:${note.context }</h3>

    <h1>其它筆記內容:</h1>
    <c:forEach items="${note.usernote.notes }" var="note1">
        ${note1.context }<br/>
    </c:forEach>


    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

二級緩存、查詢緩存

一級緩存:

session獨享

二級緩存:

需求增長配置,而且依賴於配置內存文件echcache.xml---內存、磁盤
session共享

目的:

第一次進行數據查詢的時候,此時緩存中是沒有對象數據,則開啓事務,進行sql查詢,第二次進行相同數據查詢的時候,此時緩存中是已經存在以前查詢過的數據,則直接從緩存中獲取,而非查詢數據庫執行sql

爲了提升程序的性能和下降數據庫訪問的壓力瓶頸


<!-- 開啓二級緩存 -->
    <property name="hibernate.cache.use_sencond_level_cache">true</property>
    <property name="hibernate.cache.region.factory_class">
         org.hibernate.cache.ehcache.EhCacheRegionFactory
    </property>

實體對象類中,增長緩存註解:

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
類前 和方法前 都增長

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class Usernote{
    @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
	public Usernote usernote;
   .....
}

查詢緩存:

依賴於二級緩存,若是說想使用查詢緩存,則前提條件,必須開啓二級緩存

hibernate.cfg.xml中放在開啓二級緩存後面
<!-- 開啓查詢緩存 -->
    <property name="hibernate.cache.use_query_cache">true</property>


HibernateDaoImpl.java中增長

hibernateTemplate.setCacheQueries(true);//開啓查詢緩存

使用:

1:導包

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.2.21.Final</version>
    </dependency>

web.xml

最前面增長    <distributable/>     

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>ssh_13</display-name>
	<distributable/> 
......

nginx+tomcat集羣

注:

先啓動tomcat-8081和tomcat-8082

再啓動 nginx

nginx配置參考:http://www.nginx.cn/76.html

nginx+tomcat集羣參考資料:

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

 

 

session共享問題解決

 

nginx設置靜態文件

相關文章
相關標籤/搜索