1. 程式人生 > >MySQL筆記-執行SQL語句的幾種方式

MySQL筆記-執行SQL語句的幾種方式

一、基本介面或類

——>DriverManager:用於管理JDBC驅動的服務類。主要功能是獲取Connection物件。

——>Connection:代表資料庫連線物件,每個Connection代表一個物理連線會話。

——>Statement:用於執行SQL語句的工具介面。常用方法:

1、ResultSet  executeQuery(String sql)throws SQLException:專用於查詢。

2、int  executeUpdate(String sql)throws SQLException:執行DDL、DML語句,前者返回0,後者返回受影響行數。

3、boolean execute(String sql)throws SQLException:可執行任何SQL 語句。如果執行後第一個結果為ResultSet(即執行了查詢語句),則返回true;如果執行了DDL、DML語句,則返回false。返回結果為true,則隨後可通過該Statement物件的getResultSet()方法獲取結果集物件(ResultSet型別),返回結果為false,則可通過Statement物件的getUpdateCount()方法獲得受影響的行數。

——>PrepareStatement:為Statement的子介面,可預編譯SQL 語句,常用語執行多條結構相同,僅值不同的SQL 語句,見下例。同樣具有Statement物件常用的三個方法,但用法不同,因為已經預編譯了SQL 月,所以無需再在方法中寫sql語句,只需setString方法設定引數值即可,如程式碼中。

使用PreparedStatement比使用Statement多了三個好處:

1、PreparedStatement預編譯SQL語句,效能更好,執行更快。

2、PreparedStatement無須“拼接”SQL 語句,程式設計更簡單。

3、PreparedStatement可以防止SQL 注入(如將輸入的true當成直接量,導致判斷直接通過,從而降低了安全性),安全性更好。

二、實踐

說明:此實踐主要用於熟悉JDBC 程式設計步驟,理解三種執行SQL語句的一些區別。

目錄結構:


java檔案:

execute.java:

說明:execute方法可執行所有SQL 語句。學習了一個新的方法:ResultSet物件的getMetaData()方法,該方法返回結果集的列相關的資訊,如列數目、列型別等。

package executeSqlWays;

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

/**
 * @author Administrator
 * execute is a way that can execute any SQL.
 */
public class execute {
	public void executeSqlWithExecute(String sql) throws Exception{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbctest","root","1234");
			Statement statem=conn.createStatement();
			boolean hasResultSet=statem.execute(sql);
			//如果執行的為查詢語句,列印結果
			if(hasResultSet){
				try{
					ResultSet rs=statem.getResultSet();
					//getMetaData返回資料庫的columns的資訊:number、types、properties。
					ResultSetMetaData rsMD=rs.getMetaData();
					int number=rsMD.getColumnCount();
					for(int numb=1;numb<=number;numb++){
						System.out.print(rsMD.getColumnName(numb)+'\t');
					}
					System.out.println(" ");
					while(rs.next()){
						for(int numb=1;numb<=number;numb++){
							System.out.print(rs.getString(numb)+'\t');
						}
					}
				}catch(Exception e){
					System.out.println("execute 返回結果集失敗:");
					e.printStackTrace();
				}
			}
			//如果執行的為DDL、DML語句,返回受影響的的記錄條數
			else{
				System.out.println("該execute方法執行sql影響的記錄數為"+statem.getUpdateCount()+"條");
			}
		}catch(Exception e){
			System.out.print("execute 方法失敗:");
			e.printStackTrace();
		}
	}
}

executeUpdate.java:

說明:executeUpdate方法主要用於執行DDL、DML語句。

/**package executeSqlWays includes some different ways to execute SQL.
 */
package executeSqlWays;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
 * class executeUpdate is a way to execute SQL in java8.
 */
public class executeUpdate {
	/*executeUpdate主要用來執行DDL、DML語句*/
	public void executeSqlWithExecuteUpdate(String sql) throws Exception{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbctest","root","1234");
			Statement statem=conn.createStatement();
			//execute SQL
			statem.executeUpdate(sql);
		}catch(Exception e){
			System.out.print("載入驅動失敗:");
			e.printStackTrace();
		}
	}
}
prepareStatement.java:

說明:1)表operation3為在命令列建立的。此處只使用了DML 語句,能否使用DDL 等其它語句沒多做探究。

2)、PreparedStatement物件的本質是先編譯基本SQL 語句結構,對不確定的引數值用?號代替,之後插入值時使用該物件的setString(int index,String value)等方法設定具體值,再呼叫不帶引數的execute、executeUpdate、executeQuery等方法執行。實踐發現,其中index指不確定值?的索引,從1開始,若預編譯的SQL 指令為:

insert into tableName (column1,column2,column3)values(?,null,?);

則此方法插入一條記錄時應為:

pstatem.setString(1,value1);//設定第一個?的值

pstatem.setString(2,value2);//設定第二個?的值

executeUpdate();       //必須,真正的執行。

注意:佔位符?引數只能代替普通值,不能代替表名、列名等資料庫物件,更不能代替insert等關鍵字!

package executeSqlWays;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/**
 * @author Administrator
 * PreparedStatement是statement的子介面,可以預編譯SQL語句,預編譯後的SQL語句被儲存在PreparedStatement
 * 物件中,然後可以使用該物件高效地執行該語句。常用於執行結構相似的多條SQL語句。
 */
public class prepareStatement {
	public void executeSqlWithPrepareStatement() throws Exception{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbctest","root","1234");
			//關鍵區別:獲取statement物件的方法不同。?號表示此值是一個變化的值,通過方法設定。
			PreparedStatement pstatem=conn.prepareStatement(
					"insert into operation3 values(null,?);");
			//執行 SQL
			pstatem.setString(1,"第一行" );
			pstatem.executeUpdate();
			pstatem.setString(1,"第二行");
			pstatem.executeUpdate();
		}catch(Exception e){
			System.out.print("載入驅動失敗:");
			e.printStackTrace();
		}
	}
}

MySQLOperation.java:

說明:主函式分別使用execute、executeUpdate方法建立表operation1、operation2且插入一條記錄。PreparedStatement方法對命令列建立的表operation3進行插入記錄操作。

package mysqlOperation;

import executeSqlWays.executeUpdate;
import executeSqlWays.execute;
import executeSqlWays.prepareStatement;

public class MySQLOperation {
	/*分別使用executeUpdate、execute、preparedStatement方法執行SQL語句*/
	public static void main(String[] args) {
		/*executeUpdate方法*/
		executeUpdate operation1=new executeUpdate();
		try {
			operation1.executeSqlWithExecuteUpdate("create table operation1("
					+ "id int auto_increment primary key,"
					+ "name varchar(40) not null);");
			operation1.executeSqlWithExecuteUpdate("insert into operation1(name)"
					+ "values('executeUpdate建立表並插入該行資料');");
		} catch (Exception e) {
			System.out.print("opertation1錯誤:");
			e.printStackTrace();
		}
		/*execute方法*/
		execute operation2=new execute();
		try{
			operation2.executeSqlWithExecute("create table operation2("
					+ "id int auto_increment primary key,"
					+ "name varchar(40) not null);");
			operation2.executeSqlWithExecute("insert into operation2(name)"
					+ "values('execute方法建立表並插入該行資料');");
			operation2.executeSqlWithExecute("select * from operation2;");
		} catch(Exception e){
			System.out.print("operation2錯誤:");
			e.printStackTrace();
		}
		/*prepareStatement方法。通過命令列建立表operation3後,使用該方法插入資料。*/
		prepareStatement operation3=new prepareStatement();
		try{
			operation3.executeSqlWithPrepareStatement();
		} catch(Exception e){
			System.out.println("PreparedStatement方法失敗:");
			e.printStackTrace();
		}
	}
}

結果:

execute方法在eclipse中輸出結果:


三種方法在資料庫中的結果: