成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

親,收下這款Mybatis面試手冊吧

開發 架構
咱們先來熟悉一下Mybatis的概念,你可能心里會有點反感,哎啊我天天用這個框架,你別給我扯犢子了,直接開門見山吧,這里我就啰嗦幾句,而且這幾句也是面試愛問的一個點

[[440020]]

前言

其實本篇文章是不太適合小白看的,畢竟如果你不太懂Mybatis的話,直接來看這些面試題是不合適的,所以可能看著比較吃力,但是呢,即使你是小白也無妨,我也會盡量的讓你讀懂,如果暫時讀不懂呢,不知道說的某個問題的重點是哪里呢。也沒關系,收藏+關注,再也不迷路!

老規矩,咱們先來熟悉一下Mybatis的概念,你可能心里會有點反感,哎啊我天天用這個框架,你別給我扯犢子了,直接開門見山吧,這里我就啰嗦幾句,而且這幾句也是面試愛問的一個點

Mybatis是什么?

1、優秀的持久層框架,對JDBC的操作數據庫的過程進行封裝,使開發者只需要在關注SQL本身,不需要花精力去處理各種JDBC的東西(我想大家在初期學習的時候都被JDBC的各種步驟而懵過)

2、基于SQL,很靈活,SQL寫在XML文件中,還提供了多種XML標簽,支持動態的編寫SQL

3、和各種數據庫兼容,和Spring兼容

4、缺點:大概就是需要對SQL有一定的基礎,并且數據庫之間的移植性較差

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編程中對結果的解析處理過程。

OK啦,稍微讀完上面那些,即使是小白也大致知道個意思了,就是一個幫助開發者去操作數據庫的框架,走,話不多少,我們來一波面試風暴

風暴來臨

一個腦袋锃亮的中年男人拿著一個帶著些許劃痕的Mac走到了我的面前,張口就問,吃飯了嗎

我面帶微笑回答吃了(這可真是中國人的傳統客氣話哈

锃亮的面試官說,我們開門見山吧,也不廢話了

你準備好了嗎?

說一下XML中的標簽

在XML文件中有9個頂級標簽,下面簡單的介紹下各個標簽的作用,至于標簽的具體使用和其中的參數的含義,我會另起一篇文章來解釋

  1. cache:對給定命名空間的緩存配置。 
  2.  
  3. cache-ref:對其他命名空間緩存配置的引用。 
  4.  
  5. delete:映射相應的刪除語句。 
  6.  
  7. insert:映射相應的插入語句。 
  8.  
  9. select:映射相應的查詢語句。 
  10.  
  11. update:映射相應的更新語句。 
  12.  
  13. sql:可被其他語句引用的可重用語句塊。 

parameterMap:已被廢棄!老式風格的參數映射。更好的辦法是使用內聯參數,此元素可能在將來被移除。

resultMap:是最復雜也是最強大的元素,用來描述如何從數據庫結果集中來加載對象。

Mybatis是如何將sql執行結果封裝為目標對象并返回的?都有哪些映射形式?

第一種是使用標簽,逐一定義列名和對象屬性名之間的映射關系。

第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如USER_NAME AS NAME,Mybatis會忽略列名的大小寫,直接找到和值對應的對象屬性名

有了列名與屬性名的映射關系后,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值并返回,那些找不到映射關系的屬性,是無法完成賦值的。

Mybatis中的動態SQL,說下怎么用吧

不用說了,直接上各個標簽吧給各位看官

關于具體用法,我會另起一篇文章給大家詳細說說,舉舉例子,放在一個里面太多了,放不下,大家的閱讀耐心也是有限的

  1. foreach:用來循環容器的標簽。 
  2. concat:模糊查詢。 
  3. choose (when, otherwise)標簽:choose標簽是按順序判斷其內部when標簽中的test條件出否成立,如果有一個成立,則 choose 結束。當 choose 中所有 when 的條件都不滿則時,則執行 otherwise 中的sql。類似于Java 的 switch 語句,choose 為 switch,when 為 case,otherwise 則為 default。 
  4. if:判斷結論是否成立。 
  5. where:SQL語句的where條件。 
  6. set:使用set標簽可以將動態的配置SET關鍵字,和剔除追加到條件末尾的任何不相關的逗號。 
  7. trim:trim是更靈活的去處多余關鍵字的標簽,他可以實踐whereset的效果。 

Mybatis分頁實現

mybatis框架分頁實現,有幾種方式,最簡單的就是利用原生的sql關鍵字limit來實現,還有一種就是利用interceptor來拼接sql,實現和limit一樣的功能,再一個就是利用PageHelper來實現

第一種limit關鍵字不用多說了吧,第二種攔截器其實就是攔截相應的會話進行攔截,實現動態添加limit,而第三種就是內部幫助我們實現了攔截器的功能,不用自己來實現了,可以認為底層都是通過limit關鍵字來獲取分頁數據的

#{}和${}的區別是什么?

${}是字符串替換,相當于直接顯示數據,#{}是預編譯處理,相當于對數據加上雙引號

即#是將傳入的值當做字符串的形式,先替換為?號,然后調用PreparedStatement的set方法來賦值,而$是將傳入的數據直接顯示生成sql語句。

使用#{}可以有效的防止SQL注入,提高系統安全性(語句的拼接),如果使用在order by 中就需要使用 ${}。

最大區別在于:#{} 傳入值時,sql解析參數是帶引號的,而${}傳入值時,sql解析參數是不帶引號的。

通常一個Xml映射文件,都會寫一個Dao接口與之對應,這個Dao接口的工作原理是什么?Dao接口里的方法,參數不同時,方法能重載嗎?

Dao接口,就是人們常說的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法內的參數,就是傳遞給sql的參數。

Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串作為key值,可唯一定位MappedStatement,Dao接口里的方法,是不能重載的,因為是全限名+方法名的保存和尋找策略。

Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所代表的sql,然后將sql執行結果返回。

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?

不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。

原因就是namespace+id是作為Map

Mybatis是否可以映射Enum枚舉類?

Mybatis可以映射枚舉類,不單可以映射枚舉類,Mybatis可以映射任何對象到表的一列上。映射方式為自定義一個TypeHandler,實現TypeHandler的setParameter()和getResult()接口方法。

TypeHandler有兩個作用,一是完成從javaType至jdbcType的轉換,二是完成jdbcType至javaType的轉換,體現為setParameter()和getResult()兩個方法,分別代表設置sql問號占位符參數和獲取列查詢結果。

Mybatis映射文件中,如果A標簽通過include引用了B標簽的內容,請問,B標簽能否定義在A標簽的后面,還是說必須定義在A標簽的前面?

雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標簽依然可以定義在任何地方,Mybatis都可以正確識別。

原理是,Mybatis解析A標簽,發現A標簽引用了B標簽,但是B標簽尚未解析到,尚不存在,此時,Mybatis會將A標簽標記為未解析狀態,然后繼續解析余下的標簽,包含B標簽,待所有標簽解析完畢,Mybatis會重新解析那些被標記為未解析的標簽,此時再解析A標簽時,B標簽已經存在,A標簽也就可以正常解析完成了。

為什么說Mybatis是半自動ORM映射工具?它與全自動的區別在哪里?

Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。

而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具

Mybatis是否支持延遲加載?如果支持,它的實現原理是什么?

Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。

原理:使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用A.getB().getName(),攔截器invoke()方法發現A.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用A.setB(b),于是a的對象b屬性就有值了,接著完成A.getB().getName()方法的調用。這就是延遲加載的基本原理。

Mybatis都有哪些Executor執行器?它們之間的區別是什么?

Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。

ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map

BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。

在Mybatis配置文件中,可以指定默認的ExecutorType執行器類型,也可以手動給DefaultSqlSessionFactory的創建SqlSession的方法傳遞ExecutorType類型參數。

作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。

說一下Mybatis的一級、二級緩存的理解

一級緩存:一個sqlsession級別的,意思就是sqlsession只能訪問自己的一級緩存的數據,默認Map結構存儲。

一級緩存查詢存在于每一個的sqlsession類的實例對象中,當第一次查詢某一個數據時候,sqlsession類的實例對象會將該數據存入到一級緩存,其存儲作用域為 Session,當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認打開一級緩存。

首先用戶第一次查詢sql時候,sql的查詢結果就會被寫入sqlsession一級緩存中的,這樣用戶第二次查詢時,直接從一級緩存取出數據,而不是數據庫。如果用戶出現commit操作時,比如增刪改查,這時sqlsession中一級緩存區域就會全部清空。清空之后再次去一級緩存查找不到,就會走數據庫進行查找,然后再次存到緩存中。注意:緩存使用的數據結構也是map的。

二級緩存:二級緩存的范圍就是mapper級別,也就是mapper以命名空間為單位創建緩存數據結構,默認Map結構。

二級緩存和 一級緩存一樣的是,二級緩存的多個sqlsession去操作同一個mapper映射的sql語句,然后多個sqlsession可以共用二級緩存這樣的一個思想,它是跨sqlsession的;可以自定義存儲源,如Ehcache,默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置

總結下:mybatis的的一級緩存是SqlSession級別的緩存,一級緩存緩存的是對象,當SqlSession提交、關閉以及其他的更新數據庫的操作發生后,一級緩存就會清空。二級緩存是SqlSessionFactory級別的緩存,同一個SqlSessionFactory產生的SqlSession都共享一個二級緩存,二級緩存中存儲的是數據,當命中二級緩存時,通過存儲的數據構造對象返回。查詢數據的時候,查詢的流程是二級緩存>一級緩存>數據庫。

結束語

到了這里,也說了不少問題了,這些問題應該是面試中最常問到的關于Mybatis的問題了,也希望作為看官的你能夠為此收獲到一點一滴的知識點。

可能你對于其中的某一個問題不了解,可能你對于其中的問題不熟悉,但是通過我這篇文章你學到了一些,這篇文章的目的就已經達到了。

本文轉載自微信公眾號「Java賊船」,可以通過以下二維碼關注。轉載本文請聯系Java賊船公眾號。

 

責任編輯:武曉燕 來源: Java賊船
相關推薦

2022-01-06 08:34:32

數據庫Spark查詢

2012-05-16 19:16:10

iPhone 5

2020-12-31 11:21:57

開發技能代碼

2017-09-10 07:07:32

神經網絡數據集可視化

2024-03-26 10:30:37

Mybatis擴展庫API

2021-12-09 12:22:28

MyBatis流程面試

2022-03-21 09:05:18

volatileCPUJava

2009-09-01 13:01:58

思科CCSP認證思科CCSP認證介紹

2009-09-01 12:45:02

思科CCVP認證介紹思科CCVP認證

2013-12-30 13:34:18

VMwarevSphere 5.5

2020-12-02 06:12:27

TCPIP面試

2023-07-13 08:19:30

HaspMapRedis元素

2021-08-06 13:30:37

JS手寫題前端

2022-08-31 15:48:26

插件開發

2024-01-15 06:42:00

高并發熱點賬戶數據庫

2021-06-18 12:39:12

數據驅動設計設計師收集數據

2020-10-26 13:50:24

機器學習人工智能計算機

2017-09-18 09:35:14

2019-12-20 08:52:01

算法單鏈表存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线网 | 欧美综合久久 | 亚洲一区中文 | 亚洲精品www | 欧美极品在线 | 日本一二三区电影 | 国产精久久久久久久妇剪断 | 国产a区| www.久| 亚洲精品www久久久久久广东 | 中文字幕视频在线免费 | 国产免费国产 | 午夜免费视频 | 欧美v片 | 天天干 夜夜操 | 日韩欧美一区在线 | 免费黄色录像视频 | 黄色在线免费观看视频 | 九九成人| 免费在线观看成人av | av男人天堂影院 | 午夜色婷婷 | 99精品免费视频 | 久久国产日韩欧美 | 精品久久99 | 激情欧美一区二区三区 | 国产日韩精品视频 | 在线视频中文字幕 | 日韩综合色 | 偷拍自拍网 | 亚洲国产精品99久久久久久久久 | 91原创视频| 精品亚洲一区二区三区 | 精品福利在线 | 国产日韩欧美在线 | 久久伊人精品一区二区三区 | 毛片1 | 小视频你懂得 | 国产成人精品一区二 | 精品久久久一区 | 亚洲美女网站 |