Java經(jīng)典面試題整理及答案詳解
學習Java建議還是多動手練習,很多時候你會發(fā)現(xiàn)想的和寫出來運行的不是一回事兒,本節(jié)內容大家可以根據(jù)題目自己練習看看~
1.使用MyBatis做模糊查詢的時候,在日志中看到執(zhí)行了sql語句,但是查詢不到結果。
面對這樣的問題,如果可以看到后臺的日志出現(xiàn)有相關的信息顯示,那么就表示現(xiàn)在的整體環(huán)境搭建是沒有任何問題的,但是為什么數(shù)據(jù)沒有呢?
個人經(jīng)驗總結有如下幾點:
(1) 你的數(shù)據(jù)庫里沒有符合條件的數(shù)據(jù),觀察你的事務問題,更換一個新的客戶端連接;
(2) 你在使用模糊查詢的時候,所傳遞的參數(shù)可能就有問題,這個時候最好的解決方案,就是觀察數(shù)據(jù)層里面?zhèn)魅氲膬热菔欠裾_;
(3) 在使用模糊查詢的時候千萬要記住在關鍵字的左右增加一個“%”,如果沒有加,那么就不叫模糊查詢了;
(4) 你現(xiàn)在所連接的數(shù)據(jù)庫并不是你真正的數(shù)據(jù)庫。
2.在MyBatis的sql語句中使用if判斷傳遞過來的某參數(shù)是不是null是有效的,但是卻不能判斷空字符串。
動態(tài)SQL是依靠配置實現(xiàn)的,它只能夠判斷null。你可以在業(yè)務層的處理上追加一些判斷功能,例如:如果發(fā)現(xiàn)有內容為空字符串( ’’’’),那么你就為其設置null。
動態(tài)SQL很有幫助。
3.MyBatis和Hibernate中的set方法
MyBatis開發(fā)里面主要的核心是要求用戶自己來定義使用的SQL語句。而Hibernate特點由于其要考慮其可移植性的問題,所以在Hibernate處理之中,它所需要考慮的就是一個自動生成SQL問題。
現(xiàn)在所有問題都放在了POJO類(VO)、Hibernate下,如果該POJO類的對象處于持久態(tài)狀態(tài),那么每一次調用setter方法都會更新數(shù)據(jù)(如果你的事務是手工控制,則在若干個setter調用后才會發(fā)出更新操作),而MyBatis沒有這樣的功能,因為Hibernate之中搞的這種對象的狀態(tài)設計有些糟糕,而且這也是Hibernate本身性能低的原因。追究其起源,主要是因為傳統(tǒng)的EJB(EntityBean)影響。
4.Resource與Autowired區(qū)別
在使用Spring的自動的Annotation注解的時候經(jīng)常會見到兩類的注解:@Resource(個人常用)、@Autowired ,如果你想要了解這兩個的區(qū)別,最好的做法是先認真學完了spring依賴注入的時候講解過的自動配置操作,在spring里面自動配置的模式有兩類:按照類型、按照名稱。
@Autowired:則表示按照類型進行自動注入,缺點是如果類型相同,則無法注入;
@Resource:具備按照類型自動注入的特點,而后如果現(xiàn)在類型相同,則可以設置一個名稱,也就是說你使用@Component、@Service等注解設置自動掃描的時候可以設置一個名字,而這個名字就可在@Resource中使用了;
SpringBoot里面,因為其自動支持一些環(huán)境配置,如果使用的是Autowired,那么配置多個相同類型的Bean的話,將無法進行準確的注入操作。必須使用@Resource完成。
5.Hibernate控制反轉
現(xiàn)在所說的是Hibernate中針對關系的配置處理,控制反轉就是把控制權交給了對方,這種情況一般出現(xiàn)在數(shù)據(jù)的級聯(lián)關系配置上:一對多、多對多。
以一個程序的分析為例:一個人有多本書,在Hibernate的世界里充滿了神奇,它可以自動將沒有的數(shù)據(jù)進行增加處理。正常的流程,首先要有一個人,這個人會有一個編號,在進行書的信息添加的時候就需要把這個人的編號一起保存進去。
如果不配置控制反轉,它的處理:
——增加人的信息;
——增加所有書的信息,但此時人的保存的關聯(lián)字段內容是null;
——再更新所有書的信息,將人的關系的內容保存進來。
正常的流程(控制反轉,將子表與父表關聯(lián)字段的使用控制權交給子表自己控制)是:
——保存人的信息,同時取得人的編號,將這些編號設置到書的內容里面;
——保存書的信息