JDBC驅動實現程序與數據庫的連接

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:調用 存儲過程、存儲函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章