Java解惑 之 MySQL與JDBC編程

1、JDBC的經常使用接口和類:

一、DriverManager:主要用於管理JDBC驅動的服務類。在程序中使用該類的主要功能是獲取Connection對象,該類包含以下方法:
  • public static synchronized Connection getConnection(String url, String user, String password)  throws  SQLException:該方法獲取數據庫的鏈接。
二、Connection:表明數據庫鏈接對象,而每個Connection表明一個物理鏈接會話。要想訪問數據庫就必須先得到數據庫的鏈接,不然沒法對數據庫進行操做。常見方法以下:
  • Statement createStatement() throws SQLException:該方法返回一個Statement對象
  • PreparedStatement  prepareStatement(String sql) throws SQLException:該方法返回預編譯的Statement對象,即將SQL語句提交到數據庫進行預編譯。
  • CallableStatement  prepareCall(String sql) throws SQLException:該方法返回CallableStatement對象,該對象用於調用存儲過程。
注:想要執行SQL語句應先獲取Statement對象。
    Connection控制事務的方法:
  • Savepoint  setSavepoint():建立一個保存點
  • Savepoint  setSavepoint(String name):以指定名字來建立一個保存點
  • void setTransactionIsolation(int level):設置事務的隔離級別
  • void rollback():回滾事務
  • void rollback(Savepoint savepoint):將事務保存到指定的保存點
  • void setAutoCommit(boolean autoCommit):關閉自動提交,打開事務
  • void commit():提交事務
三、Statement:用於執行SQL語句的工具接口。該對象既能夠用於執行DDL、DCL語句,也能夠用於執行DML語句,還能夠用於執行SQL查詢。當執行SQL查詢時,返回查詢到的結果集。經常使用方法以下:
  • ResultSet  executeQuery(String sql) throws SQLException:該方法用於執行查詢語句,並返回查詢結果對應的ResultSet對象。該方法只能用於執行查詢語句。
  • int executeUpdate(String sql) throws SQLException:該方法用於執行DML語句,並返回受影響的行數,該方法也可用於執行DDL語句,執行DDL語句將返回0。
  • boolean  execute(String sql) throws SQLException:該方法可執行任何SQL語句。
                    若是執行後第一個結果爲ResultSet對象,則返回true
                     若是執行後第一個結果爲受影響的行數或沒有任何結果,則返回false
四、PreparedStatement:預編譯的Statement對象。PreparedStatement是Statement的子接口,它容許數據庫預編譯SQL語句(這些SQL語句一般帶有參數),之後每次只改變SQL命令的參數,避免數據庫每次都須要編譯SQL語句,故性能更好,實際開發中用的較多。獨有(異於Statement)的方法:
  • void setXxx(int parameterIndex, Xxx value):該方法根據傳入的參數值的類型不一樣,須要使用不一樣的方法。傳入的值根據索引傳給SQL語句中指定位置的參數。
五、ResultSet:結果集對象。該對象包含訪問查詢結果的方法,ResultSet能夠經過列索引或列名稱得到列數據。它包含了以下經常使用的方法來移動記錄指針。
  • void close():釋放ResultSet對象
  • boolean absolute(int row):將結果集的記錄指針移動到第row行,若是row是負數,則移動到倒數第row行。若是移動後的記錄指針指向一條有效記錄,則該方法返回true。
  • void beforeFirst():將ResultSet的記錄指針定位到首行以前,這是ResultSet結果集記錄指針的初始狀態----記錄指針的起始位置位於第一行以前。
  • boolean first():將ResultSet的記錄指針定位到首行。若是移動後的記錄指針指向一條有效記錄,則該方法返回true
  • boolean previous():將ResultSet的記錄指針定義到上一行,若是移動後的記錄指針指向一條有效記錄,則該方法返回true
  • boolean next():將ResultSet的記錄指針定位到下一行,若是移動後的記錄指針指向一條有效記錄,則該方法返回true
  • boolean last():將ResultSet的記錄指針定位到最後一行,若是移動後的記錄指針指向一條有效記錄,則該方法返回true
  • void afterLast():將ResultSet的記錄指針定位到最後一行以後。

2、JDBC的編程步驟

一、加載數據庫驅動,一般採用Class類的forName() 靜態方法來加載驅動。
   
   
   
   
   
  1. //加載Oracle的驅動
  2. Class.forName("oracle.jdbc.driver.OracleDriver");
//加載驅動Class.forName(driverClass); //加載MySQL的驅動Class.forName("com.mysql.jdbc.Driver");
二、經過DriverManager獲取數據庫鏈接:
   
   
   
   
   
//獲取數據庫鏈接DriverManager.getConnection(String url, String user, String password); //MySQL數據庫URL的寫法jdbc:mysql://hostname:port/databasename //Oracle數據庫URL的寫法jdbc:oracle:thin:@hostname:port:databasename
三、經過Connection對象建立Statement對象。建立方法有以下幾個:
  • createStatement():建立基本的Statement對象
  • preparedStatement(String sql):根據傳入的SQL語句建立預編譯的Statement對象
  • preparedCall(String sql):根據傳入的SQL語句建立CallableStatement對象
四、使用Statement執行SQL語句。全部的Statement都有以下三個方法來執行SQL語句
  • execute():能夠執行任何SQL語句,但比較麻煩
  • executeUpdate():主要用於執行DML和DDL語句。執行DML語句返回受SQL語句影響的行數,執行DDL語句返回0
  • executeQuery():只能執行查詢語句,執行後返回表明查詢結果的ResultSet對象
五、操做結果集。
六、釋放數據庫資源,關閉鏈接。
簡單示例:
   
   
   
   
   
package com.sqq.mystudy.JDBC;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JDBCTest { public static void main(String[] args) { try { //一、加載MySQL數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //二、使用DriverManager獲取數據庫鏈接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mytest", "root","pwd" ); //三、使用Connection建立一個Statement對象 Statement stmt = conn.createStatement(); //四、執行SQL語句 ResultSet rs = stmt.executeQuery("SELECT * FROM mtest"); while (rs.next()) { System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t\t" + rs.getString(3)); }            
            rs.close();
            stmt.close();
            conn.close();
} catch (Exception e) { System.out.println(e); } }}
運行結果:
 

3、事務處理

    一、事務
    • 概念:事務是由一步或多步數據庫操做序列組成的邏輯執行單元,這一系列的單元要麼所有執行,要麼所有放棄執行。(程序和事務是兩個不一樣的概念。通常而言,一個程序中可能包含多個事務
    • 事務的特性(4個): 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、和持續性(Durability)。簡稱爲 ACID性
  • MySQL默認關閉事務(若是打開會自動提交),若要開啓MySQL的事務支持,能夠顯示調用以下命令:
         
         
         
         
         
    SET AUTOCOMMIT = {0 | 1} #0爲關閉自動提交,即開啓事務
  • 若是隻想臨時性的開啓事務,能夠使用 start transaction 或者 begin
    二、JDBC的事務支持
    • JDBC鏈接的事務支持由Connection提供,Connection默認打開自動提交,即關閉事務。此時的每條SQL語句一旦執行,便會當即提交到數據庫,永久生效,沒法進行回滾操做; 若是想要關閉,能夠調用Connection的setAutoCommit()方法來關閉自動提交,開啓事務:
            
            
            
            
            
      //關閉自動提交,開啓事務conn.setAutoCommit(false);
    • 此時使用Statement對象執行SQL語句以後,必須調用Connection的commit()方法來手動提交事務:
            
            
            
            
            
      //提交事務conn.commit();
    • 若是有SQL語句執行失敗,此時也能夠使用Connection的rollback()方法來回滾事務:
            
            
            
            
            
      //回滾事務conn.rollback();
    • 簡單的示例:
            
            
            
            
            
      public static void commitTransaction(String[] sqls) { //加載驅動 try { Class.forName(dbPar.getDriver()); Connection conn = null; try { conn = DriverManager.getConnection(dbPar.getUrl(), dbPar.getUser(), dbPar.getPassword()); //關閉自動提交事務 conn.setAutoCommit(false); Statement stmt = conn.createStatement(); for (String sql : sqls) { System.out.println(sql); } //提交事務 conn.commit();                //關閉鏈接                conn.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
相關文章
相關標籤/搜索