JDBC是Java程序訪問數據庫的標準,由一組Java語言編寫的類和接口組成,這些類和接口稱爲JDBC API
JDBC API包括兩個包:
- java.sql包:基本的數據庫編程服務的類和接口建立與數據庫的連接
- javax.sql包:主要提供了服務器端訪問和處理數據源的類和接口
JDBC的基本功能包括:
- 建立與數據庫的連接
- 發送SQL語句
- 處理數據庫操作結果
JDBC(Java DataBase Connectivity) 驅動可以爲多種關係型數據庫DBMS 提供統一的訪問方式,用Java來操作數據庫
涉及知識點,下面實例要用
數據庫驅動:
DB | 驅動(jar包) | 具體驅動類 | 連接字符串 |
---|---|---|---|
MySQL | mysql-connector-java-x.jar | com.mysql.jdbc.Driver | jdbc:mysql://localhost:3306/數據庫實例名 |
SqlServer | sqljdbc-x.jar | com.microsoft.sqlserver.jdbc.SQLServerDriver | bc:microsoft:sqlserver:localhost:1433;databasename=數據庫實例名 |
Oracle | ojdbc-x.jar | oracle.jdbc.OracleDriver | jdbc:oracle:thin:@localhost:1521:數據庫實例名 |
使用JDBC操作數據庫時,如果對數據庫進行了更換,只需要替換:驅動、具體驅動類、連接字符串、DB實例名、用戶名、密碼
驅動包可以去中央倉庫maven下載:https://mvnrepository.com/
Statement操作數據庫:
- 增刪改:executeUpdate()
- 查詢:executeQuery()
JDBC API:https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html
JDBC驅動建立與數據庫的連接流程:
- 導相應數據庫的驅動:jar包
- 反射class.forName()加載具體的驅動類
- DriverManager.getConnection()管理JDBC驅動並與數據庫建立連接
- Statement(PreparedStatement/createStatement/CallableStatement)獲取操作數據庫的對象
- Statement操作數據庫: (增刪改/查)處理結果集
- 關閉建立的對象
下面以MySQL數據庫爲例,與Java建立連接
準備一個mysql數據庫:SYMYSQL
並建立一張表:student
下方案例用CMD操作DB,啓動mysql,也可以在電腦“服務”中啓動
Java程序
com.demo包下的JDBCPreparedStatementDemo.java
package com.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JDBCPreparedStatementDemo {
private static final String URL = "jdbc:mysql://localhost:3306/SYMYSQL"; //mysql連接字符串,數據庫名爲SYMYSQL
private static final String USERNAME = "root"; //數據庫用戶名爲root
private static final String PWD = "root"; //數據庫密碼爲root
// 增刪改
public static void update() {
Connection connection = null;
PreparedStatement pstmt = null;
try {
// a.導入驅動,加載具體的驅動類
Class.forName("com.mysql.jdbc.Driver"); // 加載mysql具體的驅動類
// b.與數據庫建立連接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
/*
// Statement
stmt = connection.createStatement();
String sql = "insert into student values(8,'suoyue',56)"; //DB插入語句
//String sql = "update student set stu_Score='66' where stu_Num=8"; //DB更新語句
//String sql = "delete from student where stu_Num=8"; //DB刪除語句
int count = stmt.executeUpdate(sql); // 返回值表示 增刪改 幾條數據
*/
// PreparedStatement
String sql = "insert into student values(?,?,?)"; //數據庫插入語句
//String sql = "update student set stu_Score=? where stu_Num=?"; //DB更新語句
//String sql = "delete from student where stu_Num=?"; //DB刪除語句
pstmt = connection.prepareStatement(sql); //預編譯
//賦值操作:配置佔位符數據[8,"suoyu",56]
pstmt.setInt(1, 8);
pstmt.setString(2, "suoyu");
pstmt.setInt(3, 56);
int count = pstmt.executeUpdate(); // 增刪改,成功返回:1,失敗返回:0
// d.處理結果
if (count > 0) {
System.out.println("操作成功");
}
} catch (ClassNotFoundException e) { //Class.forName() 拋出ClassNotFoundException異常
e.printStackTrace();
} catch (SQLException e) { //其餘方法全部拋SQLException異常
e.printStackTrace();
} catch (Exception e) { //保險起見,只要有異常就再拋個Exception異常
e.printStackTrace();
} finally {
try {
if (pstmt != null) //先判斷不爲空再進行關閉操作,避免異常
pstmt.close();
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
//查
public static void query() {
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
......
String sql = "select count(*) from login where stu_Num= ? and stu_Name =?";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 8);
pstmt.setString(2, "suoyue");
rs = pstmt.executeQuery(); // 執行SQL(增刪改executeUpdate(),查詢executeQuery())
int count = -1;
if (rs.next()) { //next()光標下移,判斷是否有下一條數據;true/false
count = rs.getInt(1); //getXxx(字段名|位置):獲取具體的字段值
}
if (count > 0) {
System.out.println("查找成功");
} else {
System.out.println("查找失敗");
}
}
......
}
*/
public static void main(String[] args) {
update() ;
// query();
}
}
在PreparedStatement與createStatement的使用中推薦使用前者,原因如下:
- 編碼更加簡便(避免了字符串的拼接)
- 提高性能(因爲 有預編譯操作,預編譯只需要執行一次)
- 安全(可以有效防止sql注入)
CallableStatement:調用 存儲過程、存儲函數