JDBC章節總結
1.介面可以降低程式的耦合度,提高程式的擴充套件力*
答:如果需要擴充套件介面功能的時候,直接建立一個實現介面功能的物件就可以了。
2.JDBC是一套專門用來操作資料庫的介面*
見名知意,java databases connection java 虛擬機器與資料庫之間的連線,需要通過Statement介面來實現
3.程式設計師只需要面向通用的JDBC介面呼叫方法即可完成資料的增刪改查,而不需要關係底層具體的資料庫是什麼品牌。* Connection conn = DriverManager.getConnection(url,user,password) ,建立與資料庫的連線,獲得實現類的物件, 再通過這個連線物件獲得實現mysql語句的物件 Statement stat = conn.createStatement(); 增 stat.executeUpdate(sql)insert into 某一行資料 create table users . 刪 改 查 stat.executeQuery(sql)
理解
4.資料庫廠家負責編寫JDBC介面的實現類,這些類被打成jar包,並且釋出,這些jar包稱為驅動。*
知道
5.開發JDBC程式之前,需要從資料庫官網下載相關驅動jar包,然後將其配置到環境變數classpath當中。*
理解是一套規範,用相同的規範訪問不同資料庫,Oracle,通過介面連線 ,資料庫廠家提供實現類物件。這些物件封裝成一個介面。
6.能夠獨立的編寫出JDBC的6步驟嗎?* step 1: 註冊驅動 Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(Driver);
step 2:建立資料庫的連線 String user = "root"; String password= "root"; String url = "jdbc:mysql://192.168.148.8:3306/bjpowernode"; Connection conn=Driver.Manager.getConnection(url,user,password); step 3:通過連線生成sql語句的物件,也就是實現Statement介面的物件。 Statement stat= conn.createStatement(); step 4:執行對sql語句的操作 DDL。 String sql = "create table users = ( uid int(3), primary key uname varchar(4) sex char(1) unique )"; int i= stat.executeUpdate(sql); system.out.println("輸出計時器i"+i); DQL String sql = "select * from emp where sal between 1600 and 3000"; Resultset res = stat.executeQuery(sql); DML String sql = "insert into emp values = (9003,Str_to_date('2018-06-27','%y-%m-%d')"; int i= stat.executeUpdate(sql); system.out.println("輸出計時器i"+i); step 5:遍歷查詢結果,獲得ReseultSet結果集。(只有執行DQL時候才會有這一步) where(res.next()){ int empno = res.getInt("empnno"); String ename = res.getString("ename"); } system.out,println(empno+","+ename+""); step 6:關閉資料庫。 if( res !=null){ res.close(); } if(stat!=null){ stat.close(); } if(conn!=null){ conn.close(); }
7.Class.forName(“com.mysql.jdbc.Driver”)完成驅動註冊的原理是什麼?*
通過反射得到物件實質上都是一些位元組碼檔案存在於jar包中。
8.JDBC當中所有的下標都是從1開始的。*
佔位符下標從1開始。
9.連線資料庫的資訊:driver /url /user/ password建議配置到屬性檔案中。* 怎麼配置? 是為了降低程式碼的耦合度才把這些常用的操作做成配置檔案。 三步走:建立io流InputStream inputstream = 執行時類.class.getClassload().getResourceAsStream(“config.properties”); 載入流properties.load(inputstream); 呼叫getProperty();方法。
10.能夠對查詢結果集進行遍歷,以字串的形式取出,或者以指定的型別取出,通過查詢結果集當中的列名稱可以取,也可以通過列索引取。*
題6有解釋
11.什麼是SQL注入,導致SQL注入的根本原因是什麼?* 輸入錯誤的使用者名稱和密碼竟然登陸成功了。
- and or 的優先順序影響,2.statement需要拼接sql語句。
12.使用PreparedStatement可以防止SQL注入,是因為預編譯的資料庫操作物件會將SQL語句進行預編譯,即使使用者提供的資訊中含有SQL關鍵字,但由於這些關鍵字沒有參與編譯過程,固然是不起作用的。*
理解
13.PreparedStatement比Statement效率高,並且PreparedStatement是型別安全的。* 1.Statement需要拼接SQL語句,會導致SQL注入攻擊,preparedStatement不會。 2.Statement在執行多個SQL語句的時候,編譯一次,執行一次。在編譯在執行。 效率低 PreparedStatement編譯一次,執行多次。效率高。(後面會講到。)
14.使用PreparedStatement給佔位符賦值的時候,佔位符?,不能使用單引號括起來。*
給SQL欄位不賦值,而用?代替。 ?相當於一個具體的欄位
15.JDBC事務預設支援自動提交,也就是隻要執行一條DML語句則自動提交一次,顯然是不符合現實業務的。通常使用這三個語句控制事務:conn.setAutoCommit(false);conn.commit();conn.rollback();*
1.conn.setAutoCommit(false);來關閉自動提交方式
2.提交結束事務(conn.commit()):事務中對資料庫的修改被永久的儲存到資料庫中,所有的事務可以查詢到這些修改
3.回滾結束事務(conn.rollback()):事務中對資料庫的修改被統統的放棄,資料庫恢復到事務開始之前的狀態
16.對於for update的使用,你理解嗎?*
見名知意,就是我更新的時候你才可以操作,比如兩個會話同時訪問資料的時候,要等待一方完成對資料的修改或者查詢操作(即commit之後)之後
另一個會話才可以操作查詢或者修改。
17.能夠獨立完成MySQL資料庫資料的匯入和匯出嗎*
開啟 neicat 找到資料庫,比如bjpowernode,testpowernode;右鍵有匯入,匯出。
18.資料庫設計三正規化分別是什麼* 第一正規化:1.要求有PrimaryKey,2.資料是唯一的,且不能重複,3.每一個欄位是原子性的不可以再分。 第二正規化:建立在第一正規化的基礎上的,儘量避免使用聯合主鍵2.資料庫中的非主鍵要完全依賴主鍵,不能產生部分依賴。屬於典型的多對多關係,如師生表。 第三正規化:建立在第二正規化的基礎上,要求非主鍵欄位不能產生傳遞依賴於主鍵欄位,屬於典型的一對多設計。
19.一對一,一對多,多對多關係,這些關係怎麼設計資料庫表*
一對一:方法一:共享主鍵primaryKey。方法二:外來鍵唯一unique
一對多:建立倆個表,在多的一方新增外來鍵foreignKey,外來鍵引用一的一方主鍵欄位。
多對多:分三張表儲存,如學生表,課程表,選課表。 學生表,教師表,學生和教師的關係表。
20.資料庫設計方面雖然有正規化要求,但是實際開發中還是以滿足客戶的需求為前提。*
儘量遵循三正規化。 21.我們在實際專案的開發中為什麼很少使用資料庫的”儲存過程“*
一個儲存過程是一個可程式設計的函式 在不同的資料庫中,儲存過程的語法都是不同的;只要我們使用了儲存過程,就相當於放棄了資料庫的移植性
儲存過程:例子:宣告一個儲存過程,查詢emp表中資料總數,並返回結果(相當於一個可程式設計的函式)?
步驟: CREATE PROCEDURE proc1 (out num int ) //1 BEGIN //2
SELECT COUNT(*) INTO num FROM EMP; /3 //sql語句
END ; //4
CALL PROC1 (@num); 5. //呼叫儲存過程
select(@num); //檢視執行結果。
標準答案:(分號不能省) CREATE PROCEDURE PROC4(OUT NUM INT) BEGIN SELECT COUNT(*) INTO NUM FROM EMP ; END; CALL PROC4(@NUM); SELECT(@NUM);
//DROP PROCEDURE PROC1; 刪除儲存過程。
拓展提
-- 建立以儲存過程,返回兩個引數相加的結果
CREATE PROCEDURE PROC2 (NUM1 INT ,NUM2 INT , OUT RES INT) BEGIN – 把NUM1 + NUM2的結果賦值給OUT型別的引數RES;通過out型別的引數將結果返回給呼叫者 SET RES = NUM1 + NUM2; END;
– 呼叫儲存過程 CALL PROC2(10,20,@res); SELECT @RES;
在JDBC操作中會出現的異常有哪些:ClassNotFoundExecption和SQLException