JavaWeb編程面試題——MyBatis

来源:https://www.cnblogs.com/coding-rocket/archive/2023/05/29/17439976.html
-Advertisement-
Play Games

面試題==知識點,這裡所記錄的面試題並不針對於面試者,而是將這些面試題作為技能知識點來看待。不以刷題進大廠為目的,而是以學習為目的。這裡的知識點會持續更新,目錄也會隨時進行調整。 ...


引言

面試題==知識點,這裡所記錄的面試題並不針對於面試者,而是將這些面試題作為技能知識點來看待。不以刷題進大廠為目的,而是以學習為目的。這裡的知識點會持續更新,目錄也會隨時進行調整。

關註公眾號:編程火箭車。在【粉絲福利】中點擊【面題大全】,其中的Java面試題線上實時更新、查看。


一、面試題導航

點這裡進入JavaWeb編程面試題——導航

面試題持續更新中......

二、面試題目

1.什麼是MyBatis?

(1)MyBatis 是一個半 ORM(對象關係映射)框架,它內部封裝了 JDBC,開發時只需關註 SQL 語句本身,不需要花費精力去處理載入驅動、創建連接、創建 statement 等繁雜的過程。程式員直接編寫原生態 SQL,可以嚴格控制 SQL 執行性能,靈活度高。

(2)MyBatis 可以使用 XML 或註解來配置和映射原生信息,將 POJO 映射成資料庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。

(3)通過 XML 文件或註解的方式將要執行的各種 statement 配置起來,並通過 Java 對象和 statement 中 SQL 的動態參數進行映射生成最終執行的 SQL 語句,最後由 MyBatis 框架執行 SQL 並將結果映射為 Java 對象並返回。(從執行 SQL 到返回 result 的過程)

2.MyBatis優缺點?

優點:
(1)基於 SQL 語句編程,相當靈活,不會對應用程式或者資料庫的現有設計造成任何影響,SQL 寫在 XML 中,解除 SQL 與程式代碼的耦合,便於統一管理。提供 XML 標簽,支持編寫動態 SQL 語句,並可重用;

(2)與 JDBC 相比,減少了50%以上的代碼量,消除了 JDBC 大量冗餘的代碼,不需要手動開關連接;

(3)很好的與各種資料庫相容(因為 MyBatis 使用 JDBC 來連接資料庫,所以只要 JDBC 支持的資料庫 MyBatis 都支持);

(4)能夠與 Spring 很好的集成(MyBatis 官方提供與 Spring 的整合包);

(5)提供映射標簽,支持對象與資料庫的 ORM 欄位關係映射;提供對象關係映射標簽,支持對象關係組件維護。

缺點:

(1)SQL 語句的編寫工作量較大,尤其當欄位多、關聯表多時,對開發人員編寫 SQL 語句的功底有一定要求。

(2)SQL 語句依賴於資料庫,導致資料庫移植性差,不能隨意更換資料庫。

3.MyBatis框架適用場合?

MyBatis 專註於 SQL 自身,是一個足夠靈活的 DAO 層解決方案。對性能的要求很高,或者需求變化較多的項目,例如 Web 項目,互聯網項目等等, MyBatis 都是不錯的選擇。

4.MyBatis框架原理?

mybatis架構圖

  1. MyBatis 配置:SqlMapConfig.xml,此文件作為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息。mapper.xml 文件即 SQL 映射文件,文件中配置了操作資料庫的 SQL 語句。此文件需要在 SqlMapConfig.xml 中載入。

  2. 通過 MyBatis 環境等配置信息構造 SqlSessionFactory 即會話工廠。

  3. 由會話工廠創建 sqlSession 即會話,操作資料庫需要通過 sqlSession 進行。

  4. MyBatis 底層自定義了 Executor 執行器介面操作資料庫,Executor 介面有兩個實現,一個是基本執行器、一個是緩存執行器。

  5. Mapped Statement 也是 MyBatis 一個底層封裝對象,它包裝了 MyBatis 配置信息及 SQL 映射信息等。mapper.xml 文件中一個 SQL 對應一個 Mapped Statement 對象,SQL 的 id 即是 Mapped statement 的 id。

  6. Mapped Statement 對 SQL 執行輸入參數進行定義,包括 HashMap、基本類型、POJO,Executor 通過 Mapped Statement 在執行 SQL 前將輸入的 Java 對象映射至 SQL 中,輸入參數映射就是 JDBC 編程中對 preparedStatement 設置參數。

  7. Mapped Statement 對 SQL 執行輸出結果進行定義,包括 HashMap、基本類型、POJO,Executor 通過 Mapped Statement 在執行 SQL 後將輸出結果映射至 Java 對象中,輸出結果映射過程相當於 JDBC 編程中對結果的解析處理過程。

5.MyBatis和Hibernate的區別?

(1)MyBatis 和 Hibernate 不同,它不是一個完全的 ORM 框架,因為 MyBatis 需要程式員自己編寫 SQL 語句;

(2)MyBatis 直接編寫原生態 SQL,可以嚴格控制 SQL 執行性能,靈活度高,非常適合對關係數據模型要求不高的軟體開發,因為這類軟體需求變化頻繁,一旦有需求變化可以迅速輸出成果。但是靈活的前提是 MyBatis 無法做到資料庫無關性,如果需要實現支持多種資料庫的軟體,則需要自定義多套 SQL 映射文件,工作量大。

(3)Hibernate 對象/關係映射能力強,資料庫無關性好,對於關係模型要求高的軟體,如果用 Hibernate 開發可以節省很多代碼,提高效率。

6.MyBatis有哪些動態標簽?

  • if 標簽:判斷是否符合條件

  • foreach 標簽:對一個集合進行遍歷

  • where 標簽:補充響應的 where 的 SQL 語句

  • sql 標簽:定義可重用的 SQL 代碼段,可以包含在其他語句中。

  • ......

7.MyBatis中一對一如何實現?

在映射文件中 resultMap 元素里配置 association 節點,配置一對一的類就可以完成。

8.MyBatis中一對多如何實現?

在映射文件中 resultMap 裡面配置 collection 節點,配置一對多的類就可以完成。

9.MyBatis編程步驟?

  1. 創建 SqlSessionFactory 會話工廠

  2. 通過 SqlSessionFactory 創建 SqlSession 會話

  3. 通過 sqlSession 執行資料庫操作

  4. 通過 `session.commit()`` 提交事務

  5. 調用 `session.close()`` 關閉會話

10.MyBatis的一級緩存和二級緩存?

  • Mybatis 首先會到緩存中查詢結果集,如果沒有則查詢資料庫,如果有則直接從緩存取出結果集。Mybatis 內部存儲緩存使用一個 HashMap,key 為 hashCode+sqlId+Sql 語句。value 為從查詢出來映射生成的 Java 對象。

  • Mybatis 的一級緩存即本地緩存,它的作用域是一個 sqlSession 會話,即在同一個 sqlSession 中兩次執行相同的 SQL 語句,第一次執行完畢會將資料庫中查詢的數據寫到緩存(記憶體),第二次會從緩存中獲取數據將不再從資料庫查詢,從而提高查詢效率。

  • Mybatis 的二級緩存即查詢緩存,它的作用域是一個 mapper 的 namespace,即在同一個 namespace 中查詢相同的 SQL 可以從緩存中獲取數據。二級緩存是可以跨 SqlSession 的。

11.#{} 和 ${} 區別?

  • #{}表示一個占位符號,可以有效防止sql註入。

  • ${}表示拼接sql串,在低版本中括弧中只能是value。

  • #{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql註入。

  • #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括弧中可以是value或其它名稱。

  • ${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換。

  • ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,低版本中${}括弧中只能是value。

12.Mybatis的mapper.xml文件中常用標簽有哪些?

<select>、<insert>、<update>、<delete>、<sql>、<resultMap>、<set>、<where>...

13.Mybatis的xml映射文件中,不同的xml映射文件,id是否可以重覆?

不同的xml映射文件,如果配置了namespace,那麼id可以重覆;如果沒有配置namespace,那麼id不能重覆;原因就是namespace+id是作為Map<String, MapperStatement>的key使用的,如果沒有namespace,就剩下id,那麼,id重覆會導致數據互相覆蓋。有了namespace,自然id就可以重覆,namespace不同,namespace+id自然也就不同。

備註:在舊版本的Mybatis中,namespace是可選的,不過新版本的namespace已經是必須的了。

14.MyBatis 分頁如何處理?

mybatis分頁查詢有兩種方案:

  • 可以通過limit關鍵字拼接SQL語句,需要兩個參數,第一個參數為開始條數,第二個參數為查詢個數。

  • 可以通過 pageHelper 插件實現:

    • 在sqlMapConfig 文件中配置 mybatis的插件(plugins)

    • 在查詢數據前通過 PageHelper.start() 方法,調用 PageHelper 插件,參數為當前頁和每頁顯示條數

    • 查詢結果會封裝到一個page對象中,包含分頁查詢記錄、總記錄數、總頁數等

    • 從page對象中獲取需要的數據

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

Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁。可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

分頁插件的基本原理是使用mybatis提供的插件介面,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。

16.如何獲取自動生成的主鍵?

  • 自增主鍵返回

    • mysql 自增主鍵,執行 insert 提交之前自動生成一個自增主鍵。可以通過 mysql 函數獲取剛插入記錄的自增主鍵:LAST_INSERT_ID(),是在insert之後去調用。

      <insert id="insertTeacher" parameterType="Teacher" >
      	<selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
      		SELECT LAST_INSERT_ID()
      	</selectKey>
      	INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex})
      </insert>
      
    • 設置insert屬性獲取自增id

      <insert id="insertTeacher" parameterType="Teacher" useGeneratedKeys="true" keyProperty="id" >
      	INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex})
      </insert>
      
  • 非自增主鍵返回

    mysql 使用 uuid 實現主鍵,需要修改表中 id 欄位類型為 varchar,長度至少36位。
    執行思路:先通過 uuid() 查詢到主鍵,將主鍵輸入到 SQL 語句中。執行 uuid() 語句順序相對於 insert語句在之前。

    <!-- 使用mysql的uuid()生成主鍵
    	執行過程:
    	首先通過uuid()得到主鍵,將主鍵設置到teacher對象的id屬性中
    	其次在insert執行時,從teacher對象中取出id屬性值
    -->
    <insert id="insertTeacher" parameterType="Teacher">
    	<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
    		SELECT UUID()
    	</selectKey>
    	INSERT INTO teacher (id,name,idcard) VALUES (#{id},#{name},#{idcard})
    </insert>
    

17.在mapper中如何傳遞多個參數?

第一種:直接多個參數

// DAO層 介面
User listUsers(String name, String sex);
<!-- mapper映射文件 
		#{0}代表接收dao層方法中的第一個參數,#{1}代表接收第二個參數,更多參數一直往後加即可
-->
<select id="listUsers" resulType="User">
    select * from user where name=#{0} and sex=#{1}
</select>

第二種:使用@param註解

// DAO層 介面
User listUsers(@param("uname") String name, @param("usex") String sex);
<!-- mapper映射文件 -->
<select id="listUsers" resulType="User">
    select * from user where name=#{uname} and sex=#{usex}
</select>

第三種:多個參數封裝成map集合

// 映射文件的命名空間.sql片段的id,就可以調用對應的映射文件的SQL
// 由於參數超過了兩個,而方法中只有一個Object參數收集,因此我們使用Map集合來封裝參數
Map<String, Object> map = new HashMap<>();
map.put("uname", "張三");
map.put("usex", "男");

sqlSession.selectList("user.listUsers", map);
<!-- mapper映射文件 -->
<select id="listUsers" resulType="User">
    select * from user where name=#{uname} and sex=#{usex}
</select>

18.使用mapper介面開發DAO時有哪些要求?

  • Mapper.xml 文件中的 namespace 與 mapper 介面的類路徑相同。

  • Mapper 介面方法名和 Mapper.xml 中定義的每個 statement 的 id 相同

  • Mapper 介面方法的輸入參數類型和 mapper.xml 中定義的每個 sql 的 parameterType 的類型相同

  • Mapper 介面方法的輸出參數類型和 mapper.xml 中定義的每個 sql 的 resultType 的類型相同

19.MyBatis的配置文件sqlMapConfig.xml中有哪些內容?

配置內容和順序如下:

  • configuration(配置)
    • properties(屬性)
    • settings(全局配置參數)
    • typeAliases(類型別名)
    • typeHandlers(類型處理器)
    • objectFactory(對象工廠)
    • plugins(插件)
    • environments(環境配置)
    • environment(環境變數)
    • transactionManager(事務管理器)
    • dataSource(數據源)
    • databaseIdProvider(資料庫廠商標識)
    • mappers(映射器)

20.MyBatis中有哪些重要組件?

MyBatis是一個開源的Java持久化框架,它可以輕鬆訪問關係資料庫,將SQL語句和數據映射到Java對象中,並提供了很多高級特性。下麵是MyBatis中的幾個重要組件:

  1. SqlSession:SqlSession是MyBatis的核心介面之一,其作用相當於對JDBC操作的封裝。SqlSession提供了執行SQL語句、提交事務、獲取Mapper映射器等操作。

  2. Configuration:Configuration是MyBatis的全局配置類,它負責解析和管理MyBatis的配置文件,並提供了許多高級特性,如緩存配置、類型別名配置、插件配置等。

  3. Mapper映射器:Mapper映射器是MyBatis中用於映射Java方法與SQL語句的方法。通過Mapper映射器,可以將Java方法和SQL語句綁定在一起,從而輕鬆地在Java中執行SQL語句。

  4. Executor:Executor是MyBatis中用於執行SQL語句的核心介面,它負責從SqlSession中接收SQL語句並執行它們,同時還負責緩存結果、處理事務等操作。

  5. TypeHandler:TypeHandler是MyBatis中的重要組件之一。它負責將Java對象和資料庫中的數據進行轉換。MyBatis中預設提供了很多TypeHandler,同時也支持自定義TypeHandler。

這些組件構成了MyBatis框架的核心,並提供了許多高效、易用、可擴展的特性,使開發人員可以輕鬆地進行數據訪問和持久化操作。


關註公眾號:編程火箭車
我們定期發佈編程相關的文章、資訊、活動等內容。幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎。歡迎大家關註,和我們一起探索編程的精彩世界。我們定期發佈編程相關的文章、資訊、活動等內容。幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎。歡迎大家關註,和我們一起探索編程的精彩世界。

本文來自博客園,作者:編程火箭車,轉載請註明原文鏈接:https://www.cnblogs.com/coding-rocket/p/17439976.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 教程簡介 Flume是Apache下麵的一個分散式組件,它提供高效,可靠的收集,整合,傳輸日誌數據的服務。Flume可以理解成一個管道,它連接數據的生產者和消費者,它從數據的生產者(Source)獲取數據,保存在自己的緩存(Channel)中,然後通過Sink發送到消費者。它不對數據做保存和復 ...
  • ## 測試環境: > MySQL版本:8.0 資料庫表:T (主鍵id,唯一索引c,普通欄位d) ![](http://img.javastack.cn/1685072039483867.png) 如果你的業務設計依賴於自增主鍵的連續性,這個設計假設自增主鍵是連續的。但實際上,這樣的假設是錯的,因為 ...
  • 編碼如下:#include <stdio.h> void swap(int* x,int* y ){ int tmp; tmp=*x; *x=*y; *y=tmp ; }; int main(){ int a=4; int b=5; printf("befer\n"); printf("a=%d\n ...
  • @[TOC] # 1.背景 最近項目是國際項目,所以需要經常需要用到UTC時間和local時間的轉換。 所以整理了一下時間戳工具類,方便使用。 這裡主要用到的包就是datatime、time、pytz。 # 2. 遇到的坑 直接看測試案例 ```python tzinfo=pytz.timezone ...
  • 本文將為大家詳細講解Java中Properties配置類怎麼用,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題!文章較長,乾貨滿滿,建議大家收藏慢慢學習。文末有本文重點總結,主頁有全系列文章分享。技術類問題,歡迎大家和我們一起交流討... ...
  • SQLAlchemy是著名的ORM(Object Relational Mapping-對象關係映射)框架。其主要作用是在編程中,把面向對象的概念跟資料庫中表的概念對應起來。對許多語言(例如JAVA/PYTHON)來說就是定義一個對象,並且這個對象對應著一張資料庫的表。而這個對象的實例,就對應著表中... ...
  • 摘要:Python Web程式員必看系列,學習如何壓縮 JS 代碼。 本文分享自華為雲社區《Python壓縮JS文件,PythonWeb程式員必看系列,重點是 slimit》,作者: 夢想橡皮擦 。 本篇博客將學習壓縮 JS 代碼,首先要學習的模塊是 jsmin。 jsmin 庫 Python 中的 ...
  • ## 文章首發 [【重學C++】05 | 說透右值引用、移動語義、完美轉發(下)](https://mp.weixin.qq.com/s/w7yXp6efE7_V0EHxXWJiJA) ## 引言 大家好,我是只講技術乾貨的會玩code,今天是【重學C++】的第五講,在第四講《[【重學C++】04 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...