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