JDBC接口
Statement接口:
Statement接口可以用于執行sql語句,Statement對象需要通過Connection對象調用createStatement();方法來獲得,得到Statement對象后才能調用執行SQL語句的方法。SQL語句分為兩大類一類是更新語句一類是查詢語句也就是DML和DQL,通過Statement對象調用executeUpdate方法可以執行DML類的SQL語句(更新語句),調用executeQuery方法則可以執行DQL類的SQL語句也就是查詢語句。
使用Statement對象調用executeUpdate方法執行數據庫更新語句時,會有一個int類型的返回值,這個返回值表示的是SQL語句執行后所影響的行數,因為像update、insert、delete語句都會影響表格的行數,下面做一個小實驗就能明白了。
表格的內容:
代碼示例:
運行結果:
從運行結果可以知道,insert語句影響了一行數據,update語句也影響了一行數據,最后delete語句刪除了所有的數據,所以影響了11行數據。
最后表格的數據都被清空了:
Statement對象調用executeBatch();方法可以批量執行SQL語句,在調用executeBatch();方法前,需要調用addBatch();方法來累積SQL語句,最后調用clearBatch();方法來清空積累的SQL語句。
如果不使用批SQL執行的話,會來來回回的向數據庫發送SQL,速度會稍微慢一些。使用批SQL執行的話,則是將SQL語句積累起來,然后一次性往數據庫發送SQL語句,所以速度會稍微快一些。調用executeBatch();方法會返回一個int類型數組,因為是批量執行的SQL語句,所以影響得行數比較多。
? 代碼示例:
運行結果:
批SQL處理思維導圖:
使用Statement對象調用executeQuery方法執行數據庫查詢語句時,會返回一個ResultSet對象,這個對象是查詢出來的記錄集,因為查詢的結果集數量可能很龐大,如果返回一個數組或者集合,就代表要一次性把查詢到的數據都拿出來,這樣的話不僅速度慢,而且拿取數據也不方便,并且讓開發驅動的人員也沒有優化的余地。
返回的是ResultSet對象的話,就能選擇性的拿取數據,能讓開發驅動的人員有優化的余地。
代碼示例:
運行結果:
使用ResultSet對象調用next();方法會返回一個boolean值,返回值為true表示查詢到了數據,如果是false則是沒有查詢到數據。
提醒:在編寫SQL語句時,最好是在SQLYog工具或者其他數據庫工具中執行一下,確保語句正確之后在拷貝過來,會剩下一些麻煩。
ResultSet接口:
從上面的介紹也知道ResultSet是從數據庫里查詢出來的記錄集的一個封裝對象,ResultSet對象是有一個取值光標的,這個取值光標的概念和游標的概念是差不多的,這個取值光標默認在數據的最前面,也就是第一行數據,next();方法可以移動光標取值,如果光標沒有指向值的話,就返回false ?有值就是true。
使用ResultSet對象調用beforeFirst();方法可以將取值光標移動到最前方,也就是第一行數據,此方法一般配合next方法使用。
代碼示例:
運行結果:
使用ResultSet對象調用afterLast();方法可以將取值光標移動到最后方,也就是最后一行數據。
? 代碼示例:
運行結果:
ResultSet對象調用previous();方法可以從后至前的方式拿值,也即是和next();方法取值順序相反,一般配合afterLast方法使用,如果使用beforeFirst方法的話會得不到數據。
? 錯誤示例:
運行結果會為空,什么都不會打印:
取列值:
在上面我們也使用到了getInt方法來取tid列的值,取列值可以通過兩個方式,一是通過序號,二是通過列名,在上面我是通過列名獲得的tid列的值,我們也可以使用序號來獲得。
? 通過序號取列值代碼示例:
運行結果:
如何確定列的序號?通過表格列的從左到右順序即可確定:
通過序號取列值代碼示例:
運行結果:
一些常用的取值方法對應的數據庫中的數據類型介紹:
varchar類型?>>getString方法
int類型 ??????>>???getInt();方法
boolean類型 ??>>???getBoolean();方法
datetime類型 ?>>getDate();方法
float類型?>>getFloat();方法
double類型?>>getDouble();方法
使用方法去取值時要注意能夠確保精度、內存不會溢出,例如使用getFloat();方法就不能去取double類型的值,反過來使用getDouble();方法則可以去取float類型的值。這和Java里的類型轉換原理是一樣的,大轉小會溢出,小轉大則沒問題,而且任何數據類型都可以轉換為String類型。
注意:在記錄集中拿數據時,是由你所寫的SELECT語句來決定的,例如你寫的是SELECT * FROM test,那么就是默認按表格序號來拿數據,如果你寫的是SELECT tname FROM test,則是按tname為序號1來拿數據。
? SELECT * FROM test代碼示例:
運行結果:
SELECT tname FROM test代碼示例:
運行結果:
還有一點要注意的是如果要將datatime類型的值保存到變量中,是使用Date類聲明的變量來保存,但是這個Date類不是java.util包下的Date類,而是java.sql包下的Date類,不要使用錯類了。
? 代碼示例:
運行結果:
從運行結果可以看出只打印了日期,時間沒有打印,也就是說使用getDate方法只能獲得日期,獲得不了時間,如果想要獲得時間和日期就得調用getTimestamp方法,這個方法會返回一個Timestamp對象。
? 代碼示例:
運行結果:
ResultSetMetaData接口:
ResultSetMetaData接口主要是用于反饋查詢出來的數據庫中表結構信息對象的,ResultSetMetaData對象需要通過ResultSet對象調用getMetaData();方法來獲得。但是要注意的一點就是ResultSetMetaData對象并不是完全的表結構封裝對象,而僅是查詢出來的數據結果集表結構封裝對像,也就是說僅僅是通過查詢語句所查詢出來的那個表結構,不是完整存在數據庫的表結構,通過這個對象可以調用有一些方法來獲得表結構信息。
簡單介紹幾個方法的作用:
getColumnName();方法????得到列名
getColumnTypeName();方法?得到列的數據類型名稱
getColumnDisplaySize();方法??獲得列所定義的類型大小
getColumnCount();方法?得到表格中所有列的數量
isNullable();方法?判斷這個列是否可以為null,返回值是一個int類型,只會返回0或1,0代表false,1代表true,也就是非0即真。
提示:以上提到的方法,除了getColumnCount();方法之外,其他方法都需要傳遞一個int類型的參數,這個數字是查詢出來的表結構中列的序號。
? 代碼示例:
運行結果:
一般很少情況下會去獲得表結構信息,因為沒什么實際意義,所以ResultSetMetaData接口用得不多。
轉載于:https://blog.51cto.com/zero01/1977005
總結
- 上一篇: find的命令的使用和文件名的后缀
- 下一篇: 脏读,不可重复读,幻读