180919面試總結(1)
1.內連線 外連線區別
內連線,也被稱為自然連線,只有兩個表相匹配的行才能在結果集中出現。返回的結果集選取了兩個表中所有相匹配的資料,捨棄了不匹配的資料。由於內連線是從結果表中刪除與其他連線表中沒有匹配的所有行,所以內連線可能會造成資訊的丟失。
內連線語法如下:
select fieldlist from table1 [inner] join table2 on table1.column = table2.column
等價於
select table1.fieldlist from table1,table2 where table1.column = table2.column
1、內連線(自然連線):
INNER JOIN[JOIN]
只有兩個表相匹配的行才能在結果集中出現
2、外連線:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。
2.描述一下springMVC的工作流程
springmvc是spring框架的一個模組,springmvc和spring無需通過中間整合層進行整合。
springmvc是一個基於mvc的web框架。
SpringMVC的工作流程:
第一步:發起請求到前端控制器(DispatcherServlet)
第二步:前端控制器請求HandlerMapping查詢 Handler
可以根據xml配置、註解進行查詢
第三步:處理器對映器HandlerMapping向前端控制器返回Handler
第四步:前端控制器呼叫處理器介面卡去執行Handler
第五步:處理器介面卡去執行Handler
第六步:Handler執行完成給介面卡返回ModelAndView
第七步:處理器介面卡向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一個底層物件,包括 Model和view
第八步:前端控制器請求檢視解析器去進行檢視解析
根據邏輯檢視名解析成真正的檢視(jsp)
第九步:檢視解析器向前端控制器返回View
第十步:前端控制器進行檢視渲染
檢視渲染將模型資料(在ModelAndView物件中)填充到request域
第十一步:前端控制器向用戶響應結果
元件:
1、前端控制器DispatcherServlet(不需要程式設計師開發)
作用接收請求,響應結果,相當於轉發器,中央處理器。
有了DispatcherServlet減少了其它元件之間的耦合度。
2、處理器對映器HandlerMapping(不需要程式設計師開發)
作用:根據請求的url查詢Handler
3、處理器介面卡HandlerAdapter
作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
4、處理器Handler(需要程式設計師開發)
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣介面卡才可以去正確執行Handler
5、檢視解析器View resolver(不需要程式設計師開發)
作用:進行檢視解析,根據邏輯檢視名解析成真正的檢視(view)
6、檢視View(需要程式設計師開發jsp)
View是一個介面,實現類支援不同的View型別(jsp、freemarker、pdf...)
3.一級快取和二級快取的區別
Mybatis一級快取的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。當一個sqlSession結束後該sqlSession中的一級快取也就不存在了。Mybatis預設開啟一級快取。
Mybatis二級快取是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞引數也相同即最終執行相同的sql語句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。Mybatis預設沒有開啟二級快取需要在setting全域性引數中配置開啟二級快取。
開啟二級快取步驟:
1.在核心配置檔案SqlMapConfig.xml中加入
<setting name="cacheEnabled" value="true"/>
|
描述 |
允許值 |
預設值 |
cacheEnabled |
對在此配置檔案下的所有cache 進行全域性性開/關設定。 |
true false |
true |
2.在對應的Mapper.xml中開啟二級快取,即:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!-- 開啟本mapper的namespace下的二快取
type:指定cache介面的實現類的型別,mybatis預設使用PerpetualCache
要和ehcache整合,需要配置type為ehcache實現cache介面的型別
-->
<cache />
<!-- 下面的一些SQL語句暫時略 -->
</mapper>
3.二級快取需要查詢結果對映的pojo物件實現java.io.Serializable介面,即:
二級快取需要查詢結果對映的pojo物件實現java.io.Serializable介面實現序列化和反序列化操作,注意如果存在父類、成員pojo都需要實現序列化介面。
public class Orders implements Serializable
public class User implements Serializable
....
4.Java JDK1.5 之後 switch語句 支援的型別
Java支援的資料型別有五種
他們分別是:
byte、char、short、int、enum;
以上是JDK1.6以前的版本。
JDK1.7時,又增加了String
public class Test {
public static void main(String[] args) {
switch ("111") {
case "111":
System.out.println("111111111111111");
break;
default:
break;
}
}
}
5.Java中斷執行緒的三種方式
1、interrupt()
2、isInterrupted()
3、interrupted()
參考文章:https://www.jb51.net/article/128207.htm
6.set是否可放入重複資料?不能的話是如何實現不放入重複資料的?
1.Set是一種不包含重複元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。
放入Set集合中的物件必須重寫equals()(實際內容)和hashCode()(記憶體地址)方法。
2.應該說set不允許鍵(key)重複,但是允許(值)value重複
Set 的add方法:
比較的是物件的hashCode方法返回的值重寫hashCode方法就必須重寫equals方法(java中自定義物件的比較原理)
物件的比較:
add方法的引數是個物件。集合會呼叫這個物件的equals、hashCode方法和已經存在的物件比較
hashCode先比較,如果一樣再呼叫equals
//set.add新新增物件的內部原理
MyClass c2=new MyClass(2);
for(Object myclass:set){
if(myclass.hashCode()==c2.hashCode()){
if(myclass.equals(c2)){
return;
}
else{
//equals不一樣也新增成功
}
}
else{
//hashCode不一樣直接新增成功
}
}
//HashSet 使用add方法過濾重複,使用hashCode、equals方法