5_MySQL數據庫四JDBC(數據庫驅動的配置入門)

JDBC (一)

第一大塊 JDBC概述

一、JDBC概述

  • a.概念:Java DataBase Connectivity Java數據庫連接,Java語言操作數據庫
  • b.JDBK本質:其實是官方(sun公司)定義的一套操作所有關係型數據的規則,即接口。

各個數據庫廠商去實現這套接口,提供數據庫驅動jar包。我們可以使用
這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類。

  • c.快速入門:學會如何導入JDBC的jar包,也就是安裝驅動。
  • d.簡單介紹一下JDBC需要使用的對象

DriverManager對象:驅動管理對象
Connection:數據庫連接對象
Statement:執行sql對象(使用靜態的SQL)
ResultSet:結果集對象
PreparedStatemet:執行sql的對象(預編譯的SQL)

第二大塊 詳解各個對象

一、DriverManager類 java.sql.DriverManager

  • a.功能:1.註冊驅動 2.獲取數據連接
  • b.方法:

static void registerDriver(Driver driver) 註冊給定的驅動程序 實現通過 Class.forName(“com.mysql.jdbc.Driver”);因爲這樣註冊驅動比較方便,直接在穿件類對象時執行靜態代碼塊註冊驅動
Connection getConnection(String url,String user,String password); 獲取數據庫連接
注意:url 指定連接的路徑 語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱 其實種數據庫使用用的url語法是不一樣的
如果連接的是本機的mysql服務器,並且默認端口是3306,則url可以寫爲jdbc:mysql:///數據庫名稱
說明:這裏其實在參數url中已經是包含了一個數據庫的精確的位置信息了,有數據庫種類、數據庫所在主機的IP地址、數據庫的端口號、你要適用的數據庫
接着的兩個參數其實就是用戶的信息了,一個註冊了的用戶可以連接這個數據庫。

二、Connection接口 java.sql.Connection

  • a.功能:1.獲取sql對象 2.管理事務
  • b.方法:

Statement creteStatement()
PreparedStatement prepareStatement(String sql)
void setAutoCommit(boolean autoCommit) false就是開啓事務
void commit()
void rollback()

三、Statement接口

  • a.功能
  • b.方法:

boolean execute(String sql) :可以執行任意的sql 瞭解
int executeUpdate(String sql) :執行DML(insert、update、delete)語句、DDL(create,alter、drop)語句
返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功 返回值>0的則執行成功,反之,則失敗。
ResultSet executeQuery(String sql) :執行DQL(select)語句
返回值:結果集對象

四、ResultSet接口

  • a.功能:
  • b.方法:
  • boolean next(): 遊標向下移動一行,判斷當前行是否是最後一行末尾(是否有數據),如果是,則返回false,如果不是則返回true
  • getXxx(參數):獲取數據
  • Xxx:代表數據類型 如: int getInt() , String getString()
  • 參數:
  1. int:代表列的編號,從1開始 如: getString(1)
  2. String:代表列名稱。 如: getDouble(“balance”)

第三大塊 創建自己的工具類JDBCUtil

一、示例展示:實現了數據庫安裝驅動,建立與數據庫連接,數據庫資源釋放的操作

/*
由於每次對mysql進行操作時都會對一部分繁瑣的代碼進行操作
    所以特地創建這個工具類,方便了對數據操作
      1.安裝驅動
      2.建立和數據庫的連接 DriverManager
      3.關閉相關資源  Statement Connection ResultSet
 */
public class JDBCUtil {
    //配置文件的內容,一是數據庫連接字段;二是驅動安裝字段;
    public static String url,user,password;
    public static String driver;

    static {
        try {
            //第一步獲取配置文件信息
            Properties pro = new Properties();
            ClassLoader classLoader = JDBCUtil.class.getClassLoader();
            //這裏需自己新建配置文件,後綴是.properties
            URL res = classLoader.getResource("JDBCpeizhi.properties");
            String path = res.getPath();
            System.out.println(path);
            pro.load(new FileReader(path));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //第二步:安裝驅動
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//獲取數據庫連接,由配置文件決定
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
//關閉數據庫相關資源,有一個是方法的重載
    public static void close(Statement stm, Connection con) {
        if (stm != null) {
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Statement stm, Connection con, ResultSet rs) {
        if (stm != null) {
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

三、示例說明解釋

  • a.說明創建一個工具類的要點

1.創建的成員基本都是靜態的,方便直接調用
2.靜態代碼塊是一個很好的選擇

  • b.在JDBC工具類中用到的額外方法(參考示例中的實際使用)

1.ClssLoader getClassLoader() 獲取類加載器
2.URL getResource(String name) 參數:文件名,需要添加後綴 獲取文件鏈接
3.String getPath() 獲取完整路徑
3.void load(FileReader reader) 讀取配置文件信息到Peoperties集合中
4.Sting getProperties(Sting name) 參數:配合文件中的鍵 key 返回相應的值

  • c.配置文件的方法與步驟說明

注意點:配置文件通常不傳遞絕對路徑,絕對路徑不方便代碼的移植。
步驟:1.獲取Properties集合 2.通過當前所在類的類對象獲取類加載器 3.獲取配置文件路徑
4.將配置文件中的數據讀取到Properties集合中 5.通過集合獲取對應的數據
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
URL res = classLoader.getResource(“JDBCpeizhi.properties”);
String path = res.getPath(); //獲取絕對路徑
pro.load(new FileReader(path));
url = pro.getProperty(“url”);

第四大塊 PrepareStatement接口

一、用PreparedStatement接口解決SQL出現的問題(注入問題)

  • a.SQL注入問題:在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接。會造成安全性問題
  1. 輸入用戶隨便,輸入密碼:a’ or ‘a’ = 'a
  2. sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
  • b.設置通配符 ? 的參數 參數1是?的位置 || 參數2是需要對?設置的值

void setXxx(int station,參數2)

  • c.執行DQL的方法同時獲取ResultSet對象

ResultSet executeQuery()
說明:執行sql查詢操作時,接受返回結果,不需要傳遞sql語句 //也就是在創建ResultSet對象時不需要進行傳遞參數,而Statement對象創建時需要在方法中傳遞參數;這是因爲在創建prepareStatement對象時已經將SQL語句傳遞進來了

方法總結:按照使用的各個對象來說明了

說明:這裏其實是有這麼一個邏輯,1.安裝驅動

2.與數據庫建立連接(此時已經連接到了數據中對應的表中)
3.獲取數據庫執行對象
4.獲取數據庫結果集對象

一、DriverManager

  • a.註冊驅動

Class.forName(“com.mysql.jdbc.Driver”); static void registerDriver(Driver driver)

  • b. 獲取Connection對象(數據庫連接對象)

Connection getConnection(String url,String user,String password);

二、Connection

  • a.獲取sql對象(這裏注意一下兩個sql對象的獲取方式的特點)

Statement createStatement()
PrepareStatement prepareStatement(String sql)

  • b.事務管理方法

void setAutoCommit(boolean autoCommit)
void commit()
void rollback()

三、Statement

  • a.執行DML、DDL的方法

int executeUpdate(String sql)

  • b.執行DQL的方法同時獲取ResultSet對象,但是查看結果需要通過ResultSet對象

ResultSet executeQuery(String sql)

四、PrepareStatement

  • a.設置通配符 ? 的參數 參數1是?的位置 || 參數2是需要對?設置的值

void setXxx(int station,參數2)

  • b.執行DQL的方法同時獲取ResultSet對象,雖然說這個通過PrepareStatement的方法創建ResultSet對象不需要傳遞參數,但是在創建PrepareStatement對象時傳遞的參數決定了是否可以調用這個無參方法。

ResultSet executeQuery()

  • c.執行DML、DDL的方法

int executeUpdate()

五、Result

  • a.移動遊標:遊標從表頭行開始

boolean next()

  • b.獲取數據

T getXxx(多種參數)

說的通熟一點,我對這些方法的認識就是

選擇一個數據庫並且登錄這個數據庫,選這一張表,兩種sql對象對錶進行增刪改,之後sql對象把增刪改之後的表傳遞給查詢對象ResultSet來查詢表中記錄。

補充知識點:

1.靜態SQL:類似於Statement對象穿的sql語句時的動作,字符串在java程序中事先拼接好在傳遞到數據庫中去執行,會引發很多問題。

2.預編譯SQL:類似於PrepareStatement對象,字符串沒有拼接好之前就把字符串傳遞到MySQL數據庫中,之後再傳遞參數。

3.佔位符?這邊要說明一下,佔位符只能用來替代參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章