4月1日
為什麼要使用 hibernate?
使用Hibernate很大程度上取決于2點優勢。
(1)Hibernate對jdbc進行了封裝,簡化了我們操作Dao層的編碼工作。
(2)Hibernate提供了優秀的緩存機制,可以幫助我們的程式跑得更快。
什麼是ORM
ORM是對象關系映射。就是把資料庫中的字段,映射到Java實體的屬性裡面。
常用的ORM架構有Mybatis與Hibernate。
Hibernate與Mybatis的差別
我就個人經曆過的項目而言,我對下面的幾點很有體會。
(1)速度。如果一個項目沒有複雜的SQL語句,那麼使用Hibernate顯得很容易。Hibernate因為封裝了基本的增删改查的SQL語句,是以速度很快。而Mybatis對于開發者更加靈活,它是自己編寫的SQL語句,是以可以适應一些複雜的SQL場景。是以,看項目。如果項目不複雜,使用Hibernate。如果項目較為複雜,使用Mybatis。
(2)難度。Hibernate有一套很成熟的HQL語句,而且Hibernate還有其它非常多的配置,學習難度比Mybatis大許多。
hibernate 中如何在控制台檢視列印的 SQL 語句?
在配置檔案裡面,把hibernate.show_SQL設定為true就行了,但是可能會降低一定的性能。
hibernate 有幾種查詢方式?
原生SQL、HQL、條件查詢。
hibernate 實體類可以被定義為 final 嗎?
可以加上final,以前我試過。不過被final修飾的類不能被繼承,那麼cglib動态代理就不能建立這個類的子類。是以相關的性能優化,延遲加載,将被舍棄掉。
在 hibernate 中使用 Integer 和 int 做映射有什麼差別?
Integer可以映射為null,但是int不能映射為null
hibernate 是如何工作的?
讀取配置檔案
建立SesssionFactory
建立Session
建立事務
持久化
送出事務
關閉session
關閉sessionFactory
get()和 load()的差別?
get不支援延遲加載,而load支援延遲加載。
說一下 hibernate 的緩存機制?
一級緩存是session緩存。session緩存是事務級别的緩存,因為session對象的生命周期通常對應着資料庫中的一個事務。舉個例子,如果我們調用get方法查詢并傳回了一個對象,第二次查詢這個對象的時候就會傳回session緩存中已經存在的這個對象,而不用在去資料庫中查詢。一級緩存是由Hibernate直接管理的,是以我們不能手動關閉一級緩存。
二級緩存是SessionFactory緩存。SessionFactory緩存是程序級别的緩存,因為sessionFactory對象的生命周期與項目相同。二級緩存中的緩存對象可以被整個應用程式中的任何Session對象共享,即使關閉目前Session對象,建立的Session對象仍可使用。
hibernate 對象有哪些狀态?
瞬時狀态:直接 new 出來的對象,該對象還沒被持久化(沒儲存在資料庫中)
持久化狀态:當調用 Session 的 save/get/load 等方法的時候,對象就是持久化狀态。
遊離狀态:Session 關閉之後對象就是遊離狀态。
hibernate 實體類必須要有無參構造函數嗎?為什麼?
因為Hibernate需要調用反射的相關API,是以會調用對象的無參構造函數建立對象。是以要求實體要提供一個無參的構造函數。
4月2日
MyBatis 中 #{}和 ${}的差別是什麼?
井号是預編譯的SQL語句,解析後的SQL語句的參數會帶上引号。
拼接SQL語句,是以不會帶上引号。
一般來說,在動态排序中,使用美元符号才能達到要求。比如 select * from 表 order by ${id}
另外值得一提的是,美元符号的因為是SQL語句的拼接,可能會導緻一些SQL注入的風險。是以要對使用者的輸入進行正規表達式的校驗。
MyBatis的分頁
第一種是自己手動編寫分頁,在MySQL中使用limit關鍵字。
第二種是使用PageHelper分頁插件,調用startPage()方法來開啟分頁。分頁插件的辦法,我在畢業設計中使用過。
第三種是邏輯分頁,它是一次性查詢很多資料,然後在資料中再進行檢索。這種辦法效率低,占用記憶體大。
MyBatis 是否支援延遲加載?
MyBatis 支援延遲加載,設定 lazyLoadingEnabled=true 即可。
懶加載原理
一個對象裡面持有另外一個對象。比如A對象持有B對象。我們查詢出來了A對象,但是會發現B對象是一個null。隻有調用B對象的時候,才會去資料庫查詢出B對象。這就是懶加載。
一言以蔽之:什麼時候調用,什麼時候查詢。
MyBatis 的一級緩存和二級緩存
Mybatis的一級緩存是基于同一個SqlSession的緩存。就是會把查詢出來的資料儲存下來,下次再查詢的時候,先看看緩存裡面有沒有,如果有的話,就不查詢資料庫了。如果沒有,才需要查詢資料庫。
Mybatis的二級緩存是基于同一個namespace下的所有SqlSession。同一個namespace下的SqlSession查詢到的資料将會共享。同樣的,擷取資料的時候,先從緩存中擷取,如果沒有,才查詢資料庫。
4月2日
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNwgTMyYWYhdDOycTOjRDZyYzXwEjN0ATM4EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
從RabbitMQ 結構圖來看,有如下幾個 過程:
1. 消息從生産者Producer發送到交換機Exchange
2.交換機根據路由規則将消息轉發到相應隊列
3. 隊列将消息進行存儲
4.消費者訂閱隊列消息,并進行消費
RabbitMQ 的使用場景有哪些?
(1)異步處理。一般的注冊流程中,可能會有把注冊資訊插入資料庫、發送注冊郵件、發送注冊短信這三個步驟。而發送注冊郵件和發送注冊資訊可以使用RabbitMQ進行異步處理。這樣可以減少用戶端等待的時間。用戶端實際等待的時間隻有資料寫入資料庫的時間。剩下的交給消息中間件異步處理即可。
(2)流量削峰。比如在搶購系統中,如果一瞬間有大量的使用者請求,先把這些使用者請求寫入到消息中間件中,然後再進行處理。如果請求數量超過消息中間件的最大隊列,那麼就提示使用者再等一會再來操作。這樣可以防止我們的系統因為過大的負載而崩潰的情況。
RabbitMQ 有哪些重要的角色?
生産者,用于建立消息并把消息發送給消息隊列。
代理:用來儲存消息,并把消息投遞給指定的接收者。
消費者:用來接收消息,并根據消息進行進一步業務處理。
RabbitMQ 有哪些重要的元件?
連接配接管理器ConnectionFactory,我們的應用程式與RabbitMQ建立連接配接的管理器。
Exchange(交換器):用于接受、配置設定消息。
Channel(信道):消息推送使用的通道。
Queue(隊列):用于存儲生産者的消息。
--------------------------------------------------------------------------------------------------------------------------
RoutingKey(路由鍵):用于把生成者的資料配置設定到交換器上。
BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。
RabbitMQ 中 vhost 的作用是什麼?
每一個RabbitMQ都能建立很多vhost。這個vhost可以了解為虛拟主機。就是一個 mini版本的RabbitMQ,擁有自己的交換器與隊列。
RabbitMQ 的消息是怎麼發送的?
用戶端必須連接配接到 RabbitMQ 伺服器才能釋出和消費消息。
首先用戶端和 rabbit server 之間會建立一個 tcp 連接配接。
一旦 tcp 打開并通過了認證,你的用戶端和 RabbitMQ 就建立了一條符合标準協定的信道(channel)
後來的發消息和接收消息都是由這信道完成的。
RabbitMQ 怎麼保證消息的穩定性(中間網絡斷開怎麼辦? )?
提供了事務的功能。缺點是 事務模式會極大的消耗RabbitMQ的性能。
通過将 channel 設定為 confirm(确認)模式。類似于TCP三向交握一樣,消息發送方與消息接收方互相發送确認封包。隻有接收方确認了已經接收到消息,那麼才認為資料成功發送。否則認為發送失敗,需要重新發送消息。
RabbitMQ 怎麼避免消息丢失?
把消息持久化磁盤,保證伺服器重新開機消息或者意外當機不丢失。
ACK确認機制,消費端消費完成要通知服務端,服務端才把消息從記憶體删除。
要保證消息持久化成功的條件有哪些?
1) Exchange 設定持久化
2)Queue 設定持久化
3)Message持久化發送
RabbitMQ 持久化有什麼缺點?
因為使用的是磁盤而非記憶體存儲,進而降低了吞吐量。
RabbitMQ 有幾種廣播類型?
topic:路由器根據正則,把消息投遞到指定的隊列中。