【JDBC】JDBC操作實戰
阿新 • • 發佈:2020-09-08
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();