61道MyBatis高頻題整理(附答案背誦版)

1、介紹下MyBatis?

MyBatis是一個基於Java的持久層框架,它封裝了底層的JDBC操作,大大簡化了數據庫操作的複雜性。MyBatis的主要特點包括:

  1. SQL語句與Java代碼的分離:MyBatis允許你直接在XML文件中編寫SQL語句,這樣可以將SQL語句從Java代碼中分離出來,使得代碼更加清晰,易於維護。

  2. 強大的映射能力:MyBatis可以將數據庫中的記錄映射爲Java對象,這樣可以方便地處理數據庫的數據。映射的方式主要有兩種:一種是通過XML文件進行配置,另一種是通過註解來實現。

  3. 支持動態SQL:MyBatis支持動態SQL,這意味着你可以根據不同的條件動態生成SQL語句。這對於處理複雜的查詢需求非常有用。

  4. 支持一級緩存和二級緩存:MyBatis內置了一級緩存和二級緩存,可以提高查詢的效率。一級緩存默認開啓,它是基於SqlSession的,當SqlSession關閉或提交時,一級緩存就會清空。二級緩存是基於Mapper的,多個SqlSession可以共享該緩存。

  5. 提供了豐富的API:MyBatis提供了豐富的API,包括SqlSession、SqlSessionFactory、Mapper等,這些API提供了許多方便的方法,使得數據庫操作變得簡單易用。

總的來說,MyBatis是一個功能強大的持久層框架,它的出現大大簡化了Java對數據庫的操作,提高了開發效率。

2、MyBatis 框架的應用場景?

MyBatis作爲一款優秀的持久層框架,主要應用在以下的場景中:

  1. 需要與關係型數據庫交互的項目:MyBatis支持對各類SQL查詢,更新,刪除的操作,包括複雜查詢,聯合查詢等,因此對於需要與關係型數據庫交互的項目,MyBatis是一個很好的選擇。

  2. 需要編寫複雜SQL語句的場景:MyBatis允許開發者直接編寫原生態SQL語句,相比於其他ORM框架,如Hibernate,更適合需要編寫複雜SQL語句的場景。

  3. 需要進行SQL性能優化的場景:在MyBatis中,SQL語句是可見的,開發者可以直接對SQL語句進行優化,因此,對於需要進行SQL性能優化的場景,MyBatis也是一個不錯的選擇。

  4. 需要緩存優化的場景:MyBatis提供了一級緩存和二級緩存的功能,可以有效地提升數據庫查詢的效率。例如,在一個電商網站中,商品的信息一般變動較小,但查詢非常頻繁,這時候,就可以使用MyBatis的二級緩存功能,將商品的信息緩存起來,提高系統的性能。

  5. 動態SQL的場景:MyBatis支持動態SQL,可以根據不同的條件動態生成SQL語句,這對於處理複雜的查詢需求非常有用。例如,用戶的查詢條件可能有多種,有的用戶可能只提供用戶名,有的可能只提供用戶ID,有的可能兩者都提供,這時我們就可以使用MyBatis的動態SQL來實現這個需求。

綜上所述,MyBatis適用於各種複雜度的Java項目,特別是對SQL性能,緩存優化,動態SQL有一定需求的項目。

3、MyBatis 有哪些優點?

MyBatis作爲一款優秀的持久層框架,具有以下幾個主要優點:

  1. 深度解耦SQL和Java代碼:MyBatis允許將SQL語句寫在XML文件中,大大降低了代碼的耦合度。SQL語句和Java代碼分離,使得代碼更加清晰,易於維護。

  2. 支持定製化SQL和存儲過程:MyBatis允許開發者編寫幾乎任何的SQL語句,包括存儲過程。這給開發者提供了極大的靈活性,特別是在處理複雜的數據庫操作時。

  3. 提供映射標籤,支持對象與數據庫的ORM字段關係映射:MyBatis通過XML或註解將Java對象和數據庫中的記錄進行映射,簡化了數據庫操作。

  4. 提供SQL標籤,支持編寫動態SQL:MyBatis提供了豐富的SQL標籤,可以編寫動態SQL,根據不同的條件生成不同的SQL語句。

  5. 提供一級、二級緩存,提高查詢效率:MyBatis內置了一級和二級緩存,可以有效地提高查詢的效率。一級緩存是SqlSession級別的,用於減少同一會話多次查詢的數據庫訪問。二級緩存是mapper級別的,可以被多個SqlSession共享,用於減少跨會話的數據庫訪問。

  6. 允許延遲加載,提高系統性能:MyBatis支持延遲加載,只有當關聯對象被真正使用時才進行查詢,可以有效地提高系統的性能和響應速度。

  7. 支持插件,擴展性強:MyBatis提供了插件接口,開發者可以通過編寫插件來擴展MyBatis的功能。

  8. 代碼量少,學習曲線平緩:相比於其他ORM框架,MyBatis的代碼量更少,學習曲線更平緩,更容易上手。

總的來說,MyBatis的優點主要體現在其靈活性、效率和易用性上。

4、MyBatis 有哪些缺點?

雖然MyBatis是一個非常受歡迎的持久層框架,但它也存在一些缺點:

  1. 沒有完全實現ORM:與Hibernate這樣的全功能ORM框架相比,MyBatis並沒有完全實現對象關係映射。開發者需要手寫SQL,這可能會增加一些開發工作量。

  2. 緩存管理:雖然MyBatis提供了一級和二級緩存,但是對於複雜的緩存場景,比如緩存失效、緩存更新等,管理起來可能會有些複雜。

  3. 對於大型項目,XML配置可能變得冗長:隨着項目的增長,MyBatis的XML配置文件可能會變得非常冗長,這可能會導致管理和維護的困難。

  4. 可能存在SQL注入風險:如果不小心編寫或配置SQL語句,可能會導致SQL注入的風險。儘管MyBatis提供了防止SQL注入的機制,但開發者仍然需要時刻保持警惕。

  5. 學習成本:對於新手來說,需要學習MyBatis的配置、SQL映射以及其他特性,這可能會增加一定的學習成本。

  6. 和某些框架整合時可能需要額外的配置:儘管MyBatis本身配置簡單,但在與Spring、Shiro等框架整合時,可能需要額外的配置工作。

  7. 過多依賴XML:對於一些開發者來說,過多的依賴XML可能不是他們喜歡的方式,他們可能更偏向於使用基於註解的配置。

  8. 不如其他ORM框架在數據持久化上自動化:例如,與Hibernate比較,MyBatis在實體的增刪改查操作上沒有那麼自動化,可能需要編寫更多的代碼。

儘管MyBatis存在以上所述的缺點,但由於其靈活性和高效性,它仍然是Java持久層框架中的一個重要選手。在選擇使用MyBatis之前,開發者應該根據項目需求和個人喜好進行權衡。

5、MyBatis 用到了哪些設計模式?

MyBatis在其設計和實現過程中使用了多種設計模式,以下是其中的一些:

  1. 工廠模式:在MyBatis中,SqlSessionFactory負責創建SqlSession,這是典型的工廠模式。工廠模式提供了一個創建對象的接口,但允許子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。

  2. 單例模式:SqlSessionFactoryBuilder在構建SqlSessionFactory的時候,使用了單例模式。SqlSessionFactory一旦被創建,應在應用執行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。使用SqlSessionFactory的最佳實踐是在應用運行期間不要重複創建多次,多次創建SqlSessionFactory被視爲一種代碼“壞習慣”。因此,最佳範圍是應用範圍。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

  3. 建造者模式:SqlSessionFactoryBuilder使用了建造者模式。建造者模式是將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。在MyBatis中,使用SqlSessionFactoryBuilder可以通過XML配置文件或者一個Java Configuration類構建出SqlSessionFactory。

  4. 代理模式:MyBatis對Mapper接口實現了Java動態代理,用戶可以直接通過接口和接口方法調用數據庫操作,而無需手動編寫DAO實現。代理模式爲其他對象提供一種代理以控制對這個對象的訪問。

  5. 模板方法模式:MyBatis的Executor執行器,是基於模板方法模式設計的。模板方法模式定義了一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

  6. 裝飾器模式:在MyBatis的緩存設計中,爲了增加緩存的各種行爲,比如定時清空、LRU淘汰等,採用了裝飾器模式。裝飾器模式可以動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更爲靈活。

  7. 策略模式:在MyBatis處理類型轉換時,採用了策略模式。策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,策略模式讓算法的變化獨立於使用算法的客戶。

以上就是MyBatis中用到的一些設計模式,通過這些設計模式的使用,MyBatis的代碼結構更加清晰,擴展性和可維護性也更強。

6、MyBatis常用註解有哪些?

MyBatis框架提供了一系列註解,用於簡化XML映射文件的使用。以下是一些常用的MyBatis註解:

  1. @Select:這個註解用於指定用來從數據庫中查詢數據的SQL語句。

    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUser(int id);
    ```
    
    
  2. @Insert:這個註解指定了用來向數據庫插入數據的SQL語句。

    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    void insertUser(User user);
    ```
    
    
  3. @Update:這個註解指定了用來修改數據庫中數據的SQL語句。

    @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
    void updateUser(User user);
    ```
    
    
  4. @Delete:這個註解指定了用來從數據庫中刪除數據的SQL語句。

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(int id);
    ```
    
    
  5. @Results@Result:這兩個註解用於映射數據庫表中的列到對象的屬性。

    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "name"),
        @Result(property = "age", column = "age")
    })
    @Select("SELECT * FROM users")
    List<User> selectAllUsers();
    ```
    
    
  6. @Param:這個註解用於給方法參數命名,參數名就能直接在SQL語句中使用。

    @Select("SELECT * FROM users WHERE name = #{name}")
    User selectUserByName(@Param("name") String name);
    ```
    
    
  7. @Mapper:這個註解用於標記接口爲一個MyBatis的mapper接口,MyBatis會自動掃描標記了@Mapper的接口並生成實現。

    @Mapper
    public interface UserMapper {
        // ...
    }
    ```
    
    
  8. @Options:這個註解用於設置一些MyBatis的特性,比如是否使用緩存,是否自動獲取生成的數據庫鍵等。

  9. @ResultMap:這個註解引用定義在Mapper XML文件中的一個ResultMap。

  10. @SelectProvider@InsertProvider@UpdateProvider@DeleteProvider:這些註解用來動態構建SQL語句。

這些註解提供了一種更簡潔的方法來寫SQL語句,無需在XML文件中書寫大量的映射代碼。但請注意,註解的方式可能不適合處理複雜的SQL語句和動態SQL語句。對於這些情況,你可能需要使用XML映射文件。

7、MyBatis 有哪些核心組件?

MyBatis 的主要核心組件包括以下幾個部分:

  1. SqlSessionFactoryBuilder: 這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好還是不要讓其一直存在,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

  2. SqlSessionFactory: SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次,多次重建 SqlSessionFactory 被視爲一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

  3. SqlSession: 每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。絕對不能將 SqlSession 實例的引用放在一個類的靜態字段或實例字段中。

  4. Mapper: Mapper 是創建出來用來綁定映射語句的接口。Mapper 的方法對應 SQL 映射文件中的一個 SQL 語句,這些接口在動態代理實現中,開發者無需手動實現,只需定義方法和相應 SQL 語句即可。

  5. Executor: Executor 是 MyBatis 的執行層,負責 SQL 語句的生成和查詢緩存的維護。它主要負責兩部分內容,一部分是根據 statement id 找到相應的映射語句,將輸入的參數轉換爲 SQL 語句;另一部分是將 SQL 語句交給 JDBC 執行,並將查詢結果映射成 Java 對象返回。

這些是 MyBatis 的核心組件,通過這些組件的協同工作,MyBatis 可以高效、靈活的完成持久層的操作。

8、MyBatis編程步驟是什麼樣的?

使用MyBatis進行數據庫操作的基本步驟如下:

  1. 添加MyBatis的依賴: 在項目的pom.xml文件中,添加MyBatis的依賴。

  2. 創建數據庫表: 根據業務需求,創建相應的數據庫表。

  3. 創建實體類: 根據數據庫表,創建相應的Java實體類,字段要與數據庫表的字段對應。

  4. 創建映射文件: 編寫MyBatis的映射文件,文件中定義SQL語句和結果映射規則。通常,一個映射文件對應一個實體類,文件中的一個SQL語句對應實體類的一個操作。

  5. 配置MyBatis: 創建MyBatis的核心配置文件,配置文件中主要包含數據庫連接信息,事務管理器類型,以及映射文件的路徑。

  6. 編寫Dao接口: 編寫Dao接口,接口中的方法與映射文件中的SQL語句一一對應。

  7. 創建SqlSessionFactory: 在程序中創建SqlSessionFactory對象,這個對象是MyBatis的核心對象,它代表和數據庫的會話,可以通過它獲取SqlSession對象。

  8. 執行操作: 通過SqlSessionFactory獲取SqlSession對象,然後調用SqlSession的方法,傳入Dao接口的全限定名和方法參數,從而完成數據庫的增刪改查操作。

  9. 釋放資源: 操作完成後,關閉SqlSession,釋放資源。

以上就是使用MyBatis進行數據庫操作的基本步驟,這個過程涵蓋了MyBatis的主要功能,使得數據庫操作更加簡單、高效。

9、MyBatis 和JDBC有什麼區別?

MyBatis 和 JDBC 是 Java 中操作數據庫的主要方式,它們各有自己的特點和優勢:

  1. 編程複雜度: JDBC 是 Java 的標準數據庫連接工具,它提供了一套完整的數據庫操作接口。使用 JDBC 可以完成所有的數據庫操作,但是編程複雜度高,需要手動編寫大量的 SQL 語句以及手動處理結果集。

    MyBatis 是一個持久層框架,它建立在 JDBC 之上,簡化了 JDBC 的操作。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 對象) 映射成數據庫中的記錄。

  2. SQL 語句的編寫和控制: 使用 JDBC,開發人員需要手動編寫 SQL 語句,並且對 SQL 語句的控制度較高,可以靈活地進行各種複雜的數據庫操作。但是,這同時也導致了開發的複雜度。

    使用 MyBatis,SQL 語句主要在 XML 配置文件中編寫,開發人員可以更清晰地看到 SQL 語句的結構,並且 MyBatis 支持動態 SQL,可以在運行時動態生成 SQL 語句。

  3. 數據庫結果集的處理: 在 JDBC 中,開發人員需要手動對數據庫結果集進行處理,將結果集轉換爲 Java 對象。這個過程需要編寫大量的代碼,並且容易出錯。

    在 MyBatis 中,開發人員可以通過 XML 配置或註解方式,聲明結果集與 Java 對象的映射關係,MyBatis 會自動將數據庫結果集轉換爲 Java 對象。

所以,MyBatis 與 JDBC 相比,主要優勢在於簡化了 JDBC 的操作,使得 SQL 語句更加清晰,減少了開發人員手動處理結果集的工作,大大提高了開發效率。

10、MyBatis 中的緩存機制有啥用?

MyBatis 提供了一級緩存和二級緩存兩種緩存機制,主要用於提高查詢性能,減少數據庫的訪問次數。

  1. 一級緩存(Session Cache): 一級緩存是 SqlSession 級別的緩存,當我們執行查詢時,會先從緩存中獲取數據,如果沒有,就從數據庫查詢數據,並將查詢出的數據放入緩存中。一級緩存會在 SqlSession 關閉或提交時清空。

    一級緩存的主要目的是爲了防止一個 SqlSession 內部多次查詢相同數據,導致多次向數據庫發出查詢請求。通過使用一級緩存,可以在 SqlSession 生命週期內提高查詢效率。

  2. 二級緩存(Mapper Cache): 二級緩存是 Mapper 級別的緩存,多個 SqlSession 可以共享二級緩存中的數據,即使 SqlSession 關閉,二級緩存中的數據也不會被清空,只有在同一個 SqlSessionFactory 中的 SqlSession 才能共享同一個二級緩存。

    二級緩存的主要目的是爲了防止多個 SqlSession 查詢相同的數據,導致多次向數據庫發出查詢請求。通過使用二級緩存,可以跨 SqlSession 提高查詢效率。

需要注意的是,儘管緩存可以提高查詢的性能,但是如果數據的一致性要求很高,或者數據的更新頻率很快,使用緩存可能會導致數據的不一致,因此在使用緩存時需要考慮其適用場景。

11、MyBatis 一級緩存和二級緩存的區別?

MyBatis 的一級緩存和二級緩存主要有以下幾個區別:

  1. 緩存級別: 一級緩存是基於 SQL Session 的,即一級緩存的生命週期與 SQL Session 相同,只作用在這個 SQL Session 中。當 SQL Session 結束的時候,一級緩存也就結束了。而二級緩存是基於 SQL Session Factory 的,它可以跨 SQL Session,只要在同一個 SQL Session Factory 中,就能夠共享二級緩存。

  2. 緩存的數據: 一級緩存默認情況下會開啓,MyBatis 在執行查詢操作時,會先從一級緩存中查詢數據,如果沒有找到數據,纔會執行 SQL 查詢數據庫,並將查詢到的結果存入一級緩存中。二級緩存需要在 MyBatis 的配置文件中進行配置,只有在進行配置後,二級緩存纔會開啓。

  3. 數據共享: 一級緩存不能實現多個 SQL Session 之間的數據共享,因爲一級緩存是基於 SQL Session 的。而二級緩存可以實現多個 SQL Session 之間的數據共享,因爲二級緩存是基於 SQL Session Factory 的。

  4. 緩存的清空: 當 SQL Session 執行了增刪改(包括 commit 操作)操作時,就會清空一級緩存。而二級緩存只有在調用了 clearCache() 方法時纔會清空。

  5. 使用場景: 一級緩存主要適用於一個業務操作中頻繁操作同一份數據的情況,能夠減少與數據庫的交互次數,提高系統的性能。二級緩存主要適用於多個業務操作中頻繁操作同一份數據的情況,同樣可以減少與數據庫的交互次數,提高系統的性能。

總的來說,一級緩存主要解決的是重複查詢的問題,而二級緩存則主要解決了多次查詢相同數據的問題。

12、MyBatis 一級緩存和二級緩存是什麼數據結構?

MyBatis 的一級緩存和二級緩存的數據結構主要是基於HashMap實現的。

  1. 一級緩存(Session Cache): MyBatis 的一級緩存是基於PerpetualCache(永久緩存)實現的,而PerpetualCache內部使用了 Java 的HashMap作爲存儲結構。每個SqlSession都有一個自己的一級緩存,當SqlSession關閉或提交時,該SqlSession的一級緩存就會清空。

  2. 二級緩存(Mapper Cache): MyBatis 的二級緩存同樣是基於PerpetualCache實現的,PerpetualCache內部使用HashMap作爲存儲結構。二級緩存是跨SqlSession的,對於同一個SqlSessionFactory,多個SqlSession可以共享其二級緩存。當調用SqlSessionclearCache方法時,就會清空當前SqlSessionFactory的二級緩存。

在實際使用中,二級緩存還可以通過裝飾者模式添加各種裝飾器,例如FifoCache(先進先出緩存)、LruCache(最少使用緩存)、SoftCache(軟引用緩存)等,以實現更多的緩存策略。

需要注意的是,無論是一級緩存還是二級緩存,都不適合用於存儲大量數據,因爲它們都是基於內存的緩存,如果存儲大量數據,可能會導致內存溢出。同時,MyBatis 的緩存都是本地緩存,不適合在分佈式環境中使用。如果在分佈式環境中需要使用緩存,可以考慮使用如Redis等分佈式緩存解決方案。

13、MyBatis 中的緩存有哪些實現類型?

MyBatis 提供了兩級緩存:一級緩存和二級緩存,它們的實現方式如下:

一級緩存:

一級緩存是 SqlSession 級別的緩存,非全局的,它的生命週期與 SqlSession 一致。當我們在同一個 SqlSession 中執行相同的 SQL 語句時,第一次查詢後的結果會被緩存在這個 SqlSession 中,如果我們再次執行相同的 SQL 語句,MyBatis 就會直接從緩存中取出結果,而不需要再次訪問數據庫。

二級緩存:

二級緩存是全局的,它的生命週期與 SqlSessionFactory 一致。二級緩存是跨 SqlSession 的,多個 SqlSession 可以共享這個緩存。只要一個 SqlSession 查詢過一段數據,其他的 SqlSession 就可以直接從二級緩存中取出結果,而不需要再次訪問數據庫。

MyBatis 默認提供了基於內存的緩存實現(PerpetualCache),但是你也可以通過實現 Cache 接口來定製自己的緩存策略,例如,使用 EhCache、Redis 等技術實現分佈式緩存。

要注意的是,雖然緩存可以提高性能,但是也可能會導致數據不一致的問題,因此在使用緩存時需要考慮到這個問題,並採取合適的策略來處理。

以上就是關於 MyBatis 中的緩存實現類型的介紹,希望對您有所幫助。如果您有其他問題,歡迎繼續提問。

14、MyBatis 默認會開啓緩存機制嗎? 怎麼開啓?

一級緩存:

MyBatis 默認開啓一級緩存,一級緩存是 SqlSession 級別的緩存,它的生命週期與 SqlSession 一致。當我們在同一個 SqlSession 中執行相同的 SQL 語句時,第一次查詢後的結果會被緩存在這個 SqlSession 中,如果我們再次執行相同的 SQL 語句,MyBatis 就會直接從緩存中取出結果,而不需要再次訪問數據庫。

二級緩存:

MyBatis 的二級緩存默認是不開啓的,需要我們手動去開啓。二級緩存是跨 SqlSession 的,多個 SqlSession 可以共享這個緩存。

開啓二級緩存的步驟如下:

  1. 在 MyBatis 的全局配置文件中開啓二級緩存:
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
  1. 在需要使用二級緩存的 mapper 映射文件中添加如下配置:
<cache/>

或者如果你想自定義緩存的行爲,你可以這樣配置:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

以上就是關於 MyBatis 緩存的開啓方法。但是需要注意的是,雖然緩存可以提高性能,但是也可能會導致數據不一致的問題,因此在使用緩存時需要考慮到這個問題,並採取合適的策略來處理。

15、MyBatis 爲什麼默認不會開啓二級緩存?

雖然二級緩存可以提高查詢的性能,但是開啓二級緩存也有一些潛在的問題需要注意:

  1. 數據一致性問題:二級緩存是跨SqlSession的,多個SqlSession可以共享這個緩存,這就意味着如果在一個SqlSession中更新了數據,而這個數據在其他SqlSession中也被緩存了,那麼這些緩存的數據就會變得不一致。這是一個非常棘手的問題,要解決這個問題需要使用一些複雜的策略,如緩存同步,這可能會加大系統的複雜性。

  2. 可能產生髒讀:如果多個SqlSession同時操作同一份數據,由於二級緩存數據的更新是在SqlSession提交或關閉時纔會進行,這就可能導致一個SqlSession讀到的是其他SqlSession尚未提交的髒數據。

  3. 內存消耗問題:二級緩存是存儲在內存中的,如果緩存的數據量過大,會增加內存的消耗,可能會導致內存溢出。

因此,MyBatis默認是不開啓二級緩存的,需要開發者根據實際的業務需求和系統環境來決定是否需要開啓二級緩存,以及如何設置二級緩存的參數,以達到最優的效果。

由於內容太多,更多內容以鏈接形勢給大家,點擊進去就是答案了

16. MyBatis 中的緩存什麼時候會被清理?

17. MyBatis 二級緩存清理策略有哪些?

18. MyBatis 接口綁定有哪幾種方式?

19. MyBatis 有哪幾種 SQL 編寫形式?

20. MyBatis 映射文件中有哪些頂級元素?

21. MyBatis 映射時 A 引用了 B,如果 B 在 A 後面會怎樣?

22. MyBatis 中 Mapper 接口的實現原理是?

23. MyBatis用註解綁定和用XML文件綁定有什麼區別?

24. MyBatis通常一個 Xml 映射文件,都會寫一個 Dao 接口與之對應, Dao 的工作原理,是否可以重載?

25. MyBatis 中 Mapper 中的 SQL 語句可以重載嗎?

26. MyBatis動態 sql 是做什麼的?都有哪些動態 sql?能簡述一下動態 sql 的執行原理不?

27. MyBatis實體類中的屬性名和表中的字段名不一樣 ,怎麼辦 ?

28. MyBatis 配置文件中的 SQL id 是否能重複?

29. MyBatis 支持哪些傳參數的方法?

30. MyBatis 的$和# 傳參的區別?

31. MyBatis 可以映射到枚舉類嗎?

32. MyBatis 怎麼封裝動態 SQL?

33. MyBatis trim 標籤有什麼用?

34. MyBatis where 標籤有什麼用?

35. MyBatis 是如何進行分頁的?分頁插件的原理是什麼?

36. MyBatis 有幾種分頁方式?

37. MyBatis 邏輯分頁和物理分頁的區別是什麼?

38. MyBatis 流式查詢有什麼用?

39. MyBatis 模糊查詢 like 語該怎麼寫?

40. MyBatis 如何防止 SQL 注入?

41. MyBatis 如何獲取自動生成的主鍵id?

42. MyBatis 中jdbcType 和javaType 的區別?

43. MyBatis 什麼時候必須指定jdbcType 和javaType?

44. MyBatis 什麼時候必須指定jdbcType 和javaType?

45. MyBatis 支持預編譯嗎? 怎麼做?

46. MyBatis 中的事務管理方式?

47. MyBatis 中怎麼開啓事務?

48. MyBatis 事務和 Spring 事務有什麼區別?

49. MyBatis 使用了哪些設計模式?

50. MyBatis-Plus 是什麼框架?

51. 什麼是 JPA?

52. MyBatis 和JPA 有什麼區別?

53. MyBatis 中 StatementHandler 和 MappedStatement 區別?

54. MyBatis 常用的 TypeHandler 有哪些?

55. MyBatis 怎麼實現自定義的 TypeHandler?

56. MyBatis 執行流程是怎樣的?

57. MyBatis 中的 SglSession 是線程安全的嗎?

58. MyBatis 中的 SglSession 有哪些實現類?

59. MyBatis 中的 DefaultSqlSession 爲什麼不是線程安全的?

60. MyBatis 中 SqlSessionTemplate 與 SqlSessionManager 的區別?

61. MyBatis和Hibernate有什麼區別?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章