九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
java面試④數(shù)據(jù)庫部分

2.3.1 數(shù)據(jù)庫的分類及常用的數(shù)據(jù)庫

數(shù)據(jù)庫分為:關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫

關(guān)系數(shù)據(jù)庫:mysql,oracle,sqlServer

非關(guān)系型:redis,mongoDB

2.3.2 簡單介紹一下關(guān)系數(shù)據(jù)庫三范式

范式就是規(guī)范,就是關(guān)系型數(shù)據(jù)庫在設(shè)置表時,要遵循的三個規(guī)范。

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

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

二范式(2NF)要求數(shù)據(jù)庫表中的每個行必須可以被唯一的區(qū)分,為實現(xiàn)區(qū)分通常需要為表加上一列,以存儲各個實例的唯一標(biāo)識。(主鍵)

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

反三范式,有的時候為了效率,可以設(shè)置重復(fù)或者可以推導(dǎo)的字段,訂單(總價)和訂單項(單價)

2.3.3 事務(wù)的四個基本特征

事物是并發(fā)控制的單位,是用戶定義的一個操作序列,這些操作要么都做,要么都不做,是一個不可分割的工作單位。

一個轉(zhuǎn)賬必須A賬號扣錢成功,B賬號加錢成功,才算真正的轉(zhuǎn)賬成功。

事務(wù)必須滿足四大特征:

原子性:表示事務(wù)內(nèi)操作不可分割,要么成功,要么都失敗

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

隔離性:一個事務(wù)開始后,不能與其他事務(wù)干擾

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

2.3.4 mysql數(shù)據(jù)庫的默認的最大連接數(shù)?

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

max_connections=100;

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

為什么需要分頁?在很多數(shù)據(jù)庫時,不可能完全顯示數(shù)據(jù),進行分段顯示。

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

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

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

2.3.6 簡單講一下數(shù)據(jù)庫的觸發(fā)器的使用場景

觸發(fā)器,需要觸發(fā)條件,當(dāng)條件滿足以后做什么操作。

觸發(fā)器用處還是很多的,比如校內(nèi)網(wǎng)、Facebook,你發(fā)一個日志,自動通知好友,其實就是在增加日志做一個后觸發(fā),再向通知表中寫入條目,因為觸發(fā)效率高,而UCH沒有用觸發(fā)器,效率和數(shù)據(jù)處理能力很低。

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

關(guān)鍵字:trigger

2.3.7 簡單講一下數(shù)據(jù)庫的存儲過程的使用場景?

數(shù)據(jù)庫存儲過程具有如下優(yōu)點:

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

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

3)存儲過程創(chuàng)建一次便可以重復(fù)使用,從而可以減少數(shù)據(jù)庫開發(fā)人員的工作量,

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

定義存儲過程:

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

begin

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

select name,age from student;

end;

調(diào)用存儲過程

call student();

select

2.3.8 用jdbc怎么調(diào)用存儲過程?

加載驅(qū)動

獲取連接

設(shè)置參數(shù)

執(zhí)行

釋放連接

public static void main(String[]args) {

Connection conn = null;

CallableStatement st = null;

try {

//這里最好不要這么干,因為驅(qū)動名寫死在程序中了

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

//實際項目中,這里應(yīng)用DataSource數(shù)據(jù),如果用框架

//這個數(shù)據(jù)源不需要我們編碼創(chuàng)建,我們只需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第幾個,不同的數(shù)據(jù)庫不一樣,建議不寫

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

} catch(Exception e){

e.printStackTrace();

}

}

2.3.9 常用的SQL

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

Java database connection java數(shù)據(jù)庫連接,數(shù)據(jù)庫關(guān)系系統(tǒng)(mysql,oracle)是很多,每個數(shù)據(jù)庫管理系統(tǒng)支持的命令是不一樣的,

java只定義接口,讓數(shù)據(jù)庫廠商自己實現(xiàn)接口,對于我們而言只需要導(dǎo)入對應(yīng)廠商開發(fā)的實現(xiàn)接口,然后以接口方式進行調(diào)用(mysql+mysql驅(qū)動+jdbc)

2.3.11 寫一個簡單的jdbc的程序,寫一個訪問oracle數(shù)據(jù)庫的jdbc程序?

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

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

設(shè)置參數(shù)

Statement st = conn.createStatement();

st.setXXX(index,value)

執(zhí)行(execute)

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

2.3.12 JDBC中的PreparedStatement相比Statement的好處

大多數(shù)時候都使用PreparedStatement代替

1)PreparedStatement是預(yù)編譯的,比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;有些數(shù)據(jù)庫是不會讓你成功的,但也有很多數(shù)據(jù)庫就可以使這些語句得到執(zhí)行.

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

2.3.13 數(shù)據(jù)庫連接池的作用

1)限定數(shù)據(jù)庫的個數(shù),不會導(dǎo)致由于數(shù)據(jù)庫過多導(dǎo)致系統(tǒng)運行緩慢或者崩潰。

2)數(shù)據(jù)庫連接池不需要每次創(chuàng)建或者銷毀,節(jié)約資源。

3)數(shù)據(jù)庫連接池不需要每次創(chuàng)建,響應(yīng)時間快。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
oracle 數(shù)據(jù)庫,分頁問題。簡單經(jīng)典的。
SQL Server,MySql,Oracle數(shù)據(jù)庫的默認端口號
Hibernate、Mybatis 數(shù)據(jù)庫連接字符串
軟件測試學(xué)習(xí)教程——JDBC介紹
C#中使用Oracle存儲過程返回結(jié)果集
MySQL高頻面試題,都在這了
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服