Java面試題-javaweb篇七

java愛好者i發表於2019-04-09

61,JDBC訪問資料庫的基本步驟是什麼?

1,載入驅動

2,通過DriverManager物件獲取連線物件Connection

3,通過連線物件獲取會話

4,通過會話進行資料的增刪改查,封裝物件

5,關閉資源

62,說說preparedStatement和Statement的區別

1,效率:預編譯會話比普通會話物件,資料庫系統不會對相同的sql語句不會再次編譯

2,安全性:可以有效的避免sql注入攻擊!sql注入攻擊就是從客戶端輸入一些非法的特殊字元,而使伺服器端在構造sql語句的時候仍然能夠正確構造,從而收集程式和伺服器的資訊和資料。

比如:“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”

如果使用者名稱和密碼輸入的是’1’ or ‘1’=’1’ ; 則生產的sql語句是:

“select * from t_user where userName = ‘1’ or ‘1’ =’1’ and password =’1’ or ‘1’=’1’ 這個語句中的where 部分沒有起到對資料篩選的作用。

63,說說事務的概念,在JDBC程式設計中處理事務的步驟。

1 事務是作為單個邏輯工作單元執行的一系列操作。

2,一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和永續性 (ACID) 屬性,只有這樣才能成為一個事務

事務處理步驟:

3,conn.setAutoComit(false);設定提交方式為手工提交

4,conn.commit()提交事務

5,出現異常,回滾 conn.rollback();

64,資料庫連線池的原理。為什麼要使用連線池。

1,資料庫連線是一件費時的操作,連線池可以使多個操作共享一個連線。

2,資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連線池最大連線數來防止系統無盡的與資料庫連線。更為重要的是我們可以通過連線池的管理機制監視資料庫的連線的數量、使用情況,為系統開發,測試及效能調整提供依據。

3,使用連線池是為了提高對資料庫連線資源的管理

65,JDBC的髒讀是什麼?哪種資料庫隔離級別能防止髒讀?

當我們使用事務時,有可能會出現這樣的情況,有一行資料剛更新,與此同時另一個查詢讀到了這個剛更新的值。這樣就導致了髒讀,因為更新的資料還沒有進行持久化,更新這行資料的業務可能會進行回滾,這樣這個資料就是無效的。資料庫的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔離級別可以防止髒讀。

66,什麼是幻讀,哪種隔離級別可以防止幻讀?

幻讀是指一個事務多次執行一條查詢返回的卻是不同的值。假設一個事務正根據某個條件進行資料查詢,然後另一個事務插入了一行滿足這個查詢條件的資料。之後這個事務再次執行了這條查詢,返回的結果集中會包含剛插入的那條新資料。這行新資料被稱為幻行,而這種現象就叫做幻讀。

只有TRANSACTION_SERIALIZABLE隔離級別才能防止產生幻讀。

67,JDBC的DriverManager是用來做什麼的?

JDBC的DriverManager是一個工廠類,我們通過它來建立資料庫連線。當JDBC的Driver類被載入進來時,它會自己註冊到DriverManager類裡面

然後我們會把資料庫配置資訊傳成DriverManager.getConnection()方法,DriverManager會使用註冊到它裡面的驅動來獲取資料庫連線,並返回給呼叫的程式。

68,execute,executeQuery,executeUpdate的區別是什麼?

1,Statement的execute(String query)方法用來執行任意的SQL查詢,如果查詢的結果是一個ResultSet,這個方法就返回true。如果結果不是ResultSet,比如insert或者update查詢,它就會返回false。我們可以通過它的getResultSet方法來獲取ResultSet,或者通過getUpdateCount()方法來獲取更新的記錄條數。

2,Statement的executeQuery(String query)介面用來執行select查詢,並且返回ResultSet。即使查詢不到記錄返回的ResultSet也不會為null。我們通常使用executeQuery來執行查詢語句,這樣的話如果傳進來的是insert或者update語句的話,它會丟擲錯誤資訊為 “executeQuery method can not be used for update”的java.util.SQLException。 ,

3,Statement的executeUpdate(String query)方法用來執行insert或者update/delete(DML)語句,或者 什麼也不返回,對於DDL語句,返回值是int型別,如果是DML語句的話,它就是更新的條數,如果是DDL的話,就返回0。

只有當你不確定是什麼語句的時候才應該使用execute()方法,否則應該使用executeQuery或者executeUpdate方法。

69,SQL查詢出來的結果分頁展示一般怎麼做?

Oracle:

select * from

(select *,rownum as tempid from student ) t

where t.tempid between ” + pageSize*(pageNumber-1) + ” and ” + pageSize*pageNumber

MySQL:

select * from students limit ” + pageSize*(pageNumber-1) + “,” + pageSize;

sql server:

select top ” + pageSize + ” * from students where id not in +

(select top ” + pageSize * (pageNumber-1) + id from students order by id) +

“order by id;

70,JDBC的ResultSet是什麼?

在查詢資料庫後會返回一個ResultSet,它就像是查詢結果集的一張資料表。

ResultSet物件維護了一個遊標,指向當前的資料行。開始的時候這個遊標指向的是第一行。如果呼叫了ResultSet的next()方法遊標會下移一行,如果沒有更多的資料了,next()方法會返回false。可以在for迴圈中用它來遍歷資料集。

預設的ResultSet是不能更新的,遊標也只能往下移。也就是說你只能從第一行到最後一行遍歷一遍。不過也可以建立可以回滾或者可更新的ResultSet

當生成ResultSet的Statement物件要關閉或者重新執行或是獲取下一個ResultSet的時候,ResultSet物件也會自動關閉。

可以通過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列資料。

歡迎工作一到五年的Java工程師朋友們加入Java架構師:697558955

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

相關文章