面試資料

防止sql
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度;對單引號和
雙"-"進行轉換等。前端

2.永遠不要使用動態拼裝sql,可使用參數化的sql或者直接使用存儲過程進行數據查詢存取。java

3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。ajax

4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。正則表達式

5.應用的異常信息應該給出儘量少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝spring

6.sql注入的檢測方法通常採起輔助軟件或網站平臺來檢測,軟件通常採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS能夠有效的防護SQL注入,XSS攻擊等。sql

 

sql注入的幾種類型:
1.錯誤消息處理
2.加密處理
3.存儲過程來執行全部的查詢
4.使用專業的漏洞掃描工具
5.URL地址參數請求到數據庫中去的,www.sample.com?testid=23數據庫


struts1和struts2的不一樣
1.struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filterDispatcher
2.struts1的action須要繼承Action類,struts2的action能夠不繼承任何類,struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2的Action不用考慮線程安全問題。
3.在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。
4.與Struts1不一樣,Struts2對用戶的每一次請求都會建立一個Action,因此Struts2中的Action是線程安全的。
5.struts1配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖能夠接受參數。緩存


spring AOP的做用
1.登陸註冊
2.日誌記錄
3.權限管理
4.聲明式事物
5.緩存
6.錯誤處理
7.性能優化
8.持久化
9.資源池
10.異常處理安全


做爲中文更好理解的一個翻譯應該是依賴注入,把依賴的類採用接口的方式,利用Set函數,傳入Bean的內部,實現與外界的解耦合性能優化

利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。


調用接口的方式

 

方法重載和重寫的區別

1.重寫必須繼承,重載不用。
2.重寫的方法名,參數數目相同,參數類型兼容,重載的方法名相同,參數列表不一樣。
3.重寫的方法修飾符大於等於父類的方法,重載和修飾符無關。
4.重寫不能夠拋出父類沒有拋出的通常異常,能夠拋出運行時異常

攔截器與過濾器的區別 :
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求起做用。
4. 攔截器能夠訪問action上下文、值棧裏的對象,而過濾器不能訪問。
5. 在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次

數據庫設計三大範式
1.第一範式(確保每列保持原子性)
2.第二範式(確保表中的每列都和主鍵相關)
3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

 

REQUITES_NEW:使用本身的事物,調用的事物方法被掛起
@Transactional(propagation=Propagation.REQUITES_NEW)
二級緩存


Mybatis和ibatis的區別:
一、Mybatis實現了接口綁定,使用更加方便。
二、對象關係映射的改進,效率更高
三、MyBatis採用功能強大的基於OGNL的表達式來消除其餘元素。
4.調用存儲過程也不一樣。在 MyBatis 中,<proccedure> 元素已經被移除,經過 <select>、<insert> 和 <update> 進行定義:
5.在 iBatis 中指定映射文件的方式<sqlMap resource=... />
在 MyBatis 中指定映射文件的方式:
<mappers>
<mapper resource=... />
<mapper resource=... />
</mappers>
6.配置事務管理器和數據源的方式也不一樣
7. iBatis 中設置屬性的方式 <settings props1="value1" props2="value2"… />
在 MyBatis 中設置屬性的方式 <settings>
<setting name="props1" value="value1"/>
<settings>

8.mybatis的environment是爲了多個環境之間的切換
9.調用存儲過程方式不一樣
10.select元素中的parameterClass改成parameterType,resultClass改成了resultType
11.嵌套參數由 #value# 改成了 #{value}。
12.<parameter> 等元素的 jdbcType 屬性取值中,原來的 "ORACLECURSOR" 取值改成了如今的 "CURSOR","NUMBER" 取值改成了 "NUMERIC"。

 


ibatis中的#和$有何區別:
1.#是把傳入的數據看成字符串,如#field#傳入的是id,則sql語句生成是這樣,order by "id",這固然會報錯.
2.$傳入的數據直接生成在sql裏,如#field#傳入的是id,則sql語句生成是這樣,order by id, 這就對了.
3.#方式可以很大程度防止sql注入.
4.$方式沒法防止sql注入.
5.$方式通常用於傳入數據庫對象.例如傳入表名.
6.通常能用#的就別用$.
7.$ 的做用其實是字符串拼接


二級緩存的範圍是當前那個文件


索引失效的緣由:
1.字符型字段爲數字時在where條件裏不添加引號.
2. 索引自己失效
3.沒有查詢條件,或者查詢條件沒有創建索引
4.在查詢條件上沒有使用引導列
5.對索引列進行運算致使索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)
6.使用Oracle內部函數致使索引失效.對於這樣狀況應當建立基於函數的索引.
7.like "%_" 百分號在前.
8.not in ,not exist.


Hibernate與Mybatis對比總結:
二者相同點
Hibernate與MyBatis均可以是經過SessionFactoryBuider由XML配置文件生成SessionFactory,而後由SessionFactory 生成Session,最後由Session來開啓執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差很少的。
Hibernate和MyBatis都支持JDBC和JTA事務處理。
Mybatis優點
MyBatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。
MyBatis容易掌握,而Hibernate門檻較高。
Hibernate優點
Hibernate的DAO層開發比MyBatis簡單,Mybatis須要維護SQL和結果映射。
Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
Hibernate數據庫移植性很好,MyBatis的數據庫移植性很差,不一樣的數據庫須要寫不一樣SQL。
Hibernate有更好的二級緩存機制,可使用第三方緩存。MyBatis自己提供的緩存機制不佳。

struts和spring MVC的區別:
1.springMVC全註解方式進行管理,各類功能的註解都比較全面,使用簡單,而struts2須要採用XML不少的配置參數來管理(雖然也能夠採用註解,可是幾乎沒有公司那 樣使用)。
2.Struts2中自身提供多種參數接受,其實都是經過(ValueStack)進行傳遞和賦值,而SpringMvc是經過方法的參數進行接收。
3.Struts更加不少新的技術點,好比攔截器、值棧及OGNL表達式,學習成本較高,springmvc 比較簡單,很較少的時間都能上手。
4.spring mvc是方法級別的攔截,一個方法對應一個request上下文; struts2是類級別的攔截,一個類對應一個request上下文;
5.spring mvc處理ajax請求,直接經過返回數據, 方法中 使用註解 @ResponseBody, spring mvc自動幫咱們對象轉換爲JSON數據。


攔截器和過濾器的區別:
1.Filter基於回調函數,咱們須要實現的filter接口中doFilter方法就是回調函數,而interceptor則基於java自己的反射機制,這是二者最本質的區別。
2.Filter是依賴於servlet容器的,即只能在servlet容器中執行,很顯然沒有servlet容器就沒法來回調doFilter方法。而interceptor與servlet容器無關。
3.Filter的過濾範圍比Interceptor大,Filter除了過濾請求外經過通配符能夠保護頁面,圖片,文件等等,而Interceptor只能過濾請求。
4.Filter的過濾例外通常是在加載的時候在init方法聲明,而Interceptor能夠經過在xml聲明是guest請求仍是user請求來辨別是否過濾
5.interceptor的攔截處理其實就是代理機制!


性能優化技巧:
1.創建索引,存儲過程,觸發器和視圖
2.在查詢的時候避免使用×
3.避免使用子查詢
4.應當理解exists和in之間的區別,union和or之間的區別


數據庫設計的三大範式:
1.第一範式(確保每列保持原子性)
2. 確保每列都是與主鍵直接有關
3. 確保每列都是與主鍵直接有關,而不是間接有關


get和post的區別:
1.get安全性很是低,post安全性較高。可是執行效率卻比Post方法好。
2.get傳送的數據量較小,不能大於2KB。post傳送的數據量較大
3.get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到
4.在作數據查詢時,建議用Get方式;而在作數據添加、修改或刪除時,建議用Post方式;


隨着數據庫的日漸龐大,有時須要進行歸檔。如下是一些思路:
1.新建一個表空間存放各錶的歷史數據。
1.1寫一個存儲過程搬數據,數據搬遷到歷史表後,在基表中將搬遷的數據刪除。
2.按期將歷史數據exp到磁帶中去作永久保存。
3.歷史數據exp以後,能夠清空各歷史數據表。這樣,表空間的大小其實是很容易伸縮及控制的。


sql優化:
1.關鍵詞%yue%,因爲yue前面用到了「%」,所以該查詢必然走全表掃描,除非必要,不然不要在關鍵詞前加% ,若要提升效率,能夠考慮全文檢索。
2.對查詢進行優化,要儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。
3.應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
select id from t where num is null
4.最好不要給數據庫留NULL,儘量的使用 NOT NULL填充數據庫.
5.應儘可能避免在 where 子句中使用 != 或 <> 操做符,不然將引擎放棄使用索引而進行全表掃描。
6.應儘可能避免在 where 子句中使用 or 來鏈接條件,若是一個字段有索引,一個字段沒有索引,將致使引擎放棄使用索引而進行全表掃描
select id from t where num=10 or Name = 'admin'
能夠這樣查詢:select id from t where num = 10
union all
select id from t where Name = 'admin'
7.in 和 not in 也要慎用,不然會致使全表掃描,如:
select id from t where num in(1,2,37)
8.對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
9.不少時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
10.應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2 = 100 改成 select id from t where num = 100*2
11.應儘可能避免在where子句中對字段進行函數操做,這將致使引擎放棄使用索引而進行全表掃描
select id from t where substring(name,1,3) = ’abc’ -–name以abc開頭的id
select id from t where datediff(day,createdate,’2005-11-30′) = 0 -–‘2005-11-30’
12.對於多張大數據量(這裏幾百條就算大了)的表JOIN,要先分頁再JOIN,不然邏輯讀會很高,性能不好。
13.一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

 


14.儘可能使用表變量來代替臨時表。若是表變量包含大量數據,請注意索引很是有限(只有主鍵索引)。


java接口的做用:每一個類中都須要一些同名且返回值同樣的方法,這時候就能夠用接口,把這些方法所有寫在一個接口中,
讓這10個類去實現,這樣10個類中就有了這些方法`只須要本身具體的去填寫方法內部了

 

數據庫設計的三大範式:

1.第一範式(確保每列保持原子性)

2.第二範式(確保表中的每列都和主鍵相關)

3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

相關文章
相關標籤/搜索