JDBC簡述(mysql)

JDBC的簡介

簡介
  • JDBC(Java Database Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用java語言編寫的類和接口組成
  • JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序
  • JDBC可以在各種平臺上使用Java,如Windows,Mac OS和各種版本的UNIX
  • JDBC庫包括與數據庫使用相關的API
    • 連接數據庫
    • 創建SQL或MYSQL語句
    • 在數據庫中執行SQL或MYSQL查詢
    • 查看和修改生成的記錄
JDBC體系結構
  • JDBC API支持用於數據庫訪問的兩層和三層處理模型,但通常,JDBC體系結構由兩層組成:
    • JDBC:提供了應用程序到數據庫連接規範
    • JDBC驅動程序:連接數據庫的驅動程序的實現
      alt
JDBC核心組件
  • DriverManager:此類管理數據庫驅動程序列表,使用通信協議將來自java應用程序的連接請求與適當的數據庫驅動程序匹配。
  • Driver:此接口處理與數據庫服務器的通信,我們很少會直接與Driver對象進行交互,而是使用DriverManager對象來管理這種類型的對象
  • Connection:該接口具有用於連接數據庫的所有方法,連接對象表示上下文,數據庫的所有通信僅通過連接對象
  • Statement:使用從此接口創建的對象將SQL語句提交到數據庫,除了執行存儲過程之位,一些派生接口還接受參數
  • ResultSet:在使用Statement對象執行SQL查詢後,這些對象保存從數據庫檢索的數據。它作爲一個迭代器,允許我們移動其數據
  • SQLException:此類處理數據庫應用程序中發生的任何異常
JDBC使用步驟
  • 構建JDBC應用程序涉及以下六個步驟:
導入JDBC驅動包:需要下載包含數據可編程所需的JDBC的jar包(mysql的jar包:mysql-connector-java-5.1.48.jar)
註冊JDBC驅動程序:要求您初始化驅動程序,以便您可以打開與數據庫的通信通道
創建連接:需要使用DriverManager.getConnection()方法創建一個Connection對象,該對象表示與數據庫的物理連接
執行查詢:需要使用類型爲Statement的對象來構建和提交SQL語句到數據庫
從結果集中提取數據:需要使用相應的ResultSet.getXXX()方法從結果集中集中檢索數據
釋放資源:需要明確的關閉所有數據庫資源,而不依賴於JVM的垃圾收集
  • 用eclipse,建議導入jar包,在項目下創建lib目錄,把mysql的jdbc的jar包放入此目錄,並添加到build path中(idea不同)
註冊驅動
  • 第一種方式:是使用靜態DriverManager.registerDriver()方法。
package waking.test.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.Driver;

/**
 * JDBC連接註冊驅動
 * @author waking
 *
 */
public class Demo01 {
	public static void main(String[] args) {
		try {
			//創建Driver對象
			Driver driver = new Driver();
			//使用靜態DriverManager.registerDriver()方法
			DriverManager.registerDriver(driver);
			System.out.println("註冊驅動成功、、、");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("註冊驅動異常、、、、");
		}
		
	}
}
  • 第二種方式:Class.forName():註冊驅動程序最常見的方法是使用Java的Class.forName()方法,將驅動程序的類文件動態加載到內
    存中,並將其自動註冊
package waking.test.jdbc;
/**
 * 註冊驅動(建議使用)
 * @author waking
 *
 */
public class Demo02 {
	public static void main(String[] args) {
		try {
			//使用Class.forName()
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("註冊成功、、、");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("註冊異常、、、");
		}
	}
}
  • 第三種方式:什麼都不寫,程序會自動加載驅動(不建議使用)
獲取連接
  • 加載驅動程序後,可以使用DriverManager.getConnection()方法建立連接。
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url,String user, String Password)
String URL  ="jdbc:mysql://localhost:3306/csdn";
//csdn是數據庫名,localhost是代表本機,3306,是端口號
String USER  ="root";
//mysql數據庫用戶名
String PASS =  "123456"
//mysql數據庫密碼
//獲取連接
Connection conn  = DriverManager.getConnection(URL,USER,PASS);
執行sql語句
  • 一旦獲得了連接,就可以與數據庫交互,JDBC Statement和PreparedStatement接口定義了能夠發送SQL命令並從數據庫接收數據的方法和屬性。

接口 使用
Statement 用於對數據庫進行通用訪問。在運行時使用靜態SQL語句時很有用。注:Statement接口不能接收參數
PreparedStatement 推薦使用,多次使用SQL語句時使用,PrepareStatement接口在運行時接受輸入參數
  • 執行方法

方法名 說明
boolean execute(String SQL) 如果可以檢索到ResultSet對象,則返回一個布爾值true,否則返回false。使用此方法執行SQL DDL語句或需要使用真正的動態SQL時
int executeUpdate(String SQL) 返回SQL語句執行影響行數,使用此方法執行預期會影響多個行的SQL語句,列如:insert,update,delete語句
ResultSet executeQuery(String SQL) 返回一個ResultSet對象,使用select語句
  • 關閉連接
就像IO流一樣,JDBC中的方法也要關閉連接,通常關閉順序
ResultSet--->statement/preparedStatement-->Connection

CRUD操作

查詢(select)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * JDBC連接數據庫
 *查詢csdn數據庫中user表
 * @author waking
 *
 */
public class Demo03 {
	public static void main(String[] args) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "select * from user";
			
			rs = stmt.executeQuery(sql);
			
			//解析結果
			while(rs.next()) {
				int userId = rs.getInt("userId");
				String username = rs.getString("username");
				String pword = rs.getString("password");
				String address = rs.getString("address");
				String phone = rs.getString("phone");
				System.out.println("userId:"+userId+"username:"+username+"pword:"+pword+"address:"+address+"phone:"+phone);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
插入(insert)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC連接數據庫insert操作
 * @author waking
 *
 */
public class Demo04 {
	public static void main(String[] args) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "insert into user values(5,'waking','waking','haha','17273934784')";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影響"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
更新(update)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC連接數據庫update操作
 * @author waking
 *
 */
public class Demo05 {
	public static void main(String[] args) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "update user set password = '123456' where userId=5";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影響"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
刪除(delete)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC連接數據庫delete操作
 * @author waking
 *
 */
public class Demo06 {
	public static void main(String[] args) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "delete from user where userId = 5";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影響"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
用戶登錄註冊
  • 用戶登錄案例是開放人員最常用的操作,以下實現簡單的登錄註冊
  • 註冊
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * 用戶註冊
 * @author waking
 *
 */
public class Demo07 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("請您註冊、、");
		System.out.println("請您輸入姓名");
		String username = sc.nextLine();
		System.out.println("請輸入密碼、、、");
		String pword = sc.nextLine();
		System.out.println("請輸入地址、、、");
		String address = sc.nextLine();
		System.out.println("請輸入手機號碼、、、");
		String phone = sc.nextLine();
		register(username, pword, address, phone);
		
	}
	public static void register(String username,String pword,String address,String phone) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "insert into user(username,password,address,phone) values('"+username+"','"+pword+"','"+address+"','"+phone+"')";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影響"+row+"行");
			System.out.println("註冊成功、、、");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
  • 登錄
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * 登錄
 * @author waking
 *
 */
public class Demo08 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("請登錄、、、");
		System.out.println("請輸入用戶名、、、");
		String username = sc.nextLine();
		System.out.println("請輸入密碼");
		String pword = sc.nextLine();
		login(username, pword);
		
	}
	public static void login(String username,String pword) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//聲明連接
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs =null;
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			stmt = conn.createStatement();
			//返回結果
			//sql語句
			String sql = "select * from user where "+"username='"+username+"' and "+"password='"+pword+"'";
			
			rs= stmt.executeQuery(sql);
			if(rs!=null) {
				System.out.println("登錄成功、、、");
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
	}
}
SQL注入
  • 以上的用法有安全問題(SQL注入)
  • 就是通過把SQL命令插入到web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令
  • 具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
  • 例子:
SELECT * FROM USER WHERE username='waking' AND PASSWORD='wakingwdr' OR '1'='1'; 
#後面or ‘1’=‘1’恆成立
  • 解決辦法:使用PreparedStatement
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 *  登錄-解決SQL注入
 * @author waking
 *
 */
public class Demo09 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("請登錄、、、");
		System.out.println("請輸入用戶名、、、");
		String username = sc.nextLine();
		System.out.println("請輸入密碼");
		String pword = sc.nextLine();
		login(username, pword);
		
	}
	public static void login(String username,String pword) {
		//驅動
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		//sql語句
		String sql = "select * from user where username = ? and password = ?";
		
		//聲明連接
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs =null;
		try {
			//加載驅動
			Class.forName(dirver);
			//創建連接
			conn = DriverManager.getConnection(url, user, password);
			//查詢
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, username);
			pstmt.setString(2, pword);
			
			//返回結果
			rs = pstmt.executeQuery();
		
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉連接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(pstmt!=null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					System.out.println("登錄成功、、、");
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
	}
}

  • 通常會把JDBC的方法封裝,這裏就不封裝了
下一篇會介紹JDBC和mysql的事務問題,以及批處理問題,感謝您的觀看
發佈了19 篇原創文章 · 獲贊 19 · 訪問量 5640
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章