1. 程式人生 > 其它 >《ngx底層設計和原始碼分析》—— 限流模組

《ngx底層設計和原始碼分析》—— 限流模組

一、Statement

(1)Connection 是資料庫連線的代表物件,要執行SOL 的話,必須取得java.sql.Statement 操作物件,它是 SQL 描述的代表物件。可以使用Connection的createStatement()建立Statement物件:

Statement stmt =conn.createStatement();

取得Statement物件之後,可以使用executeUpdate() , executeQuery()等方法來執行SQL.executeUpdate()主要用來執行CREATE TABLE、工NSERT、DROP TABLE
ALTER TABLE等會改變資料庫內容的SQL。
(2)Statement 的executeQuery()方法用於SELECT 等查詢資料庫的SQL,executeUpdate()會返回int結果,表示資料變動的筆數,executeQuery()會返回java.sql.ResultSet物件,代表查詢結果,查詢結果會是一筆一筆的資料。可以使用Resultset的next()移動至下一筆資料,它會返回true 或false表示是否有下一筆資料,接著可以使用get×××()取得資料,如getString()、getInt()、getFloat()、getDouble()等方法,分別取得相對應的欄位型別資料。getx××()方法都提供有依域名取得資料,或是依欄位順序取得資料的方法。
(3)Statement的execute()可以用來執行SQL,並可以測試SQL 是執行查詢或更新,返回true表示 SQL 執行將返回 ResultSet 作為查詢結果,此時可以使用getResultSet()取得ResultSet物件。如果execute()返回false,表示 SQL執行會返回更新筆數或沒有結果,此時可以使用getUpdateCount()取得更新筆數。如果事先無法得知SQL是進行查詢或更新,就可以使用execute()。視需求而定,Statement或ResultSet在不使用時,可以使用close()將之關閉,以釋放相關資源。Statement關閉時,所關聯的ResultSet也會自動關閉。
二、PreparedStatement、CallableStatement
如果有些操作只是SQL語句當中某些引數會有所不同,其餘的SQL子句皆相同,則可以使用java.sql.PreparedStatement。可以使用Connection的preparedstatement()方法建立好預先編譯(Precompile)的SQL 語句,當中引數會變動的部分,先指定"?"這個佔位字元。例如:

PreparedStatement stmt = conn.preparestatement (
"INSERT INTO t_message VALUES(?,?,?,?)");

等到需要真正指定引數執行時,再使用相對應的setInt()、setString()等方法,指定"?"處真正應該有的引數。例如:

stmt.setInt (1,2);
stmt.setString(2,"momor");
stmt.setString(3,"[email protected]");
stmt.setString(4,"message2...");
stmt.executeUpdate();
stmt.clearParameters();

要讓 SQL執行生效,要執行executeUpdate()或executeQuery(方法(如果是查詢的話)。
在這次的SQL執行完畢後,可以呼叫clearParameters()清除設定的引數,之後就能再次使用這個 PreparedStatement例項,所以使用PreparedStatement,可以讓你先準備好一段SQL,並重復使用這段SQL語句。
(2)如果撰寫資料庫的預存程式(Stored Procedure),並想使用JDBC來呼叫,則可使用java.sql.CallableStatement。呼叫的基本語法如下:

{?= call <程式名稱>[<自變數1>,<自變數2>,...]}
{call 
<程式名稱>[<自變數1>,<自變數2>,...]}

CallableStatement的 API使用,基本上與PreparedStatement差別不大,除了必須呼叫prepareCall()建立CallableStatement 異常外,一樣是使用 setxxx()設定引數,如果是查詢操作,使executeQuery(),如果是更新操作,使用executeUpdate()。另外,可以使用registerOutParameter()註冊輸出引數等。
在使用PreparedStatement或CallableStatement時,必須注意SQL型別與 Java資料型別的對應,因為兩者本身並不是一對一對應,java.sql.Types定義了一些常數代表SQL型別。下表所示為JDBC規範建議的SQL型別與Java型別的對應。

Java型別 SQL型別
boolean BIT
byte TINYINT
short SMALLINT
int INTEGER
long BIGINT
float FLOAT
double DOUBLE
byte[] BINARY、VARBINARY、LONGBINARY
java.lang.String CHAR、VARCHAR、LONGVARCHAR
java.math.BigDecimal NUMERIC、DECIMAL
java.sql.Date DATE
java.sql.Time TIME
java.sql.Timestamp TIMESTAMP



其中要注意的是,日期時間在 JDBC中,並不是使用java.util.Date,這個物件可代表的日期時間格式是“年、月、日、時、分、秒、毫秒”。在 JDBC 中要表示日期,是使用java.sql.Date,其日期格式是“年、月、日”,要表示時間的話則是使用java.sql.Time,其時間格式為“時、分、秒”,如果要表示“時、分、秒、微秒”的格式,則是使用java.sql.Timestamp。