2.4、JDBC程序的代碼模板
?????? 開(kāi)發(fā)一個(gè)JDBC應(yīng)用程序,基本需要以下步驟:
(1)、把JDBC驅(qū)動(dòng)類(lèi)裝載入Java虛擬機(jī)中,為此,可使用Class.forName()方法,此方法將給定的類(lèi)加載到Java虛擬機(jī)中。如果系統(tǒng)中不存在給定的類(lèi),則會(huì)引發(fā)異常,異常類(lèi)型為ClassNotFoundException。
???????? Class.forName(“JDBC驅(qū)動(dòng)類(lèi)的名稱(chēng)”);
?
(2)、加載驅(qū)動(dòng),并與數(shù)據(jù)庫(kù)建立連接。DriverManager類(lèi)跟蹤已注冊(cè)的驅(qū)動(dòng)程序,當(dāng)調(diào)用getConnection()方法時(shí),它會(huì)搜索整個(gè)驅(qū)動(dòng)程序列表,直到找到一個(gè)能夠連接至數(shù)據(jù)連接字符串中指定的數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序。加載此驅(qū)動(dòng)程序之后,將使用DriverManager類(lèi)的getConnection()方法建立與數(shù)據(jù)庫(kù)的連接。此方法接收三個(gè)參數(shù),分別表示URL、用戶(hù)名和密碼。用戶(hù)名和密碼是可選的。
???????? Connection conn = DriverManager.getConnection(數(shù)據(jù)庫(kù)連接字符串,數(shù)據(jù)庫(kù)用戶(hù)名,密碼);
?
(3)、發(fā)送SQL語(yǔ)句,并得到結(jié)果集。一旦連接建立,就使用該連接創(chuàng)建Statement接口的實(shí)例,并將SQL語(yǔ)句傳遞給它所連接的數(shù)據(jù)庫(kù),并返回類(lèi)型為ResultSet的對(duì)象,它包含執(zhí)行SQL查詢(xún)的結(jié)果。
???????? Statement stmt = conn.createStatement();
???????? ResultSet rs = stmt.executeQuery(select a,b,c from table);
?
(4)、處理結(jié)果。使用ResultSet對(duì)象的next()方法將光標(biāo)(cursor)指向下一行。最初光標(biāo)位于第一行之前,因此第一次調(diào)用next()方法將光標(biāo)置于第一行上。如果到達(dá)結(jié)果集的末尾,則ResultSet的next()方法會(huì)返回false。方法getXXX提供了獲取當(dāng)前行中某列值的途徑,列名或列號(hào)可用于標(biāo)識(shí)要從中獲取數(shù)據(jù)的列。例如:如果數(shù)據(jù)表中第一列的列名為a,存儲(chǔ)類(lèi)型為整型,則可以使用兩種方法獲取存儲(chǔ)在該列中的值,如:int x = rs.getInt(“a”);或者:int x = rs.getInt(1);
處理結(jié)果的代碼示例:
???????? while(rs.next()){
?????????? int x = rs.getInt(“a”);
?????????? String s = rs.getString(“b”);
?????????? float f = rs.getFloat(“c”);
}
?
JDBC程序的代碼模板:
- //把JDBC驅(qū)動(dòng)類(lèi)裝載入Java虛擬機(jī)中 ??
- Class.forName(JDBC驅(qū)動(dòng)類(lèi)的名稱(chēng)); ??
- ??
- //加載驅(qū)動(dòng),并與數(shù)據(jù)庫(kù)建立連接,其中數(shù)據(jù)庫(kù)連接字符串用來(lái)標(biāo)識(shí)數(shù)據(jù)庫(kù) ??
- Connection?conn?=?DriverManager.getConnection(數(shù)據(jù)庫(kù)連接字符串,數(shù)據(jù)庫(kù)用戶(hù)名,密碼); ??
- ??
- //執(zhí)行SQL語(yǔ)句,并得到結(jié)果集 ??
- Statement?stmt?=?conn.createStatement(); ??
- ResultSet?rs?=?stmt.executeQuery(“select?a,b,c?from?table”); ??
- ??
- //處理結(jié)果 ??
- while (rs.next()){ ??
- ?? int ?x?=?rs.getInt(“a”); ??
- ??String?s?=?rs.getString(“b”); ??
- ?? float ?f?=?rs.getFloat(“c”); ??
- }??
//把JDBC驅(qū)動(dòng)類(lèi)裝載入Java虛擬機(jī)中 Class.forName(JDBC驅(qū)動(dòng)類(lèi)的名稱(chēng)); //加載驅(qū)動(dòng),并與數(shù)據(jù)庫(kù)建立連接,其中數(shù)據(jù)庫(kù)連接字符串用來(lái)標(biāo)識(shí)數(shù)據(jù)庫(kù) Connection conn = DriverManager.getConnection(數(shù)據(jù)庫(kù)連接字符串,數(shù)據(jù)庫(kù)用戶(hù)名,密碼); //執(zhí)行SQL語(yǔ)句,并得到結(jié)果集 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(“select a,b,c from table”); //處理結(jié)果 while(rs.next()){ int x = rs.getInt(“a”); String s = rs.getString(“b”); float f = rs.getFloat(“c”); }
??
2.5、什么是JDBC URL
JDBC URL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,可以使相應(yīng)的JDBC驅(qū)動(dòng)程序能識(shí)別數(shù)據(jù)庫(kù)并與之建立連接。
JDBC URL的標(biāo)準(zhǔn)語(yǔ)法由以下三個(gè)部分組成,各部分間用冒號(hào)分隔。
Jdbc:<子協(xié)議>:<子名稱(chēng)>
JDBC URL的三個(gè)部分可以分解如下:
其中jdbc-----代表協(xié)議。
<子協(xié)議>----驅(qū)動(dòng)程序名或數(shù)據(jù)庫(kù)連接機(jī)制的名稱(chēng)。
<子名稱(chēng)>----一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。
JDBC URL示例:
jdbc:odbc:news
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news
?
3、? Statement接口和PreparedStatement接口中的方法
ResultSet executeQuery(String sql):可以執(zhí)行SQL查詢(xún)并獲取到ResultSet對(duì)象。
int executeUpdate(String sql):可以執(zhí)行插入、刪除、更新等操作,返回值是執(zhí)行該操作所影響的行數(shù)。
boolean execute(String sql):這是一個(gè)最為一般的執(zhí)行方法,可以執(zhí)行任意SQL語(yǔ)句,然后獲得一個(gè)布爾值,表示是否返回ResultSet。
4、? 為什么要關(guān)閉Statement對(duì)象以及數(shù)據(jù)庫(kù)連接
如果不關(guān)閉Statement對(duì)象,它們會(huì)一直占用服務(wù)器資源,直到Java垃圾收集程序來(lái)回收它。作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對(duì)象時(shí)顯示地關(guān)閉它們,這將立即釋放服務(wù)器資源,有助于避免潛在的內(nèi)存問(wèn)題。同樣,使用完數(shù)據(jù)庫(kù)連接后,就應(yīng)關(guān)閉它,釋放連接所占用的數(shù)據(jù)庫(kù)資源。
5、? PreparedStatement語(yǔ)句
PreparedStatement接口繼承自Statement接口,PreparedStatement比普通的Statement對(duì)象使用起來(lái)更加靈活,更有效率。PreparedStatement實(shí)例包含已編譯的SQL語(yǔ)句,SQL語(yǔ)句可具有一個(gè)或多個(gè)輸入?yún)?shù)。這些輸入?yún)?shù)的值在SQL語(yǔ)句創(chuàng)建時(shí)未被指定,而是為每個(gè)輸入?yún)?shù)保留一個(gè)問(wèn)號(hào)(“?”)作為占位符。
PreparedStatement pstmt = con.prepareStatement(“update table set a=? where b=?”);
在執(zhí)行PreparedStatement對(duì)象之前,必須設(shè)置每個(gè)輸入?yún)?shù)的值。可通過(guò)setXXX方法來(lái)完成,其中XXX是與該參數(shù)相應(yīng)的類(lèi)型。例如,如果參數(shù)具有Java類(lèi)型long,則使用的方法就是設(shè)置給該參數(shù)的值。例如,以下代碼將第一個(gè)參數(shù)設(shè)為長(zhǎng)整型值123456789,第二個(gè)參數(shù)設(shè)為整型值10:
pstmt.setLong(1,123456789);
pstmt.setInt(2,10);
?
由于PreparedStatement對(duì)象已預(yù)編譯過(guò),所以其執(zhí)行速度要快于Statement對(duì)象,因此,多次執(zhí)行的SQL語(yǔ)句應(yīng)被創(chuàng)建為PreparedStatement對(duì)象,以提高效率。
?
6、? 格式化時(shí)間
SimpleDateFormat hmFromat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
hmFromat.format(new Date());
?
7、 步驟
?1)調(diào)用Class類(lèi)的forName()方法,加載并注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)。
?2)調(diào)用DriverManager類(lèi)的getConnection()方法,建立到數(shù)據(jù)庫(kù)的連接
?3)調(diào)用Connection對(duì)象的createStatement()方法,訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)
?4)調(diào)用Statement對(duì)象的executeQuery()方法得到ResultSet對(duì)象。
?5) 調(diào)用ResultSet對(duì)象的getObject()方法,處理結(jié)果。
?6)釋放資源(連接應(yīng)該盡可能晚建立,釋放資源應(yīng)盡可能早釋放。)
?
8、 代碼
- import ?java.sql.Connection;??? ??
- import ?java.sql.DriverManager;??? ??
- import ?java.sql.ResultSet;??? ??
- import ?java.sql.SQLException;??? ??
- import ?java.sql.Statement;??? ??
- ?? ??
- /**?? ?
- ?*Jdbc工具類(lèi)?? ?
- ?*/ ?? ??
- public ? class ?JdbcUtils?{??? ??
- ???? private ? static ?String?url?=? "jdbc:mysql://localhost:3306/test" ;??? ??
- ???? private ? static ?String?user?=? "root" ;??? ??
- ???? private ? static ?String?password?=? "123456" ;??? ??
- ?? ??
- ???? private ?JdbcUtils()?{????}??? ??
- ???? static ?{??? ??
- ???????? try ?{??? ??
- ????????????Class.forName( "com.mysql.jdbc.Driver" );??? ??
- ????????}? catch ?(ClassNotFoundException?ex)?{??? ??
- ???????????? throw ? new ?ExceptionInInitializerError(ex);??? ??
- ????????}??? ??
- ????}??? ??
- ???? public ? static ?Connection?getConnection()? throws ?SQLException{??? ??
- ???????? return ?DriverManager.getConnection(url,?user,?password);??? ??
- ????}??? ??
- ???? public ? static ? void ?free(Connection?conn,?Statement?st,?ResultSet?rs)?{??? ??
- ???????? try ?{??? ??
- ???????????? if ?(rs?!=? null )?{??? ??
- ????????????????rs.close();??? ??
- ????????}??? ??
- ????????}? catch ?(SQLException?ex)?{??? ??
- ????????????System.out.println(ex.toString());??? ??
- ????????}? finally ?{??? ??
- ???????????? try ?{??? ??
- ???????????????? if (st!= null )?{??? ??
- ????????????????????st.close();??? ??
- ????????????????}??? ??
- ????????????}? catch ?(SQLException?ex)?{??? ??
- ????????????????System.out.println(ex.toString());??? ??
- ????????????}? finally ?{??? ??
- ???????????????? try ?{??? ??
- ???????????????????? if (conn!= null ){??? ??
- ????????????????????????conn.close();??? ??
- ????????????????????}??? ??
- ????????????????}? catch ?(SQLException?ex)?{??? ??
- ????????????????????System.out.println(ex.toString());??? ??
- ????????????????}??? ??
- ????????????}??? ??
- ????????}??? ??
- ????}??? ??
- }????
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** *Jdbc工具類(lèi) */ public class JdbcUtils { private static String url = "jdbc:mysql://localhost:3306/test"; private static String user = "root"; private static String password = "123456"; private JdbcUtils() { } static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException ex) { throw new ExceptionInInitializerError(ex); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, user, password); } public static void free(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(st!=null) { st.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(conn!=null){ conn.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } } } } }
- import ?java.sql.Connection;??? ??
- import ?java.sql.ResultSet;??? ??
- import ?java.sql.SQLException;??? ??
- import ?java.sql.Statement;??? ??
- ?? ??
- public ? class ?Test?{??? ??
- ?? ??
- ???? public ? static ? void ?main(String[]?args)?{??? ??
- ????????optimize();??? ??
- ????}??? ??
- ?? ??
- ???? public ? static ? void ?optimize()?{??? ??
- ????????Connection?conn?=? null ;??? ??
- ????????Statement?st?=? null ;??? ??
- ????????ResultSet?rs?=? null ;??? ??
- ???????? try ?{??? ??
- ????????????conn?=?JdbcUtils.getConnection();??? ??
- ????????????st?=?conn.createStatement();??? ??
- ????????????rs?=?st.executeQuery( "Select?*?from?Students;" );??? ??
- ???????????? while ?(rs.next())?{??? ??
- ????????????????System.out.println(rs.getObject( 1 )?+? "\t" ?+?rs.getObject( 2 )?+? "\t" ?+?rs.getObject( 3 )?+? "\t" ?+?rs.getObject( 4 ));??? ??
- ????????????}??? ??
- ????????}? catch ?(SQLException?ex)?{??? ??
- ????????????System.out.println(ex.toString());??? ??
- ????????}? finally ?{??? ??
- ????????????JdbcUtils.free(conn,?st,?rs);??? ??
- ????????}??? ??
- ????}??? ??
- }??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
