2.3.1 數據庫的分類及常用的數據庫 數據庫分為:關系型數據庫和非關系型數據庫 關系數據庫:mysql,oracle,sqlServer 非關系型:redis,mongoDB 2.3.2 簡單介紹一下關系數據庫三范式 范式就是規(guī)范,就是關系型數據庫在設置表時,要遵循的三個規(guī)范。 要滿足第二范式必須先滿足第一范式,要滿足第三范式必須先滿足第二范式。 所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體列中的某個屬性不能有多個值或者不能有重復的屬性,列數據的不可分割。 二范式(2NF)要求數據庫表中的每個行必須可以被唯一的區(qū)分,為實現(xiàn)區(qū)分通常需要為表加上一列,以存儲各個實例的唯一標識。(主鍵) 滿足第三范式(3NF)必須先滿足第二范式,簡而言之,第三范式要求一個數據庫表中不包含已在其他表中已包含的非關鍵字信息。(外鍵) 反三范式,有的時候為了效率,可以設置重復或者可以推導的字段,訂單(總價)和訂單項(單價) 2.3.3 事務的四個基本特征 事物是并發(fā)控制的單位,是用戶定義的一個操作序列,這些操作要么都做,要么都不做,是一個不可分割的工作單位。 一個轉賬必須A賬號扣錢成功,B賬號加錢成功,才算真正的轉賬成功。 事務必須滿足四大特征: 原子性:表示事務內操作不可分割,要么成功,要么都失敗 一致性:要么成功,要么失敗,后面的失敗了要對前面的操作進行回滾 隔離性:一個事務開始后,不能與其他事務干擾 持久性(持續(xù)性):表示事務開始了,就不能終止。 2.3.4 mysql數據庫的默認的最大連接數? 為什么需要最大連接數?特定服務器上面的數據庫只能支持一定數目同時連接,這時候需要我們設置最大連接數(最多同時服務多少連接),在數據庫安裝時都會有一個默認的最大連接數。最大連接數為100. max_connections=100; 2.3.5 說一下mysql的分頁?Oracle的分頁? 為什么需要分頁?在很多數據庫時,不可能完全顯示數據,進行分段顯示。 mysql是使用關鍵字limit 來進行分頁的,limit offset,size 表示從多少索引取多少位。 Oracle的分頁。大部分情況下,我們是記不住了,說思路,要使用三層嵌套查詢 oracle的分頁優(yōu)點記不住了,只記得一些大概,是使用類三層嵌套查詢,如果在工作中使用了,可以到原來的項目中拷貝或上網查詢。 2.3.6 簡單講一下數據庫的觸發(fā)器的使用場景 觸發(fā)器,需要觸發(fā)條件,當條件滿足以后做什么操作。 觸發(fā)器用處還是很多的,比如校內網、Facebook,你發(fā)一個日志,自動通知好友,其實就是在增加日志做一個后觸發(fā),再向通知表中寫入條目,因為觸發(fā)效率高,而UCH沒有用觸發(fā)器,效率和數據處理能力很低。 每插入一個帖子,都希望將版面表中的最后發(fā)帖時間,帖子數字段進行同步更新,用觸發(fā)器做效率更高。 關鍵字:trigger 2.3.7 簡單講一下數據庫的存儲過程的使用場景? 數據庫存儲過程具有如下優(yōu)點: 1)存儲過程只在創(chuàng)建時進行編譯,以后每次執(zhí)行存儲過程都不需要重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,因此使用存儲過程可以大大提高數據執(zhí)行數度, 2)通常,復雜的業(yè)務邏輯需要多條SQL語句,這些語句要分別地從客戶端發(fā)送到服務器,當客戶端和服務器之間的操作很多時,將產生大量的網絡傳輸,如果將這些操作放在一個存儲過程中,那么客戶機和服務器之間的網絡傳輸就會大大減少,降低類網絡負載, 3)存儲過程創(chuàng)建一次便可以重復使用,從而可以減少數據庫開發(fā)人員的工作量, 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怎么調用存儲過程? 加載驅動 獲取連接 設置參數 執(zhí)行 釋放連接 public static void main(String[]args) { Connection conn = null; CallableStatement st = null; try { //這里最好不要這么干,因為驅動名寫死在程序中了 Class.forName('com.mysql.jdbc.Driver'); //實際項目中,這里應用DataSource數據,如果用框架 //這個數據源不需要我們編碼創(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第幾個,不同的數據庫不一樣,建議不寫 System.out.println(st.getString(3)); } catch(Exception e){ e.printStackTrace(); } } 2.3.9 常用的SQL 略 2.3.10 簡單說一下你對jdbc的理解 Java database connection java數據庫連接,數據庫關系系統(tǒng)(mysql,oracle)是很多,每個數據庫管理系統(tǒng)支持的命令是不一樣的, java只定義接口,讓數據庫廠商自己實現(xiàn)接口,對于我們而言只需要導入對應廠商開發(fā)的實現(xiàn)接口,然后以接口方式進行調用(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) 執(zhí)行(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;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執(zhí)行. 而 如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發(fā)生任何匹配的關系.(前提是數據庫本身支持預編譯,但上前可能沒有什么服務端數據庫不支持編 譯了,只有少數的桌面數據庫,就是直接文件訪問的那些)只要全使用預編譯語句,你就用不著對傳入的數據做任何過慮.而如果使用普通的statement, 有可能要對drop,;等做費盡心機的判斷和過慮. 2.3.13 數據庫連接池的作用 1)限定數據庫的個數,不會導致由于數據庫過多導致系統(tǒng)運行緩慢或者崩潰。 2)數據庫連接池不需要每次創(chuàng)建或者銷毀,節(jié)約資源。 3)數據庫連接池不需要每次創(chuàng)建,響應時間快。 |
|
來自: Bladexu的文庫 > 《技術文摘》