java連接mysql數據庫都有固定的操作,步驟如下:
- 加載mysql驅動,一般都是com.mysql.jdbc.Driver。
- 提供JDBC連接的URL。
-
- 創建數據庫的連接。要連接數據庫,需要向java.sql.DriverManager請求并獲得Connection對象。
- 創建一個Statement。
- 要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3種類型: ??
- ??????1)執行靜態SQL語句。通常通過Statement實例實現。 ??
- ??????2)執行動態SQL語句。通常通過PreparedStatement實例實現(常用)。 ??
- ??????3)執行數據庫存儲過程。通常通過CallableStatement實例實現。?
-
- 具體實現方式: ??
- ? ? ? ?Statement?stmt?=?con.createStatement()?; ??
- ???????PreparedStatement?pstmt?=?con.prepareStatement(sql)?; ??
- ???????CallableStatement?cstmt?= ?con.prepareCall("{CALL?demoSp(??,??)}")?; ??
-
- 執行SQL語句 ??
- ????Statement接口提供了三種執行SQL語句的方法:executeQuery?、executeUpdate和execute ? 。
- ? ? ? 1)ResultSet?executeQuery(String?sqlString):執行查詢數據庫的SQL語句,返回一個結果集(ResultSet)對象。 ??
- ? ? ??2)int?executeUpdate(String?sqlString):用于執行INSERT、UPDATE或DELETE語句以及SQL?DDL語句,如:CREATE?TABLE和DROP?TABLE等 ??
- ? ? ??3)execute(sqlString):用于執行返回多個結果集、多個更新計數或二者組合的語句。 ??
- 具體實現方式: ??
- ? ? ? ResultSet?rs?=?stmt.executeQuery("SELECT?*?FROM?...")?; ??
- ? ? ?int?rows?=?stmt.executeUpdate("INSERT?INTO?...")?; ??
- ? ? ?boolean?flag?=?stmt.execute(String?sql)?;
-
- 處理結果 ??
- ? ? 有兩種情況: ??
- ?????1)執行更新返回的是本次操作影響到的記錄數。 ??
- ?????2)執行查詢返回的結果是一個ResultSet對象。 ??
- ??????ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法提供了對這些行中數據的訪問。 ??
- ??????使用結果集(ResultSet)對象的訪問方法獲取數據: ??
- ?????while(rs.next()){ ??
- ?????????String?name?=?rs.getString("name")?; ??
- ? ? ? ? ?String?psw =?rs.getString(1)?;?//?此方法比較高效???
- ?????} ??
- ????(列是從左到右編號的,并且從列1開始)
-
- 關閉JDBC對象? ??
- ?????操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲明順序相反: ??
- ?????1)關閉記錄集 ??
- ?????2)關閉聲明 ??
- ?????3)關閉連接對象 ?
-
if(rs != null){ // 關閉記錄集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 關閉聲明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 關閉連接對象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }
-
? ? ? 請注意,如果僅僅是創建一個數據庫連接的話,步驟4、5、6不是必要的。所以,如果你是初學者,只需要用前面的步驟測試數據庫是否連接成功即可,不要做過多的操作,那樣你就能發現其實JDBC連接數據庫的方法其實并不難。但是,當你操作完數據庫,請你記住關閉左右連接對象,釋放資源,這不僅是個好習慣,還能在你處理較大的數據量是避免不必要的麻煩。
? ? ?下面給出一個例子,從mysql中取出數據并存到二維數組里,數據用的是機器學習中的鳶尾花iris數據(在機器學習數據集獲取官方網站UCI中點擊打開鏈接),代碼如下:
DBConnection.java
package db;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;/*** * 數據庫連接類,通用* * @author lsy* */ public class DBConnection {public static final String driver = "com.mysql.jdbc.Driver";// 驅動public static final String url = "jdbc:mysql://localhost:3306/mydb";// mysql固定的URL:jdbc:mysql://localhost:3306/數據庫名(我這里是mydb)public static final String user = "root";// 我的數據庫的用戶名public static final String pwd = "123";// 我的數據庫密碼public static Connection dBConnection() {Connection con = null;try {// 加載mysql驅動器Class.forName(driver);// 建立數據庫連接con = DriverManager.getConnection(url, user, pwd);} catch (ClassNotFoundException e) {System.out.println("加載驅動器失敗");e.printStackTrace();} catch (SQLException e) {System.out.println("注冊驅動器失敗");e.printStackTrace();}return con;} }
SelectData.java
package dao;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;import db.DBConnection;/*** * 取出數據,存到二維數組里* * @return flowers* @author lsy*/ public class SelectData {public static final String SELECT = "select* from iris_PCA";public static final int k = 4;// 4個屬性public double[][] getFlowers() throws SQLException {Connection con = DBConnection.dBConnection();ResultSet rs;// 創建結果集PreparedStatement pstmt = con.prepareStatement(SELECT);// 創建一個PreparedStatement對象rs = pstmt.executeQuery();// 為初始化數組的大小提供方便int sample = 0;while (rs.next()) {sample++;}double[][] flower = new double[sample][k];rs = pstmt.executeQuery();// 特別重要,否則取到的全是0。因為執行上面的while(rs.next())后,ResultSet對象的下標已指到0。// API:當生成ResultSet對象的Statement對象關閉、重新執行或用來從多個結果的序列獲取下一個結果時,ResultSet對象將自動關閉。for (int i = 0; rs.next(); i++) {for (int j = 0; j < k; j++) {flower[i][j] = rs.getDouble(j + 2);}}// 輸出二維數組System.out.println("花花: ");for (int i = 0; i < flower.length; i++) {for (int j = 0; j < flower[0].length; j++) {System.out.print(flower[i][j] + "\t");}System.out.println();}pstmt.close();rs.close();con.close();return flower;}public static void main(String[] args) {try {SelectData selectData = new SelectData();selectData.getFlowers();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }
輸出結果:
花花: 5.1 3.5 1.4 0.2 4.9 3.0 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0.2 5.0 3.6 1.4 0.2 5.4 3.9 1.7 0.4 4.6 3.4 1.4 0.3 5.0 3.4 1.5 0.2 4.4 2.9 1.4 0.2 4.9 3.1 1.5 0.1 5.4 3.7 1.5 0.2 4.8 3.4 1.6 0.2 4.8 3.0 1.4 0.1 4.3 3.0 1.1 0.1 5.8 4.0 1.2 0.2 5.7 4.4 1.5 0.4 5.4 3.9 1.3 0.4 5.1 3.5 1.4 0.3 5.7 3.8 1.7 0.3 5.1 3.8 1.5 0.3 5.4 3.4 1.7 0.2 5.1 3.7 1.5 0.4 4.6 3.6 1.0 0.2 5.1 3.3 1.7 0.5 4.8 3.4 1.9 0.2 5.0 3.0 1.6 0.2 5.0 3.4 1.6 0.4 5.2 3.5 1.5 0.2 5.2 3.4 1.4 0.2 4.7 3.2 1.6 0.2 4.8 3.1 1.6 0.2 5.4 3.4 1.5 0.4 5.2 4.1 1.5 0.1 5.5 4.2 1.4 0.2 4.9 3.1 1.5 0.1 5.0 3.2 1.2 0.2 5.5 3.5 1.3 0.2 4.9 3.1 1.5 0.1 4.4 3.0 1.3 0.2 5.1 3.4 1.5 0.2 5.0 3.5 1.3 0.3 4.5 2.3 1.3 0.3 4.4 3.2 1.3 0.2 5.0 3.5 1.6 0.6 5.1 3.8 1.9 0.4 4.8 3.0 1.4 0.3 5.1 3.8 1.6 0.2 4.6 3.2 1.4 0.2 5.3 3.7 1.5 0.2 5.0 3.3 1.4 0.2 7.0 3.2 4.7 1.4 6.4 3.2 4.5 1.5 6.9 3.1 4.9 1.5 5.5 2.3 4.0 1.3 6.5 2.8 4.6 1.5 5.7 2.8 4.5 1.3 6.3 3.3 4.7 1.6 4.9 2.4 3.3 1.0 6.6 2.9 4.6 1.3 5.2 2.7 3.9 1.4 5.0 2.0 3.5 1.0 5.9 3.0 4.2 1.5 6.0 2.2 4.0 1.0 6.1 2.9 4.7 1.4 5.6 2.9 3.6 1.3 6.7 3.1 4.4 1.4 5.6 3.0 4.5 1.5 5.8 2.7 4.1 1.0 6.2 2.2 4.5 1.5 5.6 2.5 3.9 1.1 5.9 3.2 4.8 1.8 6.1 2.8 4.0 1.3 6.3 2.5 4.9 1.5 6.1 2.8 4.7 1.2 6.4 2.9 4.3 1.3 6.6 3.0 4.4 1.4 6.8 2.8 4.8 1.4 6.7 3.0 5.0 1.7 6.0 2.9 4.5 1.5 5.7 2.6 3.5 1.0 5.5 2.4 3.8 1.1 5.5 2.4 3.7 1.0 5.8 2.7 3.9 1.2 6.0 2.7 5.1 1.6 5.4 3.0 4.5 1.5 6.0 3.4 4.5 1.6 6.7 3.1 4.7 1.5 6.3 2.3 4.4 1.3 5.6 3.0 4.1 1.3 5.5 2.5 4.0 1.3 5.5 2.6 4.4 1.2 6.1 3.0 4.6 1.4 5.8 2.6 4.0 1.2 5.0 2.3 3.3 1.0 5.6 2.7 4.2 1.3 5.7 3.0 4.2 1.2 5.7 2.9 4.2 1.3 6.2 2.9 4.3 1.3 5.1 2.5 3.0 1.1 5.7 2.8 4.1 1.3 6.3 3.3 6.0 2.5 5.8 2.7 5.1 1.9 7.1 3.0 5.9 2.1 6.3 2.9 5.6 1.8 6.5 3.0 5.8 2.2 7.6 3.0 6.6 2.1 4.9 2.5 4.5 1.7 7.3 2.9 6.3 1.8 6.7 2.5 5.8 1.8 7.2 3.6 6.1 2.5 6.5 3.2 5.1 2.0 6.4 2.7 5.3 1.9 6.8 3.0 5.5 2.1 5.7 2.5 5.0 2.0 5.8 2.8 5.1 2.4 6.4 3.2 5.3 2.3 6.5 3.0 5.5 1.8 7.7 3.8 6.7 2.2 7.7 2.6 6.9 2.3 6.0 2.2 5.0 1.5 6.9 3.2 5.7 2.3 5.6 2.8 4.9 2.0 7.7 2.8 6.7 2.0 6.3 2.7 4.9 1.8 6.7 3.3 5.7 2.1 7.2 3.2 6.0 1.8 6.2 2.8 4.8 1.8 6.1 3.0 4.9 1.8 6.4 2.8 5.6 2.1 7.2 3.0 5.8 1.6 7.4 2.8 6.1 1.9 7.9 3.8 6.4 2.0 6.4 2.8 5.6 2.2 6.3 2.8 5.1 1.5 6.1 2.6 5.6 1.4 7.7 3.0 6.1 2.3 6.3 3.4 5.6 2.4 6.4 3.1 5.5 1.8 6.0 3.0 4.8 1.8 6.9 3.1 5.4 2.1 6.7 3.1 5.6 2.4 6.9 3.1 5.1 2.3 5.8 2.7 5.1 1.9 6.8 3.2 5.9 2.3 6.7 3.3 5.7 2.5 6.7 3.0 5.2 2.3 6.3 2.5 5.0 1.9 6.5 3.0 5.2 2.0 6.2 3.4 5.4 2.3 5.9 3.0 5.1 1.8
寫博經驗尚淺,歡迎各位多多指教。