2019即將過去,伴隨咱們即將迎來的又是新的一年,過完春節,立刻又要迎來新的金三銀四面試季。 那麼,做爲程序猿的你,是否真的有所準備的呢,亦或是安於本職工做,繼續作好手頭上的事情。java
固然,不論選擇如何,假如你真的準備在以後的金三銀四跳槽的話,那麼做爲一個Java工程師,就不可不看了。 如何在幾個月的時間裏,快速的爲即將到來的面試進行充分的準備呢?程序員
答:MyBatis是一個能夠自定義SQL、存儲過程和高級映射的持久層框架。面試
答:MyBatis的緩存分爲一級緩存和二級緩存,一級緩存放在session裏面,默認就有二級緩存放在它的命名空間裏,默認是不打開的,使用二級緩存屬性類須要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置spring
答:
一、Mybatis使用RowBounds對象進行分頁,也能夠直接編寫sql實現分頁,也可使用Mybatis的分頁插件。
二、分頁插件的原理:實現Mybatis提供的接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,而後重寫sql。
舉例:select * from student,攔截sql後重寫爲:select t.* from (select * from student)t limit 0,10sql
答:
一、Mybatis僅能夠編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis經過動態代理,爲須要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,固然,只會攔截那些你指定須要攔截的方法。
二、實現Mybatis的Interceptor接口並複寫intercept()方法,而後在給插件編寫註解,指定要攔截哪個接口的哪些方法便可,記住,別忘了在配置文件中配置你編寫的插件。數據庫
答:
一、Mybatis動態sql可讓咱們在Xml映射文件內,以標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。
二、Mybatis提供了9種動態sql標籤:trim|where|set|foreach|if|choose|when|otherwise|bind。
三、其執行原理爲,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。編程
答:
{}時,就是把${}替換成變量的值。
一、#{}是預編譯處理,緩存
四、使用#{}能夠有效的防止SQL注入,提升系統安全性。
答:Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,能夠根據對象關係模型直接獲取,因此它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,須要手動編寫sql來完成,因此,稱之爲半自動ORM映射工具。安全
答:
一、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()方法的調用。這就是延遲加載的基本原理。springboot
答:
一、Mybatis和hibernate不一樣,它不徹底是一個ORM框架,由於MyBatis須要程序員本身編寫Sql語句,不過mybatis能夠經過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。
二、Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,由於這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。可是靈活的前提是mybatis沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件則須要自定義多套sql映射文件,工做量大。
三、Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件(例如需求固定的定製化軟件)若是用hibernate開發能夠節省不少代碼,提升效率。可是Hibernate的缺點是學習門檻高,要精通門檻更高,並且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate須要具備很強的經驗和能力才行。
總之,按照用戶的需求在有限的資源環境下只要能作出維護性、擴展性良好的軟件架構都是好架構,因此框架只有適合纔是最好。
答:
一、MyBatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件中編寫,給程序的維護帶來了很大便利。
二、MyBatis封裝了底層JDBC API的調用細節,並能自動將結果集轉換成Java Bean對象,大大簡化了Java數據庫編程的重複工做。
三、由於MyBatis須要程序員本身去編寫sql語句,程序員能夠結合數據庫自身的特色靈活控制sql語句,所以可以實現比Hibernate等全自動orm框架更高的查詢效率,可以完成複雜查詢。
答:接口映射就是在MyBatis中任意定義接口,而後把接口裏面的方法和SQL語句綁定,咱們直接調用接口方法就能夠,這樣比起原來了SqlSession提供的方法咱們能夠有更加靈活的選擇和設置。
答:接口綁定有兩種實現方式,一種是經過註解綁定,就是在接口的方法上面加上@Select@Update等註解裏面包含Sql語句來綁定,另一種就是經過xml裏面寫SQL來綁定,在這種狀況下,要指定xml映射文件裏面的namespace必須爲接口的全路徑名。
答:當Sql語句比較簡單時候,用註解綁定;當SQL語句比較複雜時候,用xml綁定,通常用xml綁定的比較多。
答:有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,經過在resultMap裏面配置association節點配置一對一的類就能夠完成。嵌套查詢是先查一個表,根據這個表裏面的結果的外鍵id,去再另一個表裏面查詢數據,也是經過association配置,但另一個表的查詢經過select屬性配置。
答:能,Mybatis不只能夠執行一對1、一對多的關聯查詢,還能夠執行多對一,多對多的關聯查詢,多對一查詢,其實就是一對一查詢,只須要把selectOne()修改成selectList()便可;多對多查詢,其實就是一對多查詢,只須要把selectOne()修改成selectList()便可。
關聯對象查詢,有兩種實現方式,一種是單獨發送一個sql去查詢關聯對象,賦給主對象,而後返回主對象。另外一種是使用嵌套查詢,嵌套查詢的含義爲使用join查詢,一部分列是A對象的屬性值,另一部分列是關聯對象B的屬性值,好處是隻發一個sql查詢,就能夠把主對象和其關聯對象查出來。
答:MyBatis裏面的動態Sql通常是經過if節點來實現,經過OGNL語法來實現,可是若是要寫的完整,必須配合where,trim節點,where節點是判斷包含節點有內容就插入where,不然不插入,trim節點是用來判斷若是動態語句是以and 或or開始,那麼會自動把這個and或者or取掉。
答:
第一種是使用標籤,逐必定義列名和對象屬性名之間的映射關係。
第二種是使用sql列的別名功能,將列別名書寫爲對象屬性名,好比T_NAME AS NAME,對象屬性名通常是name,小寫,可是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至能夠寫成T_NAME AS NaMe,Mybatis同樣能夠正常工做。
有了列名與屬性名的映射關係後,Mybatis經過反射建立對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關係的屬性,是沒法完成賦值的。
答:還有不少其餘的標籤,、、、、,加上動態sql的9個標籤,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中爲sql片斷標籤,經過標籤引入sql片斷,爲不支持自增的主鍵生成策略標籤。
答:
一、經過在查詢的sql語句中定義字段名的別名。
二、經過來映射字段名和實體類屬性名的一一對應的關係。
答:
一、在java中拼接通配符,經過#{}賦值
二、在Sql語句中拼接通配符 (不安全 會引發Sql注入)
答:不能重載,由於經過Dao尋找Xml對應的sql的時候全限名+方法名的保存和尋找策略。接口工做原理爲jdk動態代理原理,運行時會爲dao生成proxy,代理對象會攔截接口方法,去執行對應的sql返回數據。
答:雖然Mybatis解析Xml映射文件是按照順序解析的,可是,被引用的B標籤依然能夠定義在任何地方,Mybatis均可以正確識別。原理是,Mybatis解析A標籤,發現A標籤引用了B標籤,可是B標籤還沒有解析到,尚不存在,此時,Mybatis會將A標籤標記爲未解析狀態,而後繼續解析餘下的標籤,包含B標籤,待全部標籤解析完畢,Mybatis會從新解析那些被標記爲未解析的標籤,此時再解析A標籤時,B標籤已經存在,A標籤也就能夠正常解析完成了。
答:不一樣的Xml映射文件,若是配置了namespace,那麼id能夠重複;若是沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。緣由就是namespace+id是做爲Map的key使用的,若是沒有namespace,就剩下id,那麼,id重複會致使數據互相覆蓋。有了namespace,天然id就能夠重複,namespace不一樣,namespace+id天然也就不一樣。
答:使用BatchExecutor完成批處理。
答:Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。1)SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完馬上關閉Statement對象。2)ReuseExecutor:執行update或select,以sql做爲key查找Statement對象,存在就使用,不存在就建立,用完後,不關閉Statement對象,而是放置於Map3)BatchExecutor:完成批處理。
答:在Mybatis配置文件中,能夠指定默認的ExecutorType執行器類型,也能夠手動給DefaultSqlSessionFactory的建立SqlSession的方法傳遞ExecutorType類型參數。
答:能,JDBC都能,Mybatis固然也能。
答:Mybatis能夠映射枚舉類,不單能夠映射枚舉類,Mybatis能夠映射任何對象到表的一列上。映射方式爲自定義一個TypeHandler,實現TypeHandler的setParameter()和getResult()接口方法。TypeHandler有兩個做用,一是完成從javaType至jdbcType的轉換,二是完成jdbcType至javaType的轉換,體現爲setParameter()和getResult()兩個方法,分別表明設置sql問號佔位符參數和獲取列查詢結果。
答:配置文件設置usegeneratedkeys 爲true
答:
一、直接在方法中傳遞參數,xml文件用#{0} #{1}來獲取
二、使用 @param 註解:這樣能夠直接在xml文件中經過#{name}來獲取
答:
一、類的名字和數據庫相同時,能夠直接設置resultType參數爲Pojo類
二、若不一樣,須要設置resultMap 將結果名字和Pojo名字進行轉換
答:
一、Mapper接口方法名和mapper.xml中定義的每一個sql的id相同
二、Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql 的parameterType的類型相同
三、Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型相同
四、Mapper.xml文件中的namespace便是mapper接口的類路徑。
答:
一、有接口綁定,包括註解綁定sql和xml綁定Sql
二、動態sql由原來的節點配置變成OGNL表達式3) 在一對一,一對多的時候引進了association,在一對多的時候引入了collection節點,不過都是在resultMap裏面配置
答:IBatis裏面的核心處理類交SqlMapClient,MyBatis裏面的核心處理類叫作SqlSession。
答:
一、在sql裏面變量命名有原來的#變量# 變成了#{變量}
二、原來的變量變成了${變量}
三、原來在sql節點裏面的class都換名字交type
四、原來的queryForObject queryForList 變成了selectOne selectList5)原來的別名設置在映射文件裏面放在了核心配置文件裏。
關注公衆號程序猿學社,回覆關鍵字"面試",獲取zk,dubbo,springboot,springcloud,mybatils,apollo等技術的面試題。
公衆號:程序猿學社
每週實時更新