国产精品色哟哟_男男激情3p互攻_色偷偷影院_和女同学厕所做了四次

當前位置: 首頁 / 技術干貨 / 正文
好程序員Java培訓分享Mybatis面試題集合

2020-10-12

Java培訓

  今天好程序員Java培訓老師給大家分享一篇關于Mybatis面試題的詳細介紹,下面我們一起來看一下吧。

好程序員

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

  #{}是預編譯處理,${}是字符串替換。

  Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;

  Mybatis在處理${}時,就是把${}替換成變量的值。

  使用#{}可以有效的防止SQL注入,提高系統安全性。

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

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

  Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串作為key值,可唯一定位一個MappedStatement,舉例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace為com.mybatis3.mappers.StudentDao下面id=findStudentById的MappedStatement。在Mybatis中,每一個、、、標簽,都會被解析為一個MappedStatement對象。  Dao接口里的方法,是不能重載的,因為是全限名+方法名的保存和尋找策略。  Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所代表的sql,然后將sql執行結果返回。  3.Mybatis是如何進行分頁的?分頁插件的原理是什么?   Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。  分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。  4.Mybatis是如何將sql執行結果封裝為目標對象并返回的?都有哪些映射形式?   diyi種是使用標簽,逐一定義列名和對象屬性名之間的映射關系。  第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAMEASNAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAMEASNaMe,Mybatis一樣可以正常工作。  有了列名與屬性名的映射關系后,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值并返回,那些找不到映射關系的屬性,是無法完成賦值的。  5.Xml映射文件中,除了常見的select|insert|update|delete標簽之外,還有哪些標簽?   還有很多其他的標簽,加上動態sql的9個標簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標簽,通過標簽引入sql片段,為不支持自增的主鍵生成策略標簽。  6.簡述Mybatis的插件運行原理,以及如何編寫一個插件?   Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。實現Mybatis的Interceptor接口并復寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,還需要在配置文件中配置你編寫的插件。  7.一級、二級緩存  1)一級緩存:基于PerpetualCache的HashMap本地緩存,其存儲作用域為Session,當Sessionflush或close之后,該Session中的所有Cache就將清空。  2)二級緩存與一級緩存其機制相同,默認也是采用PerpetualCache,HashMap存儲,不同在于其存儲作用域為Mapper(Namespace),并且可自定義存儲源,如Ehcache。要開啟二級緩存,你需要在你的SQL映射文件中添加一行:   3)對于緩存數據更新機制,當某一個作用域(一級緩存Session/二級緩存Namespaces)的進行了C/U/D操作后,默認該作用域下所有select中的緩存將被clear。  8.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()方法的調用。這就是延遲加載的基本原理。  9.Mybatis映射文件中,如果A標簽通過include引用了B標簽的內容,請問,B標簽能否定義在A標簽的后面,還是說必須定義在A標簽的前面?   雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標簽依然可以定義在任何地方,Mybatis都可以正確識別。  原理是,Mybatis解析A標簽,發現A標簽引用了B標簽,但是B標簽尚未解析到,尚不存在,此時,Mybatis會將A標簽標記為未解析狀態,然后繼續解析余下的標簽,包含B標簽,待所有標簽解析完畢,Mybatis會重新解析那些被標記為未解析的標簽,此時再解析A標簽時,B標簽已經存在,A標簽也就可以正常解析完成了。  10.簡述Mybatis的Xml映射文件和Mybatis內部數據結構之間的映射關系?   Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內部。在Xml映射文件中,標簽會被解析為ParameterMap對象,其每個子元素會被解析為ParameterMapping對象。標簽會被解析為ResultMap對象,其每個子元素會被解析為ResultMapping對象。每一個、、、標簽均會被解析為MappedStatement對象,標簽內的sql會被解析為BoundSql對象。

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

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

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

  12、Mybatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?

  Mybatis動態sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能,Mybatis提供了9種動態sql標簽trim|where|set|foreach|if|choose|when|otherwise|bind。

  其執行原理為,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。

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

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

  原因就是namespace+id是作為Map

  14、MyBatis(IBatis)的好處是什么

  ibatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件中編寫,給程序的維護帶來了很大便利。ibatis封裝了底層JDBCAPI的調用細節,并能自動將結果集轉換成JavaBean對象,大大簡化了Java數據庫編程的重復工作。因為Ibatis需要程序員自己去編寫sql語句,程序員可以結合數據庫自身的特點靈活控制sql語句,因此能夠實現比hibernate等全自動orm框架更高的查詢效率,能夠完成復雜查詢.

  15、什么情況下用注解綁定,什么情況下用xml綁定?

  當Sql語句比較簡單時候,用注解綁定,

  當SQL語句比較復雜時候,用xml綁定,一般用xml綁定的比較多

  16、MyBatis實現一對多有幾種方式,怎么操作的?

  有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap里面配置collection節點配置一對多的類就可以完成;

  嵌套查詢是先查一個表,根據這個表里面的結果的外鍵id,去再另外一個表里面查詢數據,也是通過配置collection,但另外一個表的查詢通過select節點配置。

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號