連接數據的步驟:
1.註冊驅動 (只做一次)
2.建立連接(Connection)
3.創建執行SQL的語句(Statement)
4.執行語句
5.處理執行結果(ResultSet)
6.釋放資源
註冊驅動:
Class.forName(“com.mysql.jdbc.Driver”);
推薦這種方式,不會對具體的驅動類產生依賴。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。
System.setProperty(“jdbc.drivers”, “driver1:driver2”);
雖然不會對具體的驅動類產生依賴;但註冊不太方便,所以很少使用。
驅動類型(四種類型)
建立連接(Connection):
Connection conn = DriverManager.getConnection(url, user, password);
url格式:
JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
User,password可以用“屬性名=屬性值”方式告訴數據庫;
其他參數如:useUnicode=true&characterEncoding=GBK。
創建執行SQL的語句(Statement):
Statement
Statement st = conn.createStatement();
st.executeQuery(sql);
PreparedStatement
String sql = “select * from table_name where col_name=?”;
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”);
ps.executeQuery();
處理執行結果(ResultSet):
ResultSet rs = statement.executeQuery(sql);
While(rs.next()){
rs.getString(“col_name”);
rs.getInt(“col_name”);
//…
}
釋放資源:
釋放ResultSet, Statement,Connection.
數據庫連接(Connection)是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時正確的關閉將導致系統宕機。Connection的使用原則是儘量晚創建,儘量早的釋放。
CRUD總結:
增、刪、改用Statement.executeUpdate來完成,返回整數(匹配的記錄數),這類操作相對簡單。
查詢用Statement.executeQuery來完成,返回的是ResultSet對象,ResultSet中包含了查詢的結果;查詢相對與增、刪、改要複雜一些,因爲有查詢結果要處理。
SQL注入,PreparedStatement和Statement :
在SQL中包含特殊字符或SQL的關鍵字(如:' or 1 or ')時Statement將出現不可預料的結果(出現異常或查詢的結果不正確),可用PreparedStatement來解決。
PreperedStatement(從Statement擴展而來)相對Statement的優點:
1.沒有SQL注入的問題。
2.Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩衝區溢出。
3.數據庫和驅動可以對PreperedStatement進行優化(只有在相關聯的數據庫連接沒有關閉的情況下有效)。