mysqljdbc入門學習
一、jdbc基本概念
jdbc : Java Database Connectivity
sun公司為了統一對數據庫的操作,定義了一套api,稱之為jdbc
這套api完全由接口組成,我們在編寫程序的時候針對接口進行調用
這些接口交給數據庫廠家去實現, 不同的數據庫廠商會提供不同的實現類,
這些實現類被我們稱作數據庫的驅動。
一流公司定標准
二流公司做服務
三流公司做產品
數據庫驅動交給數據庫廠商制作的優點:
1.Java開發人員只需要維護Java應用和一套統一的規范
2.數據庫廠商提供具體的Java驅動程序,數據庫廠商如果改變了
數據庫底層的實現,數據庫廠商要隨之更新驅動程序,不會影響到
已經完成的Java應用程序。
簡單來說使用Java代碼發送SQL語句的技術,就是jdbc
二、實現jdbc程序的條件
1.需要知道連接數據庫服務器所在地
需要數據庫的IP地址和端口號
ip定位到主機
端口號:定位到程序
2.需要知道數據庫的用戶名和密碼
三、如何實現jdbc連接MySQL數據庫?
1.導入數據庫的驅動程序
mysql-connector-java-5.0.8-bin.jar
2.注冊數據庫的驅動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.建立與mysql數據庫的連接
String url = "jdbc:mysql://localhost:3306/test";//jdbc是主協議,mysql是子協議
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
4.創建用於發送sql語句的 Statement 對象
Statement stmt = conn.createStatement();
5. 編寫SQL語句
String sql = "select * from users";
6.發送sql, 獲得結果集
ResultSet rs = stmt.executeQuery(sql);
7.處理結果集
System.out.println("id | name | password | email | birthday");
while(rs.next()) {
// 有第一行
int id = rs.getInt("id"); // 通過列名取值比較直觀
String name = rs.getString("name");
String psw = rs.getString("password");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
}
8.關閉數據庫連接,最後打開的資源最先釋放,釋放之前需要判斷資源是否已經斷開
rs.close();
stmt.close();
conn.close();
四、jdbc程序詳解
1. 注冊驅動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
上面的語句會導致注冊兩次驅動
原因在於,查看Driver類的源碼會發現在靜態代碼塊中完成了注冊驅動的工作,
也就是說注冊驅動其實很簡單,只需要加載驅動類即可
Class.forName(“com.mysql.jdbc.Driver”);
2. 創建數據庫的連接
Connection conn = DriverManager.getConnection(url, user, password);
其中:
url, 相當於數據庫的訪問地址,程序員通過url指定需要訪問的數據庫
//連接數據庫的url
//jdbc主協議,mysql是子協議
//jdbc協議:數據庫子協議://主機:端口號:/數據庫名
jdbc:mysql:[]//localhost:3306/test?參數名:參數值
其中jdbc為主協議,mysql為子協議,localhost為主機名,3306為端口號,test為數據庫名
url的後面可以跟參數,常用的參數有:user=root&password=root&characterEncoding=UTF-8
如果url地址後面跟了user和password,創建Connection對象時將不必再次傳入值
Connection conn = DriverManager.getConnection(url);
補充說明: 如果訪問的localhost:3306,url 可省寫為jdbc:mysql:///test
3. Connection 對象
Connection對象用於表示與某個數據庫之間的連接,在程序中對數據庫的所有操作都需要通過此對象來完成
常用方法有:
createStatement():創建向數據庫發送sql的statement對象。
prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
prepareCall(sql):創建執行存儲過程的callableStatement對象。
setAutoCommit(boolean autoCommit):設置事務是否自動提交。
commit() :在鏈接上提交事務。
rollback() :在此鏈接上回滾事務。
4. Statement 對象
用於向數據庫發送sql語句
execute(String sql):用於向數據庫發送任意sql語句
executeQuery(String sql) :只能向數據發送查詢語句。(常用)
executeUpdate(String sql):只能向數據庫發送insert、update或delete語句(常用)
addBatch(String sql) :把多條sql語句放到一個批處理中。
executeBatch():向數據庫發送一批sql語句執行。
5. ResultSet 對象
對於查詢操作,該對象特別重要,因為它專門用於封裝結果集
存儲的形式就是一種表格的形式,同樣是列+行,說白了就和我們在 dos 命令行窗口查詢的結果一樣
遍歷方式:
一開始游標指向結果集第一行, 也就是表頭
通過 next 將游標移向下一行, 如果沒有下一行,該方法會返回false
獲得當前行的數據需要調用get方法:
get(int index)獲得第幾列 列數從1開始
get(String columnName) 根據列名獲得值 常用
注意:數據庫的數據類型與java中數據類型的對應關系
ResultSet對象的常用方法
next():移動到下一行
previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最後面。
6. 釋放數據庫資源
因為數據允許的並發訪問連接數量往往都比較有限,使用完成後,需要釋放資源
在java程序中,我們應該將最終必須要執行的代碼放到finally當中
釋放資源的代碼
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
7. 防止 sql 注入
在 service 層進行邏輯判斷
使用PreparedStatement對象
package cn.test.jdbc.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Properties;
import com.mysql.jdbc.Driver;
public class JDBCDemo {
//連接數據庫的url的寫法
//jdbc主協議,mysql是子協議
//jdbc協議:數據庫子協議://主機:端口號:/數據庫名
private String url="jdbc:mysql://localhost:3306/day15";
//用戶名
String username = "root";
//密碼
String password = "Name-66437";
@Test
public void main(String [] args) throws SQLException{
//1.創建一個驅動程序的類對象
Driver driver = new com.mysql.jdbc.Driver();
//設置用戶名和密碼
Properties props = new Properties();
props.setProperty("username", username);
props.setProperty("password", password);
//2.連接數據庫
Connection conn = driver.connect(url, props);
Statement stmt = conn.createStatement();
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
//7.處理結果集
System.out.println("id | name | password | email | birthday");
while(rs.next()) {
// 有第一行
int id = rs.getInt("id"); // 通過列名取值比較直觀
String name = rs.getString("name");
String psw = rs.getString("password");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
}
//釋放資源的代碼
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}