1. 程式人生 > >怎麼建立JDBC語句物件來執行SQL語句(詳解)

怎麼建立JDBC語句物件來執行SQL語句(詳解)

JDBC執行SQL語句:

一旦獲得了連結,我們可以與資料庫進行互動。JDBC Statement和PreparedStatement 介面定義了使 您能傳送SQL命令並從資料庫 進行接收資料的方法和屬性。

1.Statement:建立語句物件

在使用Statement物件執行SQL語句之前,需要使用Connection物件的createStatement()方法來建立

在建立Statement物件後,可以使用Connection物件的createStatement()方法來執行 一個SQL語句,其中有三個執行方法

其1.boolean execute(String SQL):

如果可以檢索到ResultSet物件,則返回一個布林值true,否則,返回false;使用此方法執行SQL  DDL語句或需要使用真正的動態SQL。

其2.  int executeUpate(String  SQL):返回受SQL語句 影響的行數。使用此方法執行預期會影響多個行的SQL語句,例如 insert、update、或delete語句

其3.Result

關閉Statement物件(如果先關閉Connection物件,她也會關閉Statement物件。但是,應始終顯示關閉Statement物件,以保證正確清理)。

2.SQL 注入

就是通過把SQL命令插入到web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺負伺服器執行惡意的SQL語句。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在web表單輸入(惡意的)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計師意圖去執行SQL語句。比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊。

3.PreparedStatement

該PreparedStatement的介面擴充套件了Statement介面,它提供了一個通用的Statement物件有兩個優點附加功能。此語句可以動態的提供引數。

關閉PreparedStatement物件。

	String string="insert student values(?,?,?)";
			ps=connection.prepareStatement(string);
                        
                        ps.setInt(1,stu.getId());
			ps.setString(2, stu.getName());
			ps.setInt(3, stu.getSid());

JDBC 中的所有引數都由?表示,這被稱為引數標記。在執行SQL語句之前,必須為每個引數提供值。

所述的setXXX()方法將值繫結到所述引數,其中XXX代表要繫結到輸入引數的值的java資料型別。如果忘記提供值,將收到一個SQLException。

每個引數標記的由其順序位置引用,。第一標記表示位置1,下一個位置2等等。該方法與java陣列索引不同,java是從0開始。

4.ResultSet物件:

Result語句是從資料庫中選擇行並在結果集中檢視行的標準方法。該java.sql.ResultSet中的介面表示結果集資料庫查詢。

ResultSet物件維護指向結果集中當前行的遊標。術語“結果集”是指包含在ResultSet物件中的行和列的資料。

如果沒有制定任何ResultSet型別,將自動獲得一個typeforwardonly。

ResultSet.typeforwardonly   游標只能在結果集中向前移動。

ResultSet.typescrollinsensitive    游標可以向前移動和向後移動,結果集對建立結果集後發生的資料庫的其他更改不敏感。

ResultSet.typescrollsensitive    游標可以向前和向後移動,結果集對建立結果集之後發生的其他資料庫的其他更改敏感。

5.JDBC(java  database   Connection)

(1)常用API:

1.DriverManager類

public  static  Connection  getConnection(String url,String user,String  password)

//獲取資料庫連線物件

2.Connection(資料庫連線物件)

//用增來舉例
String string=“insert student  values(?,?,?)”;
PreparedStatement  ps=Connection.PrepareStatement(string);
//將SQL語句通過Connection物件的PrepareStatement方法傳給資料庫

3.PreparedStatement(表示預編譯的SQL語句的物件,使用此物件操作資料庫)

setInt(int ParameterIndex,int x)//將指定引數設定為給定java的int值
//注意:parameterIndex第一個引數是1 
setFloat(int parameterIndex,float x)
setDouble(int parameeterIndex,double x)
int executeUpdate()//執行增、刪、改操作。返回:影響表中記錄的行數
ResultSet  executeQuery()//執行查詢操作 返回:ResultSet結果集
void close()//關閉操作物件

4.ResultSet (表示 結果集的資料表)

boolean next()  //將游標從當前位置向下移一行。ResultSet游標最初位於第一行之前;
                //返回:如果新的當前行有效,則返回true

通過結果集的列標籤獲取值
int getInt(String columnLable)
String getString(String columnLable)
double getDouble(String columnLable)

Class.forName("org.gjt.mm.mysql.driver");//載入驅動程式
  connection =DriverManager,getConnection("url","user","password");
    

5.JDBC操作資料庫的具體步驟:以在student表中增加一列為例

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.mysql.jdbc.Connection;

public class stuUtil {//建立增刪改查
	private static Connection connection=null;
	//該物件表示與資料庫之間的物理連線
	private static PreparedStatement ps=null;//建立一個物件
	
	//建立一個方法專門來獲取連結
	public static Connection getConnection() {
		//先載入驅動
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			//再獲取連結
			connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();//列印報錯資訊
		}
		return connection;
	}
	//增
	public static void Zeng(stu stu) {
		getConnection();//呼叫方法獲取連結
		try {
			String string="insert student values(?,?,?)";
			ps=connection.prepareStatement(string);
			//
			ps.setInt(1,stu.getId());
			ps.setString(2, stu.getName());
			ps.setInt(3, stu.getSid());
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
			} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}	
	//刪
	public static void shan(int tt) {
		getConnection();
		try {
			String string="delete from student where id="+tt;
			ps=connection.prepareStatement(string);
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}
	//改
	public static void Update(int a,int b) {//將a改成b
		getConnection();
		try {
			String string="update student set id="+b+" where sid="+a;
			ps= connection.prepareStatement(string);
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}
	//查
	public static ArrayList<stu> read(){
		getConnection();
		ArrayList<stu> arrayList = new ArrayList<stu>();
		try {
			String string="select * from student";
			ps=connection.prepareStatement(string);
			//查詢
			ResultSet rset = ps.executeQuery();
			while(rset.next()) {
				stu ss=new stu(rset.getInt("id"),rset.getString("name"),rset.getInt("sid"));
				arrayList.add(ss);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
		return arrayList;
	}
	//關閉
	public static void close() {
		if(connection!=null) {
			try {
				connection.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}