mysql-connector-java

mysql-connector-java是一個用於java與mysql連接的jar包驅動程序,目前常用的有5與6兩個版本。
兩個版本的連接方式略有不同,其中6版本的驅動添加了一個必填項參數serverTimezone。

簡單的使用方法爲(6版本):

@Test
public void testMysqlJdbc() throws SQLException {

    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/generic_framework?serverTimezone=UTC&useSSL=false&characterEncoding=UTF8", "root", "root");
    PreparedStatement statement = connection.prepareStatement("select * from t_user t where t.do_id= ? ");
    // PreparedStatement使用參數可以防止sql注入,對特殊字符進行轉義操作,如:("0b12ee3' and 1=1"  -> "0b12ee3\' and 1=1")
    statement.setString(1, "0b12ee3' and 1=1");
    ResultSet resultSet = statement.executeQuery();
    while (resultSet.next()){
        System.out.println(resultSet.getString("do_id"));
    }
    resultSet.close();
    statement.close();
    connection.close();
}

5版本:DriverManager.registerDriver(new com.mysql.jdbc.Driver());
url=jdbc:mysql://localhost:3306/generic_framework?useSSL=false&characterEncoding=UTF8

mysql官方建議使用PreparedStatement,不建議使用Statement。PreparedStatement接口繼承了Statement接口,因此已實現了Statement的全部功能。同時PreparedStatement是預編譯的,因此對於已執行的sql,速度效率明顯優於Statement。最重要的一點,PreparedStatement採用set方式傳入參數值,同時檢查是否有需要轉義的字符,能很好地防止sql注入。
如:Mysql實現的PreparedStatement接口。

package com.mysql.cj.jdbc;
public class PreparedStatement extends com.mysql.cj.jdbc.StatementImpl implements java.sql.PreparedStatement {
    ...
    public void setString(int parameterIndex, String x) throws SQLException {
        ...
        // 檢查mysql-server是否允許反斜槓(默認允許)
        this.connection.isNoBackslashEscapesSet()
        // 檢查是否需要轉義特殊字符
        isEscapeNeededForString(x, stringLength)
        // 轉義後的結果保證不出現sql注入的情況
        ...
    }
    ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章