JDBC中的四個(gè)最基本對(duì)象功能及其用法
1 JDBC中的主要類(接口)
在JDBC中常用的類有:
l DriverManager;(注冊(cè)驅(qū)動(dòng)類,調(diào)用該類就執(zhí)行靜態(tài)代碼塊的內(nèi)容,自己注冊(cè))
l Connection;數(shù)據(jù)庫(kù)連接, 可以得到statement,preparedStatement:java.sql.類
l Statement;
l ResultSet。
2 DriverManager
其實(shí)我們今后只需要會(huì)用DriverManager的getConnection()方法即可:
Class.forName(“com.mysql.jdbc.Driver”);//注冊(cè)驅(qū)動(dòng)
String url = “jdbc:mysql://localhost:3306/mydb1”;
String username = “root”;
String password = “123”;
Connection con = DriverManager.getConnection(url, username, password);
注意,上面代碼可能出現(xiàn)的兩種異常:
ClassNotFoundException:這個(gè)異常是在第1句上出現(xiàn)的,出現(xiàn)這個(gè)異常有兩個(gè)可能:
l 你沒有給出mysql的jar包;
l 你把類名稱打錯(cuò)了,查看類名是不是com.mysql.jdbc.Driver。
SQLException:這個(gè)異常出現(xiàn)在第5句,出現(xiàn)這個(gè)異常就是三個(gè)參數(shù)的問(wèn)題,往往username和password一般不是出錯(cuò),所以需要認(rèn)真查看url是否打錯(cuò)。
對(duì)于DriverManager.registerDriver()方法了解即可,因?yàn)槲覀兘窈笞?cè)驅(qū)動(dòng)只會(huì)Class.forName(),而不會(huì)使用這個(gè)方法。
3 Connection
Connection最為重要的方法就是獲取Statement:
l Statement stmt = con.createStatement();
后面在學(xué)習(xí)ResultSet方法時(shí),還要學(xué)習(xí)一下下面的方法:
l Statement stmt = con.createStatement(int,int[c1] );
4 Statement
Statement最為重要的方法是:
l int executeUpdate[c2] (String sql):執(zhí)行更新操作,即執(zhí)行insert、update、delete語(yǔ)句,其實(shí)這個(gè)方法也可以執(zhí)行create table、alter table,以及drop table等語(yǔ)句,但我們很少會(huì)使用JDBC來(lái)執(zhí)行這些語(yǔ)句;
l ResultSet executeQuery[c3] (String sql):執(zhí)行查詢操作,執(zhí)行查詢操作會(huì)返回ResultSet,即結(jié)果集。
boolean execute[c4] ()
Statement還有一個(gè)boolean execute()方法,這個(gè)方法可以用來(lái)執(zhí)行增、刪、改、查所有SQL語(yǔ)句。該方法返回的是boolean類型,表示SQL語(yǔ)句是否有結(jié)果集!。
如果使用execute()方法執(zhí)行的是更新語(yǔ)句,那么還要調(diào)用int getUpdateCount()來(lái)獲取insert、update、delete語(yǔ)句所影響的行數(shù)。
如果使用execute()方法執(zhí)行的是查詢語(yǔ)句,那么還要調(diào)用ResultSet getResultSet()來(lái)獲取select語(yǔ)句的查詢結(jié)果。
5 ResultSet之滾動(dòng)結(jié)果集(了解)scroll,sentive, forward_only
下一行:默認(rèn)只能使用它,其他的方法存在,但不能使用!默認(rèn)的結(jié)果集不可滾動(dòng)!
上一行
下N行
上N行
到N行
結(jié)果集不能滾動(dòng)時(shí),紅色的方法表示不能使用。
ResultSet表示結(jié)果集,它是一個(gè)二維的表格!ResultSet內(nèi)部維護(hù)一個(gè)行光標(biāo)(游標(biāo)),ResultSet提供了一系列的方法來(lái)移動(dòng)游標(biāo):
l void beforeFirst():把光標(biāo)放到第一行的前面,這也是光標(biāo)默認(rèn)的位置;
l void afterLast():把光標(biāo)放到最后一行的后面;
l boolean first():把光標(biāo)放到第一行的位置上,返回值表示調(diào)控光標(biāo)是否成功;
l boolean last():把光標(biāo)放到最后一行的位置上;
l
l boolean isBeforeFirst():當(dāng)前光標(biāo)位置是否在第一行前面;
l boolean isAfterLast():當(dāng)前光標(biāo)位置是否在最后一行的后面;
l boolean isFirst():當(dāng)前光標(biāo)位置是否在第一行上;
l boolean isLast():當(dāng)前光標(biāo)位置是否在最后一行上;
l
l boolean previous():把光標(biāo)向上挪一行;
l boolean next():把光標(biāo)向下挪一行;
l boolean relative(int row):相對(duì)位移,當(dāng)row為正數(shù)時(shí),表示向下移動(dòng)row行,為負(fù)數(shù)時(shí)表示向上移動(dòng)row行;
l boolean absolute(int row):絕對(duì)位移,把光標(biāo)移動(dòng)到指定的行上;
l int getRow():返回當(dāng)前光標(biāo)所有行。
獲取結(jié)果集元數(shù)據(jù)?。袛?shù),列名等)
l 得到元數(shù)據(jù):rs.getMetaData(),返回值為ResultSetMetaData;
l 獲取結(jié)果集列數(shù):int getColumnCount()
l 獲取指定列的列名:String getColumnName(int colIndex)
結(jié)果集特性:當(dāng)使用Connection的createStatement時(shí),已經(jīng)確定了Statement生成的結(jié)果集是什么特性。
l 是否可滾動(dòng)
l 是否敏感(敏感:數(shù)據(jù)庫(kù)改變,使結(jié)果集也會(huì)改變)
l 是否可更新(可更新:修改結(jié)果集,使數(shù)據(jù)庫(kù)也改變)
con.createStatement():生成的結(jié)果集:不滾動(dòng)、不敏感、不可更新!
con.createStatement(int,int):
第一個(gè)參數(shù):
l ResultSet.TYPE_FORWARD_ONLY:不滾動(dòng)結(jié)果集;
l ResultSet.TYPE_SCROLL_INSENSITIVE:滾動(dòng)結(jié)果集,但結(jié)果集數(shù)據(jù)不會(huì)再跟隨數(shù)據(jù)庫(kù)而變化;
l ResultSet.TYPE_SCROLL_SENSITIVE[c5] :滾動(dòng)結(jié)果集,但結(jié)果集數(shù)據(jù)不會(huì)再跟隨數(shù)據(jù)庫(kù)而變化;
第二個(gè)參數(shù):
l CONCUR_READ_ONLY:結(jié)果集是只讀的,不能通過(guò)修改結(jié)果集而反向影響數(shù)據(jù)庫(kù);
l CONCUR_UPDATABLE:結(jié)果集是可更新的,對(duì)結(jié)果集的更新可以反向影響數(shù)據(jù)庫(kù)。
上面方法分為兩類,一類用來(lái)判斷游標(biāo)位置的,另一類是用來(lái)移動(dòng)游標(biāo)的。如果結(jié)果集是不可滾動(dòng)的,那么只能使用next()方法來(lái)移動(dòng)游標(biāo),而beforeFirst()、afterLast()、first()、last()、previous()、relative()方法都不能使用!??!
結(jié)果集是否支持滾動(dòng),要從Connection類的createStatement()方法說(shuō)起。也就是說(shuō)創(chuàng)建的Statement決定了使用Statement創(chuàng)建的ResultSet是否支持滾動(dòng)。
Statement createStatement(int resultSetType, int resultSetConcurrency)
resultSetType的可選值:
l ResultSet.TYPE_FORWARD_ONLY:不滾動(dòng)結(jié)果集;
l ResultSet.TYPE_SCROLL_INSENSITIVE:滾動(dòng)結(jié)果集,但結(jié)果集數(shù)據(jù)不會(huì)再跟隨數(shù)據(jù)庫(kù)而變化;
l ResultSet.TYPE_SCROLL_SENSITIVE :滾動(dòng)結(jié)果集,但結(jié)果集數(shù)據(jù)不會(huì)再跟隨數(shù)據(jù)庫(kù)而變化;
可以看出,如果想使用滾動(dòng)的結(jié)果集,我們應(yīng)該選擇TYPE_SCROLL_INSENSITIVE!其實(shí)很少有數(shù)據(jù)庫(kù)驅(qū)動(dòng)會(huì)支持TYPE_SCROLL_SENSITIVE的特性!通常我們也不需要查詢到的結(jié)果集再受到數(shù)據(jù)庫(kù)變化的影響。
resultSetConcurrency的可選值:
l CONCUR_READ_ONLY:結(jié)果集是只讀的,不能通過(guò)修改結(jié)果集而反向影響數(shù)據(jù)庫(kù);
l CONCUR_UPDATABLE:結(jié)果集是可更新的,對(duì)結(jié)果集的更新可以反向影響數(shù)據(jù)庫(kù)。
通??筛陆Y(jié)果集這一“高級(jí)特性”我們也是不需要的!
獲取滾動(dòng)結(jié)果集的代碼如下:
Connection con = …
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,CONCUR_READ_ONLY);
String sql = …//查詢語(yǔ)句
ResultSet rs = stmt.executeQuery(sql);//這個(gè)結(jié)果集是可滾動(dòng)的,不敏感的
6 ResultSet之獲取列數(shù)據(jù)(getXxx(1,2,3…))
可以通過(guò)next()方法使ResultSet的游標(biāo)向下移動(dòng),當(dāng)游標(biāo)移動(dòng)到你需要的行時(shí),就需要來(lái)獲取該行的數(shù)據(jù)了,ResultSet提供了一系列的獲取列數(shù)據(jù)的方法:
l String getString(int columnIndex):獲取指定列的String類型數(shù)據(jù);
l int getInt(int columnIndex):獲取指定列的int類型數(shù)據(jù);
l double getDouble(int columnIndex):獲取指定列的double類型數(shù)據(jù);
l boolean getBoolean(int columnIndex):獲取指定列的boolean類型數(shù)據(jù);
l Object getObject(int columnIndex):獲取指定列的Object類型的數(shù)據(jù)。
上面方法中,參數(shù)columnIndex表示列的索引,列索引從1開始,而不是0,這第一點(diǎn)與數(shù)組不同。如果你清楚當(dāng)前列的數(shù)據(jù)類型,那么可以使用getInt()之類的方法來(lái)獲取,如果你不清楚列的類型,那么你應(yīng)該使用getObject()方法來(lái)獲取。
ResultSet還提供了一套通過(guò)列名稱來(lái)獲取列數(shù)據(jù)的方法:
l String getString(String columnName):獲取名稱為columnName的列的String數(shù)據(jù);
l int getInt(String columnName):獲取名稱為columnName的列的int數(shù)據(jù);
l double getDouble(String columnName):獲取名稱為columnName的列的double數(shù)據(jù);
l boolean getBoolean(String columnName):獲取名稱為columnName的列的boolean數(shù)據(jù);
l Object getObject(String columnName):獲取名稱為columnName的列的Object數(shù)據(jù);
評(píng)論
查看更多