1. 程式人生 > >JDBC章節總結(.資料庫設計三正規化、如何設計資料庫表)

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注入的根本原因是什麼?*
輸入錯誤的使用者名稱和密碼竟然登陸成功了。

  1. 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