1.為什麼需要預編譯?
1,防止SQL注入
2.預編譯生成的PreparedStatement對象執行時,不予要在進行編譯,節省性能.并且PreparedStatement對象可以多次複用.Mybatis預設情況下會對說有的SQL進行預編譯.
2.Mybatis是否支援延遲加載?如果支援,它的實作原理是什麼?
僅支援關聯對象和關聯集合對象的延遲加載.
實作原理是CGLIB動态代理實作的.比如a.getb().name().執invoke a.getb()時,值是null,這個Mybatis就會先将實作查詢好的b的值放進a.getb(b).于是a的對象b的屬性就有值了.hibernate的延遲加載也是類似.
3.mybatis模糊查詢like語句該怎麼寫?
使用函數concat('%'#(dang)'%'). SQL語句怎麼寫 select like dang% from test
4. 在mapper中如何傳遞多個參數?
1,可以使用@param注解
2,使用collection集合傳參
3,将資料封裝到pojo類中
4,普通順序傳參
5,Mybatis如何執行批量操作?
如添加批量添加多條資訊,you
insert into table emp(name,gender,email,did)values
<forech='collecion' item='emp' separator=" , ">
(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</forech>
6,如何擷取生成的主鍵?
在insectStatement中設定标簽<useGeneratedKeys=true,KeyProperty=ID>
7,當實體類中的屬性名和表中的字段名不一樣 ,怎麼辦?
1:在SQL中設定字段别名使字段名和屬性名一緻
2:在resourceMap中映射字段名和實體類名一緻.
3,使用注解FliesType
8,什麼是MyBatis的接口綁定?有哪些實作方式?
接口綁定就是把接口和SQL語句綁定,調用接口方法就可以執行對應綁定的SQL語句
有兩種實作方式:1 注解,在接口方法上使用注解@select,@Update等
2,使用XML檔案編寫SQL語句,要注意namespace要和接口的類路徑名相同,方法和SQL ID一緻,已經形參和paramtype,傳回值類型和resultType一緻
9. Mybatis是如何将sql執行結果封裝為目标對象并傳回的?都有哪些映射形式?
mybatis因為resultmap或者SQL别名和實體對象屬性名一一映射.通過反射常見對象,同時将反射的方式給對象屬性指派并傳回.
10. Mybatis映射檔案中,如果A标簽通過include引用了B标簽的内容,請問,B标簽能否定義在A标簽的後面,還是說必須定義在A标簽的前面?
<include>标簽可以在XML檔案中任何地方,因為Mybatis解析A時候,如果發現沒有解析B标簽,就會對A标簽标記為未解析狀态,等解析完所有标簽後,重新解析未解析狀态的SQL
11.Mybatis能執行一對多,一對一的聯系查詢嗎,有哪些實作方法?
實作方法1:子查詢
2:單獨查詢一個SQL,去查詢關聯對象,将查詢結果賦給主對象,然後傳回給主對象
3:想JOIN一樣,一遍查詢主對象,一邊查詢關聯對象
12,Mybatis是否可以映射Enum枚舉類?
可以,Mybatis甚至可以映射對象到資料庫中的一個字段中.映射方式為自定義一個typeHandler.實作typeHandler的setparameter()和getResult()方法,他們就是負責轉換Javatype()和jdbctype().
13,Mybatis動态sql是做什麼的?都有哪些動态sql?能簡述一下動态sql的執行原理嗎?
動态SQL可以讓我們在XML檔案中以标簽的形式,完成判斷,拼接SQL的功能
trim|where|set|foreach|if|choose|when|otherwise|bind。
其執行原理為,使用每一個從sql參數對象中計算表達式的值,根據表達式的值動态拼接sql,以此來完成動态sql的功能。
14,Mybatis是如何進行分頁的?分頁插件的原理是什麼?
兩種分頁 1,可以直接在SQL語句中書寫帶有分頁的語句,和分頁參數.分頁插件的原理是通過Mybatis的提供的插件接口,在插件的攔截方法内,攔截待執行的SQL語句,重新SQL.添加分頁的實體分頁參數和實體分頁語句. 比如MySQL select * from table limit 0 10
2,對結果集進行分頁.比如擷取結果,使用周遊形式對其進行分頁.