Java面試黃金寶典8

1. 什么是 Spring MVC

  • 定義

Spring MVC 是 Spring 框架里用于構建 Web 應用程序的模塊,它嚴格遵循 MVC(Model - View - Controller)設計模式。這種設計模式把應用程序清晰地劃分成三個主要部分:

  1. Model(模型):主要負責處理應用程序的數據和業務邏輯。通常借助 JavaBean 或者實體類來實現,這些類能夠封裝數據,并且提供相關的業務方法。例如,在一個電商系統中,商品類就是一個模型,它可以包含商品的名稱、價格、庫存等屬性,還能有計算商品總價等業務方法。
  2. View(視圖):承擔著將模型中的數據呈現給用戶的任務。常見的視圖技術有 JSP(JavaServer Pages)、Thymeleaf 等。以 JSP 為例,它可以將從模型獲取的數據動態地展示在網頁上。
  3. Controller(控制器):負責接收用戶的請求,調用模型處理請求,然后選擇合適的視圖進行響應。在 Spring MVC 中,控制器通常是使用 @Controller 注解標注的類。以下是一個簡單的 Spring MVC 示例:

java

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/hello")public String hello(Model model) {model.addAttribute("message", "Hello, Spring MVC!");return "hello";}
}

在這個示例中,HelloController 類被 @Controller 注解標注為控制器。@GetMapping("/hello") 注解表示該方法處理 /hello 的 GET 請求。在 hello 方法中,將消息 "Hello, Spring MVC!" 添加到 Model 中,然后返回邏輯視圖名 "hello"

  • 原理

Spring MVC 的核心是 DispatcherServlet,它是一個前端控制器,負責接收所有的 HTTP 請求。當請求到達時,DispatcherServlet 會根據請求的 URL 查找對應的處理器映射(HandlerMapping),找到處理該請求的控制器(Handler)。然后,DispatcherServlet 會調用處理器適配器(HandlerAdapter)來執行控制器中的方法。控制器方法執行后會返回一個邏輯視圖名,DispatcherServlet 會根據視圖解析器(ViewResolver)將邏輯視圖名解析為實際的視圖對象,最后將模型數據傳遞給視圖進行渲染并返回給客戶端。

  • 要點

  1. 基于 MVC 設計模式,實現了業務邏輯、數據和視圖的分離,提高了代碼的可維護性和可擴展性。
  2. DispatcherServlet 作為核心,統一管理請求的分發和處理,簡化了開發流程。
  3. 控制器使用注解(如 @Controller@GetMapping 等)進行配置,使得代碼更加簡潔和直觀。

  • 應用

可以深入學習 Spring MVC 的數據綁定、表單處理、文件上傳、異常處理等高級特性,以及與其他技術(如 RESTful 服務)的集成。例如,在構建 RESTful 服務時,可以使用 @RestController 注解來簡化控制器的開發,直接返回 JSON 或 XML 數據。

2. springMVC 和 struts2 的區別

  • 架構設計
    1. Spring MVC:基于 DispatcherServlet 作為前端控制器,采用單例模式。單例模式使得控制器實例在整個應用程序中只有一個,減少了內存開銷,提高了性能。它對 Servlet API 的依賴較少,設計更加輕量級和靈活。
    2. Struts2:基于過濾器(FilterDispatcherStrutsPrepareAndExecuteFilter)作為前端控制器,每個請求都會創建一個新的 Action 實例。這雖然避免了線程安全問題,但也帶來了一定的性能開銷,因為頻繁的對象創建和銷毀會消耗系統資源。
  • 請求處理方式
    1. Spring MVC:通過 HandlerMapping 來映射請求 URL 到具體的控制器方法,支持多種方式的 URL 映射,如注解、XML 配置等。使用注解配置時,可以直接在控制器方法上使用 @RequestMapping 等注解來指定請求的 URL,非常靈活。
    2. Struts2:通過配置文件(如 struts.xml)來映射請求 URL 到 Action 類和方法。配置文件的方式相對固定,修改時需要修改 XML 文件,不夠靈活。
  • 數據傳遞
    1. Spring MVC:通過 ModelModelAndView 來傳遞數據到視圖,數據傳遞更加直觀和靈活。可以直接將數據添加到 Model 中,然后在視圖中使用表達式語言(如 JSP 的 EL 表達式)來獲取數據。
    2. Struts2:通過 ValueStack 來傳遞數據,ValueStack 是一個棧結構,包含了 Action 實例和請求參數等信息,數據傳遞相對復雜。需要使用 OGNL(對象圖導航語言)來訪問和操作 ValueStack 中的數據。
  • 視圖技術
    1. Spring MVC:支持多種視圖技術,如 JSP、Thymeleaf、Freemarker 等,并且可以方便地集成其他視圖技術。可以根據項目的需求選擇合適的視圖技術,提高開發效率。
    2. Struts2:主要使用 JSP 作為視圖技術,也支持其他視圖技術,但集成相對復雜。對于非 JSP 視圖技術的支持,需要進行更多的配置和開發工作。

  • 原理

Spring MVC 的設計理念是基于 Java 的注解和 IoC 容器,通過注解和配置文件來實現請求的映射和處理,利用 Spring 的 IoC 容器來管理控制器和其他組件。Struts2 則是基于 WebWork 框架,通過過濾器和配置文件來處理請求,使用 OGNL(對象圖導航語言)來進行數據的訪問和操作。

  • 要點

  1. 架構設計上,Spring MVC 更輕量級和靈活,Struts2 存在一定性能開銷。
  2. 請求處理方式不同,Spring MVC 支持多種映射方式,Struts2 主要通過配置文件。
  3. 數據傳遞方面,Spring MVC 更直觀,Struts2 基于 ValueStack 較復雜。
  4. 視圖技術上,Spring MVC 集成更方便。

  • 應用

可以研究在大型項目中如何選擇合適的框架,以及如何將 Spring MVC 和 Struts2 與其他技術(如數據庫、緩存等)進行集成。例如,在與數據庫集成時,可以考慮使用 Spring Data JPA 來簡化數據庫操作。

3. Spring 中有哪些設計模式

  • 單例模式:Spring 容器默認將 Bean 以單例模式創建,確保在整個應用程序中只有一個實例。可以通過 @Scope("singleton") 注解或 XML 配置來指定 Bean 的作用域為單例。單例模式可以減少內存開銷,提高系統性能。

java

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
@Scope("singleton")
public class SingletonBean {// 單例 Bean 的實現
}

  • 工廠模式:Spring 的 BeanFactoryApplicationContext 就是工廠模式的體現,它們負責創建和管理 Bean 實例。通過配置文件或注解,Spring 可以根據需要創建不同類型的 Bean。工廠模式將對象的創建和使用分離,提高了代碼的可維護性和可擴展性。
  • 代理模式:Spring AOP(面向切面編程)使用代理模式來實現切面的增強。Spring 提供了兩種代理方式:JDK 動態代理和 CGLIB 代理。當目標對象實現了接口時,使用 JDK 動態代理;當目標對象沒有實現接口時,使用 CGLIB 代理。代理模式可以在不修改目標對象代碼的情況下,為目標對象添加額外的功能,如日志記錄、事務管理等。
  • 觀察者模式:Spring 的事件機制使用了觀察者模式。當一個事件被發布時,所有注冊的監聽器都會收到通知并執行相應的操作。可以通過實現 ApplicationListener 接口來創建自定義的事件監聽器。

java

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;@Component
public class MyEventListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 處理事件}
}

  • 模板方法模式:Spring 的 JdbcTemplateHibernateTemplate 等模板類使用了模板方法模式。這些模板類提供了一些通用的操作方法,具體的業務邏輯由子類實現。模板方法模式將通用的操作封裝在模板類中,提高了代碼的復用性。

  • 原理

單例模式通過 Spring 容器的管理,確保 Bean 只有一個實例。工廠模式通過反射機制根據配置信息創建 Bean 實例。代理模式通過在目標對象的基礎上創建代理對象,在代理對象中添加額外的邏輯來實現切面增強。觀察者模式通過事件發布和監聽機制,實現對象之間的解耦。模板方法模式通過將通用的操作封裝在模板類中,將具體的業務邏輯留給子類實現。

  • 要點

  1. 單例模式確保 Bean 只有一個實例,減少內存開銷。
  2. 工廠模式負責創建和管理 Bean 實例,提高代碼的可維護性。
  3. 代理模式用于實現 AOP 切面增強,不修改目標對象代碼。
  4. 觀察者模式實現事件機制,實現對象之間的解耦。
  5. 模板方法模式封裝通用操作,提高代碼的復用性。

  • 應用

可以深入學習每種設計模式的原理和應用場景,以及如何在 Spring 中自定義實現這些設計模式。例如,自定義一個簡單的工廠類來創建特定的 Bean 實例。

4. servlet 是什么,Servlet 生命周期

  • 定義

Servlet 是 Java 編寫的服務器端程序,它運行在 Web 服務器上,用于處理客戶端的請求并生成響應。Servlet 可以處理 HTTP 請求、管理會話、與數據庫交互等。

Servlet 的生命周期包括以下幾個階段:

  1. 加載和實例化:當 Web 服務器啟動或客戶端首次請求該 Servlet 時,Web 服務器會加載 Servlet 類并創建其實例。加載過程是通過類加載器將 Servlet 類的字節碼加載到內存中,然后使用反射機制創建實例。
  2. 初始化:Web 服務器調用 Servlet 的 init() 方法進行初始化操作,該方法只會被調用一次。在 init() 方法中,可以進行一些資源的初始化,如數據庫連接、配置文件的加載等。

java

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {// 初始化操作}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 處理請求}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {// 銷毀操作}
}

  1. 服務:當客戶端發送請求時,Web 服務器會調用 Servlet 的 service() 方法來處理請求。service() 方法會根據請求的類型(如 GET、POST)調用相應的處理方法(如 doGet()doPost())。
  2. 銷毀:當 Web 服務器關閉或 Servlet 被卸載時,會調用 Servlet 的 destroy() 方法進行資源的釋放和清理工作。例如,關閉數據庫連接、釋放文件資源等。

  • 原理

Servlet 是基于 Java 的多線程機制,每個請求會由一個獨立的線程來處理。Web 服務器通過反射機制加載和實例化 Servlet 類,并調用其相應的方法。Servlet 的生命周期由 Web 服務器管理,確保 Servlet 的正確初始化、服務和銷毀。

  • 要點

  1. Servlet 是 Java 編寫的服務器端程序,用于處理客戶端請求。
  2. 生命周期包括加載和實例化、初始化、服務和銷毀。
  3. init() 方法只調用一次,用于初始化資源;service() 方法處理請求;destroy() 方法進行資源清理。

  • 應用

可以學習 Servlet 的高級特性,如 Servlet 過濾器、Servlet 監聽器等,以及如何使用 Servlet 與其他技術(如 JSP、數據庫)進行集成。例如,使用 Servlet 過濾器實現字符編碼的統一設置。

5. Struts 的原理和工作流程

  • 定義

Struts 是一個基于 MVC 設計模式的 Web 應用框架,主要用于構建 Java Web 應用程序。

Struts 的工作流程如下:

  1. 客戶端請求:客戶端(如瀏覽器)發送 HTTP 請求到 Web 服務器。
  2. 過濾器攔截:請求首先被 Struts 的過濾器(如 StrutsPrepareAndExecuteFilter)攔截。過濾器會對請求進行預處理,如設置字符編碼、驗證請求的合法性等。
  3. 請求處理:過濾器根據請求的 URL 查找對應的 Action 配置信息,然后創建 Action 實例。Action 配置信息通常存儲在 struts.xml 等配置文件中。
  4. Action 執行:調用 Action 的執行方法(如 execute()),在該方法中可以處理業務邏輯,如調用服務層方法、操作數據庫等。
  5. 結果返回:Action 執行完成后,會返回一個結果碼,過濾器根據結果碼查找對應的視圖配置信息。結果碼可以是字符串,如 "success""error" 等。
  6. 視圖渲染:根據視圖配置信息,將結果數據傳遞給相應的視圖(如 JSP)進行渲染。視圖可以使用標簽庫來顯示數據,如 Struts 的標簽庫。
  7. 響應返回:將渲染后的視圖內容返回給客戶端。

  • 原理

Struts 通過配置文件(如 struts.xml)來管理 Action 和視圖的映射關系,使用過濾器來攔截請求并進行分發。Action 是 Struts 的核心組件,負責處理業務邏輯。視圖則負責將處理結果呈現給用戶。

  • 要點

  1. 基于 MVC 設計模式,分離業務邏輯和視圖,提高代碼的可維護性。
  2. 過濾器攔截請求,根據配置信息分發到相應的 Action。
  3. Action 處理業務邏輯,返回結果碼,根據結果碼選擇視圖進行渲染。

  • 應用

可以深入學習 Struts 的配置文件的編寫、Action 的各種實現方式、數據驗證和國際化等高級特性。例如,使用 Struts 的數據驗證框架來驗證用戶輸入的數據。

6. 什么是 doFilter

  • 定義

doFilterjavax.servlet.Filter 接口中的一個方法,用于實現 Servlet 過濾器的核心邏輯。Servlet 過濾器是一種可以在請求到達 Servlet 之前或響應返回客戶端之前對請求和響應進行預處理和后處理的組件。

doFilter 方法的簽名如下:

java

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

  1. ServletRequest:表示客戶端的請求對象,包含了請求的信息,如請求參數、請求頭、請求方法等。
  2. ServletResponse:表示服務器的響應對象,用于向客戶端發送響應信息,如設置響應頭、輸出響應內容等。
  3. FilterChain:表示過濾器鏈,用于將請求傳遞給下一個過濾器或 Servlet。

以下是一個簡單的過濾器示例:

java

import javax.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 預處理操作System.out.println("Before processing request");chain.doFilter(request, response);// 后處理操作System.out.println("After processing request");}@Overridepublic void destroy() {// 銷毀操作}
}

  • 原理

當客戶端發送請求時,Web 服務器會根據過濾器的配置信息,將請求傳遞給相應的過濾器。過濾器的 doFilter 方法會被調用,在該方法中可以對請求進行預處理,如設置字符編碼、驗證用戶身份等。然后,通過調用 FilterChaindoFilter 方法將請求傳遞給下一個過濾器或 Servlet。當請求處理完成后,會返回到當前過濾器的 doFilter 方法,進行后處理操作,如記錄日志、修改響應內容等。

  • 要點

  1. doFilter 是 Servlet 過濾器的核心方法,用于實現請求和響應的預處理和后處理。
  2. 通過 FilterChain 將請求傳遞給下一個過濾器或 Servlet。
  3. 可以在 doFilter 方法中進行各種處理操作,如字符編碼設置、身份驗證等。

  • 應用

可以學習如何使用過濾器實現不同的功能,如權限控制、日志記錄、性能監控等,以及如何配置過濾器的執行順序。例如,配置多個過濾器,按照特定的順序對請求進行處理。

7. 攔截器與過濾器的區別

  • 使用范圍
    1. 過濾器:是 Servlet 規范的一部分,主要用于對請求和響應進行預處理和后處理,適用于所有的 Web 應用程序,包括基于 Servlet 的應用和基于 Spring MVC、Struts 等框架的應用。過濾器可以對所有的請求和響應進行統一處理,如設置字符編碼、進行權限驗證等。
    2. 攔截器:是框架級別的組件,不同的框架有不同的攔截器實現,如 Spring MVC 的攔截器、Struts2 的攔截器。攔截器主要用于在框架的請求處理流程中進行攔截和處理,對框架的特定功能進行增強。
  • 執行時機
    1. 過濾器:在請求進入 Servlet 之前和響應返回客戶端之前執行,是最早和最晚處理請求的組件。過濾器可以在請求到達 Servlet 之前對請求進行預處理,也可以在響應返回客戶端之前對響應進行后處理。
    2. 攔截器:在框架的請求處理流程中執行,如在 Spring MVC 中,攔截器在控制器方法執行前后執行。攔截器可以在控制器方法執行之前進行一些驗證或預處理操作,也可以在控制器方法執行之后進行一些清理或后處理操作。
  • 實現方式
    1. 過濾器:實現 javax.servlet.Filter 接口,重寫 doFilter 方法。過濾器的實現相對簡單,只需要實現一個接口和一個方法。
    2. 攔截器:不同框架的攔截器實現方式不同,如 Spring MVC 的攔截器需要實現 HandlerInterceptor 接口,重寫 preHandlepostHandleafterCompletion 方法。攔截器的實現需要根據框架的要求進行,相對復雜一些。
  • 功能側重點
    1. 過濾器:主要用于對請求和響應進行通用的處理,如字符編碼設置、權限驗證、日志記錄等。過濾器的功能比較通用,可以應用于各種 Web 應用程序。
    2. 攔截器:更側重于對框架的請求處理流程進行控制和增強,如在控制器方法執行前后添加額外的邏輯、進行數據驗證等。攔截器的功能更具針對性,與框架的特定功能相關。

  • 原理

過濾器是基于 Servlet 規范的,由 Web 服務器管理和調用。攔截器是框架級別的組件,由框架的核心組件(如 Spring MVC 的 DispatcherServlet、Struts2 的過濾器)進行管理和調用。

  • 要點

  1. 過濾器適用于所有 Web 應用,攔截器是框架級組件。
  2. 過濾器在請求進入 Servlet 前后執行,攔截器在框架請求處理流程中執行。
  3. 過濾器實現 Filter 接口,攔截器實現框架特定的接口。
  4. 過濾器側重于通用處理,攔截器側重于框架流程控制。

  • 應用

可以深入學習過濾器和攔截器的高級應用,如如何實現自定義的過濾器和攔截器,以及如何在復雜的應用場景中合理使用它們。例如,在一個大型項目中,結合使用過濾器和攔截器來實現權限控制和日志記錄。

8. Struts 中為什么不用考慮線程安全

在 Struts 中,通常不需要考慮線程安全問題,主要原因如下:

  1. Action 實例化方式:Struts2 中每個請求都會創建一個新的 Action 實例,因此每個 Action 實例只處理一個請求,不存在多個線程同時訪問同一個 Action 實例的情況。例如,當有多個客戶端同時發送請求時,Struts2 會為每個請求創建一個獨立的 Action 實例,每個實例都有自己的屬性和狀態,不會相互影響。
  2. 屬性隔離:由于每個 Action 實例是獨立的,Action 中的屬性也是獨立的,不會被多個線程共享。因此,不需要擔心多個線程同時修改 Action 屬性導致的數據不一致問題。

  • 原理

Struts2 的設計理念是基于請求的,每個請求都會創建一個新的 Action 實例,這種實例化方式保證了 Action 的線程安全性。同時,Struts2 的數據傳遞和處理機制也是基于每個請求的,確保了數據的獨立性和安全性。

  • 要點

  1. 每個請求創建一個新的 Action 實例,避免多個線程共享同一個實例。
  2. Action 屬性獨立,不會被多個線程同時修改。

  • 拓展

可以了解在 Struts1 中,由于 Action 是單例模式,需要考慮線程安全問題,以及如何在 Struts1 中解決線程安全問題。例如,使用同步機制來保證 Action 屬性的線程安全。

9. Struts2 和 Struts1 區別

  • 架構設計
    1. Struts1:基于 Servlet API,以 ActionServlet 作為前端控制器,采用單例模式的 Action 處理請求。單例模式的 Action 在多線程環境下需要考慮線程安全問題,因為多個線程可能會同時訪問和修改 Action 的屬性。
    2. Struts2:基于 WebWork 框架,以過濾器(如 StrutsPrepareAndExecuteFilter)作為前端控制器,每個請求都會創建一個新的 Action 實例,不存在線程安全問題。
  • Action 設計
    1. Struts1:Action 必須繼承自 org.apache.struts.action.Action 類,并且需要實現 execute() 方法來處理請求。這種設計方式限制了 Action 的靈活性,因為 Action 必須繼承特定的類。
    2. Struts2:Action 可以是一個普通的 Java 類,只需要實現 com.opensymphony.xwork2.Action 接口或繼承 com.opensymphony.xwork2.ActionSupport 類,并且可以自定義方法來處理請求。這種設計方式更加靈活,Action 可以是任何符合要求的 Java 類。
  • 數據傳遞
    1. Struts1:通過 ActionForm 來封裝請求參數,ActionForm 是一個 JavaBean,用于在控制器和視圖之間傳遞數據。ActionForm 的使用需要定義特定的類,并且需要在配置文件中進行配置,相對繁瑣。
    2. Struts2:通過 ValueStack 和 OGNL(對象圖導航語言)來傳遞數據,ValueStack 是一個棧結構,包含了 Action 實例和請求參數等信息,OGNL 用于訪問和操作 ValueStack 中的數據。ValueStack 和 OGNL 的使用更加靈活,可以直接在視圖中訪問和操作數據。
  • 視圖技術
    1. Struts1:主要使用 JSP 作為視圖技術,并且需要使用 Struts 的標簽庫來進行數據顯示和表單處理。Struts 的標簽庫相對復雜,學習成本較高。
    2. Struts2:支持多種視圖技術,如 JSP、FreeMarker、Velocity 等,并且提供了豐富的標簽庫來簡化視圖開發。Struts2 的標簽庫更加簡潔和易用,提高了開發效率。

  • 原理

Struts1 是早期的 Web 應用框架,基于 Servlet 技術和 MVC 設計模式,采用單例模式的 Action 處理請求。Struts2 是在 WebWork 框架的基礎上發展而來,采用了更靈活的設計理念,每個請求創建一個新的 Action 實例,使用 ValueStack 和 OGNL 進行數據傳遞。

  • 要點

  1. 架構設計上,Struts1 基于 Servlet API 且 Action 是單例,Struts2 基于過濾器且 Action 每個請求創建一個實例。
  2. Action 設計方面,Struts1 需繼承特定類,Struts2 可以是普通 Java 類。
  3. 數據傳遞不同,Struts1 用 ActionForm,Struts2 用 ValueStack 和 OGNL。
  4. 視圖技術上,Struts2 支持更多視圖技術且標簽庫更豐富。

  • 應用

可以研究如何將 Struts1 項目遷移到 Struts2,以及在實際項目中如何根據需求選擇合適的 Struts 版本。例如,在一個舊的 Struts1 項目中,考慮將其逐步遷移到 Struts2 以提高項目的可維護性和可擴展性。

10. 什么是 Hibernate

  • 定義

Hibernate 是一個開源的對象關系映射(ORM,Object Relational Mapping)框架,用于在 Java 應用程序和關系型數據庫之間建立映射關系。它允許開發者使用面向對象的方式來操作數據庫,而不需要編寫大量的 SQL 語句。

Hibernate 的主要功能包括:

  1. 對象關系映射:將 Java 對象映射到數據庫表,將對象的屬性映射到表的字段,實現對象和數據庫記錄之間的相互轉換。例如,一個 Java 的 User 類可以映射到數據庫中的 user 表,User 類的屬性可以映射到 user 表的字段。
  2. 事務管理:提供了事務管理機制,支持聲明式和編程式事務管理,確保數據的一致性和完整性。在一個事務中,如果某個操作失敗,整個事務會回滾,保證數據的正確性。
  3. 查詢語言:提供了 Hibernate 查詢語言(HQL,Hibernate Query Language),它類似于 SQL,但操作的是 Java 對象而不是數據庫表。使用 HQL 可以方便地進行數據庫查詢,而不需要關心具體的數據庫表結構。

java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.List;public class HibernateExample {public static void main(String[] args) {// 創建 SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 打開 SessionSession session = sessionFactory.openSession();// 開始事務session.beginTransaction();// 使用 HQL 查詢String hql = "FROM Employee";List<Employee> employees = session.createQuery(hql, Employee.class).list();for (Employee employee : employees) {System.out.println(employee.getName());}// 提交事務session.getTransaction().commit();// 關閉 Sessionsession.close();// 關閉 SessionFactorysessionFactory.close();}
}

  • 原理

Hibernate 通過讀取配置文件(如 hibernate.cfg.xml)和映射文件(如 Employee.hbm.xml 或使用注解)來建立 Java 對象和數據庫表之間的映射關系。當應用程序操作 Java 對象時,Hibernate 會根據映射關系自動生成相應的 SQL 語句,并與數據庫進行交互。

  • 要點

  1. 是一個 ORM 框架,實現對象和數據庫的映射,提高開發效率。
  2. 提供事務管理和 HQL 查詢語言,確保數據的一致性和方便查詢。
  3. 通過配置文件和映射文件建立映射關系,實現對象和數據庫的解耦。

  • 應用

可以深入學習 Hibernate 的高級特性,如緩存機制、關聯映射、性能優化等,以及如何將 Hibernate 與其他框架(如 Spring)進行集成。例如,使用 Spring 和 Hibernate 結合的方式來構建企業級應用程序,利用 Spring 的 IoC 和 AOP 功能來管理 Hibernate 的 Session 和事務。

?友情提示:本文已經整理成文檔,可以到如下鏈接免積分下載閱讀

https://download.csdn.net/download/ylfhpy/90518703

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898755.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 RESTful API 設計:從上手到骨折

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整活…

分享最近前端面試遇到的一些問題

前情提要&#xff08;分享個人情況&#xff0c;可以直接跳過&#xff09; 先說一下我的個人情況&#xff0c;我是2026屆的&#xff0c;目前是在找前端實習。 3月初&#xff0c;從3月3日開始在Boss上投簡歷。 分享我的個人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 協議詳細介紹

以下是關于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息協議&#xff09; 的詳細介紹&#xff0c;涵蓋其工作原理、版本演進、配置方法、優缺點及實際應用場景。 1. RIP 協議概述 類型&#xff1a;動態路由協議&#xff0c;基于距離矢量算法&#xff08…

scrapy入門(深入)

Scrapy框架簡介 Scrapy是:由Python語言開發的一個快速、高層次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站點并從頁面中提取結構化的數據&#xff0c;只需要實現少量的代碼&#xff0c;就能夠快速的抓取。 新建項目 (scrapy startproject xxx)&#xff1a;新建一個新的…

KiLog2MaximumIncrement的由來和KiMaximumIncrementReciprocal的由來

第一部分&#xff1a;KiLog2MaximumIncrement的由來 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…

數據結構-ArrayList

文章目錄 1. 線性表2. 順序表3. ArrayList4. ArrayList的問題以及思考4.2 增容的性能消耗問題4.3 空間浪費問題 1. 線性表 線性表&#xff08;Linear List&#xff09;是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見線性表&…

FastGPT 社區版快速部署指南

產品簡介 FastGPT 是基于大語言模型的智能知識庫系統&#xff0c;提供以下核心能力&#xff1a; ? 開箱即用 - 內置數據預處理、多模型對接、權限管理 ? 可視化編排 - 通過 Flow 工作流實現復雜問答邏輯設計 ? 多場景適配 - 支持客服機器人/知識檢索/數據分析等場景 &…

【css酷炫效果】純CSS實現科技感網格背景

【css酷炫效果】純CSS實現科技感網格背景 緣創作背景html結構css樣式完整代碼基礎版進階版(3D光線掃描版) 效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;上傳后更新 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&#xff0c;趕時間&a…

Android BLE 權限管理

前言 android 權限一直是比較活躍的 在藍牙權限這一塊又分新版和舊版 新版權限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT舊版權限如9.0以下 Manifest.permission.A…

vue3:十一、主頁面布局(左側菜單折疊展開設置)

一、實現效果 二、基本實現 1、菜單容器增加展開收縮方法 在菜單容器中開啟這個方法&#xff0c;值設置為一個變量 :collapseiscollapse 2、定義菜單收縮與否的變量 在js中初始化是否收縮的變量&#xff0c;初始值為不收縮(也就是展開) //左側菜單展開與收縮 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 顯示設備所屬的區域名稱。該命令可用于查找罪魁禍首設備的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入數據并獲取自動生成的主鍵(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代碼,包含詳細注釋

以下是使用 JDBC 插入數據并獲取自動生成的主鍵&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代碼&#xff0c;包含詳細注釋&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 數據庫連接參數private static final St…

網絡爬蟲【爬蟲庫request】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 Requests是Python的一個很實用的HTTP客戶端庫&#xff0c;完全滿足如今網絡爬蟲的需求。與Urllib對比&#xff0c;Requests不僅具備Urllib的全部功能&#xff1b;在開發使用上&…

MTKAndroid12 解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

解決SystemUI下拉框中&#xff0c;長按WIFI圖標會導致崩潰問題 文章目錄 場景參考資料修改文件解決方案日志源碼分析 總結 場景 在部分產品中偶發性發現&#xff0c; SystemUI下拉框下拉后長按WIFI圖標會導致崩潰問題&#xff0c;有時候是截屏、點擊Home 按鍵后&#xff0c;長…

第三十一篇 數據倉庫(DW)與商業智能(BI)架構設計與實踐指南

目錄 一、DW/BI架構核心理論與選型策略1.1 主流架構模式對比&#xff08;1&#xff09;Kimball維度建模架構&#xff08;2&#xff09;Inmon企業工廠架構&#xff08;3&#xff09;混合架構 二、架構設計方法論與實施步驟2.1 維度建模實戰指南&#xff08;1&#xff09;模型選擇…

XSS基礎靶場練習

目錄 1. 準備靶場 2. PASS 1. Level 1&#xff1a;無過濾 源碼&#xff1a; 2. level2&#xff1a;轉HTML實體 htmlspecialchars簡介&#xff1a; 源碼 PASS 3. level3:轉HTML深入 源碼&#xff1a; PASS 4. level4:過濾<> 源碼&#xff1a; PASS: 5. level5:過濾on 源碼…

2025年3月AI搜索發展動態與趨勢分析:從技術革新到生態重構

025年3月AI搜索發展動態與趨勢分析&#xff1a;從技術革新到生態重構 一、行業動態&#xff1a;巨頭布局與技術升級 谷歌推出“AI模式”&#xff0c;重新定義搜索體驗 谷歌上線全新“AI模式”&#xff0c;集成多模態交互與實時數據能力&#xff0c;用戶可通過文本、圖片或語音…

熔斷降級(Sentinel解決)

問題概述 在微服務架構中一定要預防微服務雪崩問題&#xff0c;微服務雪崩問題就是指在微服務架構中&#xff0c;當一個服務出現故障時&#xff0c;由于服務之間的依賴關系&#xff0c;故障可能會傳播到其他服務&#xff0c;從而導致了大規模的服務失敗&#xff0c;系統無法正…

Qt高分屏自適應

一.設置默認 DPI 感知 Windows 上的桌面應用程序可以在不同的 DPI 感知模式下運行。 這些模式可實現不同的 DPI 縮放行為,并且可以使用不同的坐標空間。 有關 DPI 感知的詳細信息,請參閱在 Windows 上開發高 DPI 桌面應用程序。 請務必顯式為進程設置默認 DPI 感知模式,以避…

TPCTF 2025 web 復現

文章目錄 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout 在index.js文件中&#xff0c;看到了有使用DOMPurify庫來防止XSS操作 在package.json里可以看到版本是3.2.4,關于3.2.3是有繞過策略的。它會把script標簽清除掉&#xff0c;去看bot可以看到flag是放…