mybatis常見面試/筆試題
1、#{}和${}的區別是什麼?
${}
是Properties檔案中的變數佔位符;它可以用於標籤屬性值和sql內部,屬於靜態文字替換;
比如${driver}會被靜態替換為com.MySQL.jdbc.Driver。#{}
是sql的引數佔位符; Mybatis會將sql中的#{}替換為?號;在sql執行前會使用PreparedStatement的引數設定方法,按序給sql的?號佔位符設定引數值。
比如ps.setInt(0, parameterValue);#{item.name}的取值方式為使用反射從引數物件中獲取item物件的name屬性值,相當於param.getItem().getName()。
2、Xml對映檔案中,除了常見的select|insert|update|delete標籤之外,還有哪些標籤?
注:這道題出自京東面試官。
還有很多其他的標籤,、、、、,加上動態sql的9個標籤,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標籤,通過標籤引入sql片段,為不支援自增的主鍵生成策略標籤。
3、最佳實踐中,通常一個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執行結果返回。
4、Mybatis是如何進行分頁的?分頁外掛的原理是什麼?
Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。
分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。
舉例:select * from student,攔截sql後重寫為:select t.* from (select * from student)t limit 0,10。
5、簡述Mybatis的外掛執行原理,以及如何編寫一個外掛。
Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種介面的外掛,Mybatis使用JDK的動態代理,為需要攔截的介面生成代理物件以實現介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。實現Mybatis的Interceptor介面並複寫intercept()方法,然後在給外掛編寫註解,指定要攔截哪一個介面的哪些方法即可,記住,還需要在配置檔案中配置你編寫的外掛。
6、Mybatis執行批量插入,能返回資料庫主鍵列表嗎?
答:能,JDBC都能,Mybatis當然也能。
7、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的功能。
8、Mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?
第一種是使用標籤,逐一定義列名和物件屬性名之間的對映關係。 第二種是使用sql列的別名功能,將列別名書寫為物件屬性名。
比如:T_NAME AS NAME,物件屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智慧找到與之對應物件屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的對映關係後,Mybatis通過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。
9、Mybatis能執行一對一、一對多的級聯查詢嗎?都有哪些實現方式,以及它們之間的區別。
能,Mybatis不僅可以執行一對一、一對多的級聯查詢,還可以執行多對一,多對多的級聯查詢。
多對一查詢,其實就是一對一查詢,只需要把selectOne()修改為selectList()即可;
多對多查詢,其實就是一對多查詢,只需要把selectOne()修改為selectList()即可。
級聯物件查詢,有兩種實現方式:一種是單獨傳送一個sql去查詢級聯物件,賦給主物件,然後返回主物件。
另一種是使用巢狀查詢,巢狀查詢的含義為使用join查詢,一部分列是A物件的屬性值,另外一部分列是關聯物件B的屬性值,好處是隻發一個sql查詢,就可以把主物件及其關聯物件查出來。
> 那麼問題來了,join查詢出來100條記錄,如何確定主物件是5個,而不是100個?其去重複的原理
是標籤內的子標籤,指定了唯一確定一條記錄的id列,Mybatis根據列值來完成100條記錄的去重複功能,可以有多個,代表了聯合主鍵的語意。
同樣主物件的關聯物件,也是根據這個原理去重複的,儘管一般情況下,只有主物件會有重複記錄,關聯物件一般不會重複。
舉例:下面join查詢出來6條記錄,一、二列是Teacher物件列,第三列為Student物件列,Mybatis去重複處理後,結果為1個老師6個學生,而不是6個老師6個學生。
t_id t_name s_id
| 1 | teacher | 38 |
| 1 | teacher | 39 |
| 1 | teacher | 40 |
| 1 | teacher | 41 |
| 1 | teacher | 42 |
| 1 | teacher | 43 |
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
10、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,幾乎所有的包括hibernate,支援延遲載入的原理都是一樣的。
11、Mybatis的Xml對映檔案中,不同的Xml對映檔案,id是否可以重複?
不同的Xml對映檔案,如果配置了namespace,那麼id可以重複;
如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。
原因就是namespace+id是作為Map
相關文章
- mybatis常見面試題MyBatis面試題
- 技術崗-常見筆試面試題筆試面試題
- 面試寶典:15道MyBatis 常見面試題彙總及答案MyBatis面試題
- 【Java面試】JSP常見面試題!JavaJS面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- 【面試】面試常見問題整理面試
- 效能測試常見面試題面試題
- String常見面試題面試題
- Docker常見面試題Docker面試題
- vue 常見面試題Vue面試題
- Mysql 常見面試題MySql面試題
- Redis 常見面試題Redis面試題
- Golang常見面試題Golang面試題
- Spring常見面試題!Spring面試題
- Hadoop常見面試題Hadoop面試題
- Dubbo常見面試題面試題
- 前端常見面試題前端面試題
- ajax常見面試題面試題
- Redis常見面試題Redis面試題
- 常見 React 面試題React面試題
- spring常見面試題Spring面試題
- SpringMVC常見面試題SpringMVC面試題
- 【Java面試】Java常見IO面試題!Java面試題
- Mysql中的筆試和麵試---常見面試題問與答MySql筆試面試題
- 求職面試常見問題:Python常見面試題全解析附答案求職Python面試題
- 集合常見的面試題面試題
- 常見的JVM 面試題JVM面試題
- MQ / ES 常見面試題MQ面試題
- HashMap常見面試題整理HashMap面試題
- 【硬核】Dubbo常見面試題面試題
- 常見面試SQL問題面試SQL
- Java常見的面試題Java面試題
- Spring 常見面試問題Spring面試
- Python面試常見問題Python面試
- 整理kafka常見面試題Kafka面試題
- Vue常見的面試題Vue面試題
- 常見面試題 - URL 解析面試題
- SSM框架常見面試題SSM框架面試題