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注入的情況
...
}
...
}