MyBatis常見面試題有哪些-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關MyBatis常見面試題有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)是一家專注于成都網站制作、成都網站建設與策劃設計,蓬溪網站建設哪家好?創(chuàng)新互聯(lián)做網站,專注于網站建設十多年,網設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:蓬溪等地區(qū)。蓬溪做網站價格咨詢:13518219792

  1、什么是Mybatis?

  Mybatis是一個半ORM(對象關系映射)框架,它內部封裝了JDBC,開發(fā)時只需要關注SQL語句本身,不需要花費精力去處理加載驅動、創(chuàng)建連接、創(chuàng)建statement等繁雜的過程。程序員直接編寫原生態(tài)sql,可以嚴格控制sql執(zhí)行性能,靈活度高。

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

  通過xml 文件或注解的方式將要執(zhí)行的各種 statement 配置起來,并通過java對象和 statement中sql的動態(tài)參數(shù)進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結果映射為java對象并返回。(從執(zhí)行sql到返回result的過程)。

  2、#{}和${}的區(qū)別是什么?

  正確的答案是:#{}是預編譯處理,${}是字符串替換。

  (1)mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值。

  (2)mybatis在處理${}時,就是把${}替換成變量的值。

  (3)使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。原因在于:預編譯機制。預編譯完成之后,SQL的結構已經固定,即便用戶輸入非法參數(shù),也不會對SQL的結構產生影響,從而避免了潛在的安全風險。

  (4)預編譯是提前對SQL語句進行預編譯,而其后注入的參數(shù)將不會再進行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因為惡意注入了某些特殊字符,最后被編譯成了惡意的執(zhí)行操作。而預編譯機制則可以很好的防止SQL注入。

  最后,補充一點:

  $符號一般用來當作占位符,常使用Linux腳本的人應該對此有更深的體會吧。例如:$1,$2等等表示輸入?yún)?shù)的占位符。知道了這點就能很容易區(qū)分$和#,從而不容易記錯了。

  3、Mybatis是如何進行分頁的?分頁插件的原理是什么?

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

  分頁插件的基本原理是使用Mybatis提供的插件接口,實現(xiàn)自定義插件,在插件的攔截方法內攔截待執(zhí)行的sql,然后重寫sql,根據(jù)dialect方言,添加對應的物理分頁語句和物理分頁參數(shù)。

  4、MyBatis與Hibernate有哪些不同?

  Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句。

  Mybatis直接編寫原生態(tài)sql,可以嚴格控制sql執(zhí)行性能,靈活度高,非常適合對關系數(shù)據(jù)模型要求不高的軟件開發(fā),因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數(shù)據(jù)庫無關性,如果需要實現(xiàn)支持多種數(shù)據(jù)庫的軟件,則需要自定義多套sql映射文件,工作量大。

  Hibernate對象/關系映射能力強,數(shù)據(jù)庫無關性好,對于關系模型要求高的軟件,如果用hibernate開發(fā)可以節(jié)省很多代碼,提高效率。

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

  不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;

  原因就是namespace+id是作為Map的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致數(shù)據(jù)互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。

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

  第一種是使用標簽,逐一定義列名和對象屬性名之間的映射關系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區(qū)分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。

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

  7、Xml映射文件中,除了常見的|||標簽之外,還有哪些標簽?

  注:這道題出自京東面試官。

  還有很多其他的標簽,加上動態(tài)sql的9個標簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標簽,通過標簽引入sql片段,為不支持自增的主鍵生成策略標簽。

  8、簡述Mybatis的插件運行原理,以及如何編寫一個插件

  Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動態(tài)代理,為需要攔截的接口生成代理對象以實現(xiàn)接口方法攔截功能,每當執(zhí)行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。

  實現(xiàn)Mybatis的Interceptor接口并復寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,還需要在配置文件中配置你編寫的插件。

  9、一級、二級緩存

  1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空。

  2)二級緩存與一級緩存其機制相同,默認也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。要開啟二級緩存,你需要在你的 SQL 映射文件中添加一行:

  3)對于緩存數(shù)據(jù)更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作后,默認該作用域下所有 中的緩存將被 clear。

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

  Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關聯(lián)對象或者關聯(lián)集合對象時,可以根據(jù)對象關系模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯(lián)對象或關聯(lián)集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。

  11、Mybatis是否支持延遲加載?如果支持,它的實現(xiàn)原理是什么?

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

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

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

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

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

  13、簡述Mybatis的Xml映射文件和Mybatis內部數(shù)據(jù)結構之間的映射關系?

  Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內部。在Xml映射文件中,標簽會被解析為ParameterMap對象,其每個子元素會被解析為ParameterMapping對象。標簽會被解析為ResultMap對象,其每個子元素會被解析為ResultMapping對象。

  每一個<>、<>、<>、<>標簽均會被解析為MappedStatement對象,標簽內的sql會被解析為BoundSql對象。

  14、Xml映射文件中,除了常見的||updae|標簽之外,還有哪些標簽?

  答:、、、、,加上動態(tài)sql的9個標簽,其中為sql片段標簽,通過標簽引入sql片段,為不支持自增的主鍵生成策略標簽。

  15、Mybaits有哪些優(yōu)點?

  (1)基于SQL語句編程,相當靈活,不會對應用程序或者數(shù)據(jù)庫的現(xiàn)有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統(tǒng)一管理;提供XML標簽,支持編寫動態(tài)SQL語句,并可重用。

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

  (3)很好的與各種數(shù)據(jù)庫兼容(因為MyBatis使用JDBC來連接數(shù)據(jù)庫,所以只要JDBC支持的數(shù)據(jù)庫MyBatis都支持)。

  (4)能夠與Spring很好的集成;

  (5)提供映射標簽,支持對象與數(shù)據(jù)庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。

感謝各位的閱讀!關于“MyBatis常見面試題有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

本文題目:MyBatis常見面試題有哪些-創(chuàng)新互聯(lián)
網址分享:http://muchs.cn/article12/dhgjdc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供自適應網站建站公司企業(yè)建站、商城網站、手機網站建設、靜態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站