1. 程式人生 > >java面試④數據庫部分

java面試④數據庫部分

pda 命令 有一個 非關系型 sel data 索引 .exe 只需要

2.3.1 數據庫的分類及常用的數據庫

數據庫分為:關系型數據庫和非關系型數據庫

關系數據庫:mysql,oracle,sqlServer

非關系型:redis,mongoDB

2.3.2 簡單介紹一下關系數據庫三範式

範式就是規範,就是關系型數據庫在設置表時,要遵循的三個規範。

要滿足第二範式必須先滿足第一範式,要滿足第三範式必須先滿足第二範式。

所謂第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體列中的某個屬性不能有多個值或者不能有重復的屬性,列數據的不可分割。

二範式(2NF)要求數據庫表中的每個行必須可以被唯一的區分,為實現區分通常需要為表加上一列,以存儲各個實例的唯一標識。(主鍵)

滿足第三範式(3NF)必須先滿足第二範式,簡而言之,第三範式要求一個數據庫表中不包含已在其他表中已包含的非關鍵字信息。(外鍵)

反三範式,有的時候為了效率,可以設置重復或者可以推導的字段,訂單(總價)和訂單項(單價)

技術分享

2.3.3 事務的四個基本特征

事物是並發控制的單位,是用戶定義的一個操作序列,這些操作要麽都做,要麽都不做,是一個不可分割的工作單位。

一個轉賬必須A帳號扣錢成功,B帳號加錢成功,才算真正的轉賬成功。

事務必須滿足四大特征:

原子性:表示事務內操作不可分割,要麽成功,要麽都失敗

一致性:要麽成功,要麽失敗,後面的失敗了要對前面的操作進行回滾

隔離性:一個事務開始後,不能與其他事務幹擾

持久性(持續性):表示事務開始了,就不能終止。

2.3.4 mysql數據庫的默認的最大連接數?

為什麽需要最大連接數?特定服務器上面的數據庫只能支持一定數目同時連接,這時候需要我們設置最大連接數(最多同時服務多少連接),在數據庫安裝時都會有一個默認的最大連接數。最大連接數為100.

max_connections=100;

技術分享

2.3.5 說一下mysql的分頁?Oracle的分頁?

為什麽需要分頁?在很多數據庫時,不可能完全顯示數據,進行分段顯示。

mysql是使用關鍵字limit 來進行分頁的,limit offset,size 表示從多少索引取多少位。

Oracle的分頁。大部分情況下,我們是記不住了,說思路,要使用三層嵌套查詢

oracle的分頁優點記不住了,只記得一些大概,是使用類三層嵌套查詢,如果在工作中使用了,可以到原來的項目中拷貝或上網查詢。

2.3.6 簡單講一下數據庫的觸發器的使用場景

觸發器,需要觸發條件,當條件滿足以後做什麽操作。

觸發器用處還是很多的,比如校內網、Facebook,你發一個日誌,自動通知好友,其實就是在增加日誌做一個後觸發,再向通知表中寫入條目,因為觸發效率高,而UCH沒有用觸發器,效率和數據處理能力很低。

每插入一個帖子,都希望將版面表中的最後發帖時間,帖子數字段進行同步更新,用觸發器做效率更高。

關鍵字:trigger

2.3.7 簡單講一下數據庫的存儲過程的使用場景?

數據庫存儲過程具有如下優點:

1)存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需要重新編譯,而一般SQL語句每執行一次就編譯一次,因此使用存儲過程可以大大提高數據執行數度,

2)通常,復雜的業務邏輯需要多條SQL語句,這些語句要分別地從客戶端發送到服務器,當客戶端和服務器之間的操作很多時,將產生大量的網絡傳輸,如果將這些操作放在一個存儲過程中,那麽客戶機和服務器之間的網絡傳輸就會大大減少,降低類網絡負載,

3)存儲過程創建一次便可以重復使用,從而可以減少數據庫開發人員的工作量,

4)安全性高,存儲過程可以屏蔽對底層數據庫對象的直接訪問,使用exectu權限調用存儲過程,無需擁有訪問底層數據庫對象的顯示權限。

定義存儲過程:

create procedure studen(name varchar(50),age int,id in);

begin

insert into student values(‘lisi‘,22,1);

select name,age from student;

end;

調用存儲過程

call student();

select

技術分享

2.3.8 用jdbc怎麽調用存儲過程?

加載驅動

獲取連接

設置參數

執行

釋放連接

public static void main(String[]args) {

Connection conn = null;

CallableStatement st = null;

try {

//這裏最好不要這麽幹,因為驅動名寫死在程序中了

Class.forName("com.mysql.jdbc.Driver");

//實際項目中,這裏應用DataSource數據,如果用框架

//這個數據源不需要我們編碼創建,我們只需DataSourceds=context.lookup();

//conn = ds.getConnection();

conn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

st = conn.prepareCall("{call insert_Student(?,?,?)}");

st.registerOutParameter(3, Types.INTEGER);

st.setString(1, "laowang");

st.setInt(2, 25);

st.execute();

//get第幾個,不同的數據庫不一樣,建議不寫

System.out.println(st.getString(3));

} catch(Exception e){

e.printStackTrace();

}

}

2.3.9 常用的SQL

2.3.10 簡單說一下你對jdbc的理解

Java database connection java數據庫連接,數據庫關系系統(mysql,oracle)是很多,每個數據庫管理系統支持的命令是不一樣的,

java只定義接口,讓數據庫廠商自己實現接口,對於我們而言只需要導入對應廠商開發的實現接口,然後以接口方式進行調用(mysql+mysql驅動+jdbc)

2.3.11 寫一個簡單的jdbc的程序,寫一個訪問oracle數據庫的jdbc程序?

加載驅動(oracle.jdbc.driver.OracleDriver)

獲取連接(DriverManager.getConnection(url, user, password))

設置參數

Statement st = conn.createStatement();

st.setXXX(index,value)

執行(execute)

釋放連接(是否連接要從小到大,必須放到finally)

技術分享

2.3.12 JDBC中的PreparedStatement相比Statement的好處

大多數時候都使用PreparedStatement代替

1)PreparedStatement是預編譯的,比Statement速度快

2)代碼的可讀性和可維護性

雖然PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說,都比直接用Statement的代碼高很多檔次。

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");

perstmt.setString(1,var1);

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate();

不用我多說,對於第一種方法.別說其他人去讀你的代碼,就是你自己過一段時間再去讀,都會覺得傷心.

3)安全性

PreparedStatement可以防止SQL註入攻擊,而Statement卻不能,比如:

String sql = "select * from tb_name where name= ‘"+varname+"‘ and passwd=‘"+varpasswd+"‘";

如果我們把[‘ or ‘1‘ = ‘1]作為varpasswd傳入進來.用戶名隨意,看看會成為什麽?

select * from tb_name = ‘隨意‘ and passwd = ‘‘ or ‘1‘ = ‘1‘;

因為‘1‘=‘1‘肯定成立,所以可以任何通過驗證.更有甚者:

把[‘;drop table tb_name;]作為varpasswd傳入進來,則:

select * from tb_name = ‘隨意‘ and passwd = ‘‘;drop table tb_name;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行.

而 如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關系.(前提是數據庫本身支持預編譯,但上前可能沒有什麽服務端數據庫不支持編 譯了,只有少數的桌面數據庫,就是直接文件訪問的那些)只要全使用預編譯語句,你就用不著對傳入的數據做任何過慮.而如果使用普通的statement, 有可能要對drop,;等做費盡心機的判斷和過慮.

2.3.13 數據庫連接池的作用

1)限定數據庫的個數,不會導致由於數據庫過多導致系統運行緩慢或者崩潰。

2)數據庫連接池不需要每次創建或者銷毀,節約資源。

3)數據庫連接池不需要每次創建,響應時間快。

java面試④數據庫部分