本文的環境是Windows10 64位 ,MySQL的版本是MySQL 5.6 ,JDBC最原始的連接方法,雖然做項目的時候,基本可以不寫這些代碼,但是過程還是要知道
JDBC:Java連接MySQL數據庫
步驟:
- 先導入jar包:
*在項目下面創建一個文件libs,把jar包復制進來,注意要右鍵buid path 點擊 add to build path,否則會報錯:java.lang.ClassNotFoundException
*可以在網上下載這個jar包,版本很多
1. 加載數據庫驅動
//加載MySQL的驅動 ,使用反射
Class.forName("com.mysql.jdbc.Driver");
2. 通過DriverManager獲得數據庫連接
//准備工作
String url = "jdbc:mysql://127.0.0.1:3306/students";//url-->MySQL的url
String user = "root";//user-->MySQL的用戶名
String password = "root";//password-->MySQL的密碼
//使用DriverManager獲得數據庫的連接
Connection conn = DriverManager.getConnection(url,user,password);
3. 通過Connection對象創建Statement對象,用於向數據庫發送SQL語句
Statement stmt = conn.createStatement();
4. 向數據庫發送SQL語句
//通過Statement對象得到返回結果
ResultSet rs = stmt.executeQuery("sql語句");//sql為查詢語句
int updateSum = stmt.executeUpdate("sql語句");//sql為增加、修改、刪除語句
5. 操作結果集
//如果執行的是查詢語句,返回ResultSet對象
while(rs.next()){
rs.getString("放列名");
rs.last();
...
}
6. 回收數據庫資源
//關閉,注意順序
rs.close();
stmt.close();
conn.close();
解析:
JDBC的全稱是 Java Database Connectivity,即Java數據庫連接,是一種可以執行SQL語句的Java API。程序可以通過JDBC API 連接到關系數據庫,如MySQL、Oracle、DB2等,並使用結構化查詢語句(數據庫標准查詢語句)來完成對數據庫的查詢、更新等操作。
一、為什么要使用JDBC?
當下有很多不同的數據庫,其內部特性都不相同,如果沒有JDBC,程序員要操作不同的數據庫,就要學習和使用不同的API ,如下示意圖:
后來Sun公司制定了一組標准的API,它只是接口,沒有提供實現類——這些實現類由各數據庫廠商提供實現類,也就是驅動程序。使用了JDBC之后,只要面向JDBC API編程,當用不同的數據庫,更換不同的數據庫驅動就好了,既可以實現跨數據庫,還可以跨平台,而而不需要進行程序的修改,具有非常好的移植性。如下示意圖:
二、JDBC連接過程細節?
1. 加載驅動
加載驅動一般使用Class類的forName()靜態方法來加載驅動,格式為:
Class.forName(driverClass);
加載驅動時並沒有真正的使用數據庫的驅動類,只是使用了數據庫驅動類名的字符串,其中MySQL和Oracle的如下:
MySQL的:Class.forName("com.mysql.jdbc.Driver");
Oracle的:Class.forName("oracle.jdbc.driver.OracleDriver");
2. 通過DriverManager獲得數據庫的連接,得到一個Connection對象
String url = "jdbc:mysql://127.0.0.1:3306/students";
解釋如下:
jdbc:mysql----表示用jdbc連接MySQL數據庫
localhost------表示本機服務器默認地址(127.0.0.1也可以)
3306-----MySQL默認端口號,端口號可以修改
students-----數據庫名字;
root root-----自己數據庫的賬號密碼
DriverManager:是用於管理JDBC驅動的服務類,主要作用是獲得Connection對象,用於連接,源碼如下:
public static Connection getConnection(String url,
java.util.Properties info) throws SQLException {
return (getConnection(url, info, Reflection.getCallerClass()));
}
3. 通過Connection創建Statement對象,得到Statement對象
Connection:代表數據庫連接對象,要訪問數據庫,必須先獲得數據庫的連接,有如下方法:
public interface Connection extends Wrapper, AutoCloseable {
Statement createStatement() throws SQLException;
PreparedStatement prepareStatement(String sql)
throws SQLException;
CallableStatement prepareCall(String sql) throws SQLException;
......
上面三個方法都返回用於執行SQL語句的Statement對象,其中createStatement、prepareStatement是Statement的子類
4. 向數據庫發送SQL語句
Statement:用於執行SQL語句的工具接口。有如下方法:
//只能用於執行查詢語句
ResultSet executeQuery(String sql) throws SQLException;
//執行DML語句,返回受影響的行數;執行DDL語句,返回0
int executeUpdate(String sql) throws SQLException;
//可以執行任何SQL語句,結果為ResultSet,返回true;否則返回false
boolean execute(String sql) throws SQLException;
PrepareStatement:預編譯的Statement對象,是Statement的子接口。
注意:擁有Statement的所有方法,而且性能更好!推薦使用!
5. 操作結果集
ResultSet:結果集對象,是一個接口,包含訪問查詢結果的方法,如下源碼:
public interface ResultSet extends Wrapper, AutoCloseable {
boolean next() throws SQLException;
void close() throws SQLException;
....
}
這些方法都可以通過列索引或者列名獲得數據,有如下方法來移動記錄指針:
void close();釋放ResultSet對象
void afterLast();將ResultSet的記錄指針定位到最后一行
boolean next();將Result的記錄指針定位到下一行,如果移動后指向有效數據,返回true
boolean last();將Result的記錄指針定位到最后行,如果移動后指向有效數據,返回true
......