不同的xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。
有了namespace,自然id就可以重複,namespace不同,namespace+id自然也就不同。
hibernate屬於全自動orm對映工具,使用hibernate查詢關聯物件或者關聯集合物件時,可以根據物件關係模型直接獲取,所以它是全自動的。而mybatis在查詢關聯物件或關聯集合物件時,需要手動編寫sql來完成,所以,稱之為半自動orm對映工具。
select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#
select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#
注:這道題是京東面試題。
答:還有很多其他的標籤,、、、、,加上動態sql的9個標籤,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標籤,通過標籤引入sql片段,為不支援自增的主鍵生成策略標籤。
答:mybatis使用rowbounds物件進行分頁,它是針對resultset結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛程式來完成物理分頁。
分頁外掛程式的基本原理是使用mybatis提供的外掛程式介面,實現自定義外掛程式,在外掛程式的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。
舉例:select * from student,攔截sql後重寫為:select t.* from (select * from student)t limit 0,10
mybatis僅可以編寫針對parameterhandler、resultsethandler、statementhandler、executor這4種介面的外掛程式,mybatis使用jdk的動態**,為需要攔截的介面生成**物件以實現介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是invocationhandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。
實現mybatis的interceptor介面並複寫intercept()方法,然後在給外掛程式編寫註解,指定要攔截哪乙個介面的哪些方法即可,記住,別忘了在配置檔案中配置你編寫的外掛程式。
能,jdbc都能,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 |
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,支援延遲載入的原理都是一樣的。
不同的xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。
mybatis面試題 二
不同的xml對映檔案,如果配置了namespace,那麼id可以重複 如果沒有配置namespace,那麼id不能重複 畢竟namespace不是必須的,只是最佳實踐而已。有了namespace,自然id就可以重複,namespace不同,namespace id自然也就不同。為什麼說mybatis...
Mybatis面試整理
和 的區別 當實體類中的屬性名和表中的欄位名不一樣,如果將查詢的結果封裝到指定pojo 模糊查詢like語句該怎麼寫 通常乙個xml對映檔案,都會寫乙個dao介面與之對應,dao的工作原理,是否可以過載 mybatis是如何進行分頁的,分頁外掛程式實現的原理 xml對映檔案中,除了常見的select...
《黑客與畫家》摘抄 二
1 唯一有效的外部考核就是時間。經過歲月的洗禮,優美的東西生存,發展的機會更大,醜陋的東西往往會被淘汰。2 你把整個程式想清楚的時間點,應該是在編寫 的同時,而不是編寫 之前。3 大公司只要做的不太爛,就能贏。4 day job。5 程式寫出來是給人看的,附帶能在機器上執行。6 禍從口出,你一定要小...