1. 程式人生 > 實用技巧 >【JDBC】JDBC操作實戰

【JDBC】JDBC操作實戰

JDBC

jdbc:是使用java語言對資料進行操作

1).常見介面、類

	 ①java.sql.Connection:		資料庫連線,只有先獲得Connection物件才能連線到資料庫
		常見方法:
			prepareStatement(sql語句); 建立傳送sql語句工具的方法

	 ②java.sql.PreparedStatement:	傳送sql語句的工具,具備傳送sql的功能(方法)
		常見方法:
			executeQquery();		傳送查詢sql,並返回結果集
			executeUpdate();		傳送增、刪、改的sql,返回受影響行數的int型別
			setXXX(序號, 值);	設定sql內的佔位引數(?)

	 ③java.sql.ResultSet:			結果集,資料庫執行sql返回查詢的結果,游標預設在第一行(不是資料),下圖
		常見方法:
			next();				遊標下移一行
			getXXX(“欄位名”);		獲得當前行的欄位名的值; 例如:int id = rs.getInt(id);
			getXXX(int index);		獲得當前行指定序號列的值; 例如:int id= rs.getInt(1);
			getString()/getDate()/getInt()/getDouble()…

	 ④java.sql.Driver:			驅動類,訪問資料庫的方式,不同資料庫會自動提供具體的實現介面

	 ⑤java.sql.DriverManager:		管理多個驅動
			getConnection(url, uid, pw); 獲得資料庫連線,url:”jdbc:oracle:thin:@ip:埠:例項名(orcl)”

	 ⑥java.sql.ResultSetMetaData; 	對結果集ResultSet的進一步操作,其包含了結果集表的所有資訊
			例如:打印表t
			ResultSet rs = preparedStatement.executeQuery();
		    ResultSetMetaData rmd = rs.getMetaData();
			//列印一行欄位名:
			for(int i = 1; I < rmd.getColumnCount(); i++) 
				System.out.print(rmd.getColumnLabel(i) + “\t”);
			System.out.println();
			//逐行列印資料
			while(rs.next()) {
				for(int I = 1; i < rmd.getColumnCount(); i++) {  //獲取查詢結果欄位的個數	
					System.out.print(rs.getString(i) + “\t”);
				}
			}	

2).JDBC操作步驟

	 準備階段:先匯入ojdbcX.jar包(例如:將ojdbc6.jar複製到專案的lib資料夾—build path—add to build path)
	 ①載入驅動:
Class.forName(“oracle.jdbc.OracleDriver”);

	 ②獲得資料庫連線
		Connection conn = DriverManager.getConnection(url, username, password);
 		url: jdbc:oracle:thin:@ip:埠:orcl/xe(例項)

	 ③建立傳送sql語句的工具,併發送
		PreparedStatement psmt = conn.prepareStatement(“sql語句”);
		// PreparedStatement psmt = conn.prepareStatement(“insert into emp values(?, ?)”); //佔位引數
		// psmt.setInt(1, 1001); psmt.setString(2, ‘jwnming’);
		psmt.executeUpdate();		//傳送增、刪、改的sql命令,返回受影響行數的int型別
		psmt.executeQuery();		//傳送查詢的sql命令,返回查詢的結果集(ResultSet)

	 ④處理查詢的結果集
		ResultSet rs = psmt.executerQuery();
		rs.next(); //使當前行,為資料的第一行
		System.out.println(rs.getInt(“id”));  //列印當前行的id值
		System.out.println(rs.getString(1));  //列印當前行的第一個欄位值

	 ⑥釋放資源:先建立的後關閉
		if(rs != null) rs.close();		先判斷是否為空
		if(psmt != null) psmt.close();
		if(conn != null) conn.close();

3).驅動載入剖析、動態sql語句

1. 驅動載入剖析
DriverManager管理驅動
  	 //管理驅動
  	 public class DriverManager{
   	    private static List<Driver> drivers  = new CopyOnWriteArrayList<>();//存放多個driver物件.
    	    //真正的註冊驅動的程式碼.
     	public static void registDriver(Driver driver){
         	drivers.add(driver);
      	}
      	public static Connection getConnection(String url,String user,String password){
      	    //...
     	}
  	 }

 驅動載入
   	// 表面書寫: Class.forName("oracle.jdbc.OracleDriver")
   	// 如何實現驅動載入?
  	public class OracleDriver implements Driver{
        //載入驅動
        static{
            Driver driver = new oracle.jdbc.OracleDriver();//建立驅動
            DriverManager.registDriver(driver);//新增驅動物件, 註冊驅動,  載入驅動.
        }
   	}

2. 動態訪問資料庫的sql
方式1:  SQL字串拼接,將資料通過字串拼接,繫結在SQL語句中;
	缺點:sql注入
	例如:String sql = “select * from employees where name = ‘” + name +”’”;

方式2:  pstm動態引數:? 方式只能動態繫結資料/值的部分 

優點: 防止SQL注入.
缺點: 不能動態繫結  sql的關鍵詞,列名..

步驟:
①. 建立SQL允許將值,用? 站位: `delete from t_person where name = ?`
   pstm = conn.prepareStatement("delete from t_person where name = ?");
   // insert into t_person values(?,?,?,?,?);
②. 繫結引數:對?站位的值,進行替換,繫結.
   //pstm.setXxxx(?的序號從1開始,要繫結的具體值);// 將資料繫結在指定的?位置.

   pstm.setInt();  //繫結整數型別的值
   pstm.setString() //繫結字串的值
   pstm.setDouble();// 繫結double的值
   pstm.setDate();//繫結日期.
③. 傳送sql(執行)
   pstm.executeUpdate();//執行增刪改
   pstm.executeQuery();//執行查詢.

4).批處理(批量更新資料)

批更新(BatchUpdate) :  **PreparedStatement**核心
1. 將繫結的引數,快取在java本地.
   pstm.addBatch()
2. 將快取在java本地的多組引數,一次性發送給Oracle.
   pstm.executeBatch()
例如:
		for(int i = 0; i < 10000; i++) {
			psmt1.setString(1, name);
			psmt1.addBatch();
			if(i % 600 == 0) {
				psmt1.executeBatch();
			}
		}
	psmt1.executeBatch();