(java)數據庫(二)JDBC

【JDBC】

     (java Data Base Connectivity, java數據庫連接)是一種用於執行SQL語句的java API,可以爲多種關係數據庫提供統一訪問,是由java語言編寫的類和接口組成。也是java訪問數據庫標準規範

【JDBC 原理】

      java提供訪問數據庫規範稱爲JDBC,而生產廠商提供規範的實現類稱爲驅動JDBC是接口,驅動是接口的實現類

【JDBC操作數據庫步驟】

         (1) 註冊驅動    告知JVM使用的是哪一個數據庫的驅動

         (2) 獲得連接     使用JDBC中的類,來完成對MySQL數據的連接(TCP協議)

         (3) 獲得語句執行平臺    通過連接對象 獲得對SQL語句的執行者對象

                   1、Statement sta = con.createStatement();

                   2、PreparedStatement pst = con.prepareStatement(sql);  避免注入攻擊

         (4) 執行SQL語句     使用執行者對象,向數據庫執行SQL語句    獲取數據庫執行後的結果

                    int    executeUpdate(String sql); 執行 insert、delete、update語句

                    ResultSet  executeQuery (String sql);  執行select語句

         (5) 處理結果    (執行insert、delete、update語句無需處理)

                    ResultSet  實際上是一個二維的表格 ,方法boolean  next()   將光標從當前位置向前移一行,有結果集返回true,沒有結果集返回false。          

         (6) 釋放資源     調用一堆close()

 

【方法executeUpdate】

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;

public class JDBCDemo1 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. 註冊驅動   反射技術  將驅動類加入到內存
		//    使用java.sql.DriverManager靜態方法registerDriver(Driver driver)
		//    Driver 是一個接口,參數傳遞,MySQL程序中的實現類
		//DriverManager.registerDriver(new Driver());  // 驅動類源代碼,註冊2次驅動程序
        // Class.forName()加載一個使用字符串描述的 驅動類(將該類加載到內存中,該類的靜態方法將自動執行)
		Class.forName("com.mysql.jdbc.Driver");
		
		// 2. 獲得數據庫連接  DriverManager工具類  中靜態方法
		//    static connection    getConnection(String url, String user, String password)
		//    返回值是Connection接口的實現類      在mysql驅動程序
		//    url:數據庫地址         jdbc:mysql://數據庫服務器的IP地址:端口號/數據庫名字
		String url = "jdbc:mysql://localhost:3306/mybase1";
		String user = "root";          // 數據庫賬戶
		String password = "123";       // 數據庫密碼
		Connection con = DriverManager.getConnection(url, user, password);
		
		// 3. 獲得語句執行平臺 ,通過數據庫連接對象,獲得SQL語句的執行者對象
		//    con對象調用方法   Statement createStatement()  獲取Statement對象,將SQL語句發送到數據庫
		//    返回值是Statement接口的實現類對象,在mysql驅動程序
		Statement sta = con.createStatement();
		
		// 4. 執行SQL語句         通過執行者對象調用方法  執行SQL語句,獲取結果
		//    int  executeUpdate(String sql)   執行數據庫中SQL語句    僅限於 insert  delete  update
		//    返回int  成功操作數據的行數
		int row = sta.executeUpdate("INSERT INTO sort1(sname,sprice,sdesc) VALUES  ('新能源汽車',30000,'補貼')");
		System.out.println(row);       // 1
		
		// 6. 釋放資源
		sta.close();
		con.close();
	}
}

【方法executeQuery】

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

public class JDBCDemo2 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. 註冊驅動
		Class.forName("com.mysql.jdbc.Driver");
		
		// 2. 獲得數據庫連接
		String url ="jdbc:mysql://localhost:3306/mybase1";
		String user = "root";         // 數據庫賬戶
		String password = "123";      // 數據庫密碼
		Connection con = DriverManager.getConnection(url, user, password);
		
		// 3. 獲得SQL語句執行對象
		Statement stat = con.createStatement();
		
		// 拼寫查詢的SQL語句
		String sql = "SELECT * FROM sort1";
		// 4. 調用執行對象方法,執行SQL語句獲取結果集
		//    ResultSet executeQuery(String sql)  執行SQL語句中的select查詢
		//    返回值ResultSet的接口的實現類對象           實現類在mysql的驅動中
		ResultSet rs = stat.executeQuery(sql);
		
		// 5. 處理結果集
		//    ResultSet 接口方法 boolean next()  有結果集返回true  沒有結果集返回false
		while(rs.next()){
			// 獲取每列數據,使用的是ResultSet接口的方法    getXX方法參數中,建議寫String列名
			System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+" "
			             +rs.getDouble("sprice")+" "+rs.getString("sdesc"));
		}
		
		// 6. 釋放資源
		rs.close();
		stat.close();
		con.close();
	}
}

 

【SQL注入攻擊 用戶登錄案例】

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

/*
 *  SQL注入攻擊 用戶登錄案例
 *      在java程序實現用戶登錄,用戶輸入賬戶和密碼後,到數據庫中檢查賬戶和密碼
 * */
public class JDBCDemo3 {
	public static void main(String[] args) throws Exception  {
		// 1. 註冊驅動
		Class.forName("com.mysql.jdbc.Driver");
		// 2. 獲得數據連接
		String url = "jdbc:mysql://localhost:3306/mybase1";
		String user = "root";       // 數據庫賬戶
		String password = "123";    // 數據庫密碼
		Connection con  = DriverManager.getConnection(url, user, password);
		// 3. 獲得SQL語句執行對象
		Statement stat = con.createStatement();
		
		// 鍵盤輸入 賬戶  密碼
		Scanner sc = new Scanner(System.in);
		String strname = sc.nextLine();
		String strpassword = sc.nextLine();
		
		// 4. 拼寫查詢的SQL語句      執行語句獲得結果集
		//    執行SQL語句,在數據庫中查找用戶名和密碼,若存在,登錄成功;否則登錄失敗
		// 注入攻擊   鍵盤輸入 strname=1   strpassword=2' or '1=1      則會登錄成功
		String sql = "SELECT * FROM user1 WHERE username='"+ strname +"' AND userpassword='"+strpassword+"'";
		
		System.out.println(sql);
		ResultSet rs = stat.executeQuery(sql);
		
		// 5. 處理結果集
		while(rs.next()){
			System.out.println(rs.getString("username")+"  "+rs.getString("userpassword"));
		}
		
		// 6. 釋放資源
		rs.close();
		stat.close();
		con.close();
	}

}

【防止注入攻擊】

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

/*
 *  SQL防止注入攻擊 用戶登錄案例
 *  在java程序實現用戶登錄,在數據庫中檢查賬戶和密碼
 *      
 *  Statement接口實現類,作用:執行SQL語句,返回結果集
 *  Statement的一個子接口PreparedStatement  作用:對SQL語句進行預編譯存儲,多次高效的執行SQL語句     
 *                   PreparedStatement這個接口的實現類 ,在驅動程序中  
 *  Connection數據庫連接對象的方法:
 *             PreparedStatement PreparedStatement(String sql)  
 * */
public class JDBCDemo4 {
	public static void main(String[] args) throws Exception  {
		// 1. 註冊驅動
		Class.forName("com.mysql.jdbc.Driver");
		// 2. 獲得數據連接
		String url = "jdbc:mysql://localhost:3306/mybase1";
		String user = "root";       // 數據庫賬戶
		String password = "123";    // 數據庫密碼
		Connection con  = DriverManager.getConnection(url, user, password);

		// 鍵盤輸入 賬戶  密碼
		Scanner sc = new Scanner(System.in);
		String strname = sc.nextLine();
		String strpassword = sc.nextLine();
		
		//    執行SQL語句,在數據庫中查找用戶名和密碼,若存在,登錄成功;否則登錄失敗
		// 注入攻擊   鍵盤輸入 strname=1   strpassword=2' or '1=1      則會登錄成功
		String sql = "SELECT * FROM user1 WHERE username=? AND userpassword=?";    // SQL語句中的參數全部採用問號佔位符
		// 3. 獲得SQL語句執行對象
		PreparedStatement pst = con.prepareStatement(sql);
		
		// 調用pst對象方法set,設置問號佔位符上的參數
		pst.setObject(1, strname);
		pst.setObject(2, strpassword);
		
		System.out.println(sql);
		
		// 4. 調用方法,執行SQL語句,獲取結果集
		ResultSet rs = pst.executeQuery();
		
		// 5. 處理結果集
		while(rs.next()){
			System.out.println(rs.getString("username")+"  "+rs.getString("userpassword"));
		}
		
		// 6. 釋放資源
		rs.close();
		pst.close();
		con.close();
	}

}

 

【PrepareStatement接口】實現數據表的更新操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/*
 *   使用PreparedStatement接口,實現數據表的更新操作
 * */
public class JDBCDemo5 {
	public static void main(String[] args) throws Exception {
		// 1. 註冊驅動
		Class.forName("com.mysql.jdbc.Driver");
		// 2. 獲得數據連接
		String url = "jdbc:mysql://localhost:3306/mybase1";
		String user = "root";       // 數據庫賬戶
		String password = "123";    // 數據庫密碼
		Connection con  = DriverManager.getConnection(url, user, password);	
		
		// 拼寫修改的SQL語句,參數採用?佔位
		String sql = "UPDATE sort1 SET sname=?,sprice=? WHERE sid=?";
		// 調用數據庫的連接對象con的方法preparedStatement獲取SQL語句的預編譯對象
		PreparedStatement pst = con.prepareStatement(sql);
		// 調用pst對象的setXX方法,設置?佔位
		pst.setObject(1, "羽絨服");
		pst.setObject(2, 2000);
		pst.setObject(3, 8);
		
		// 調用pst的方法執行SQL語句
		pst.executeUpdate();
			
		// 關閉資源
		pst.close();
		con.close();
	}

}

【PreparedStatement接口】實現數據表的查詢操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/*
 *  PrepareStatement接口實現數據表的查詢操作
 * */
public class JDBCDemo6 {
	public static void main(String[] args) throws Exception {
		// 1. 註冊驅動
		Class.forName("com.mysql.jdbc.Driver");
		// 2. 獲得數據連接
		String url = "jdbc:mysql://localhost:3306/mybase1";
		String user = "root";       // 數據庫賬戶
		String password = "123";    // 數據庫密碼
		Connection con  = DriverManager.getConnection(url, user, password);	
		
		String sql = "SELECT * FROM sort1";
		
		PreparedStatement pst = con.prepareStatement(sql);
		
		// 調用pst對象方法,執行查詢語句
		ResultSet rs = pst.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")
					+" "+rs.getString("sdesc"));
		}
		
		rs.close();
		pst.close();
		con.close();
	}

}

 

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