2.4、JDBC程序的代碼模板
?????? 開發(fā)一個JDBC應(yīng)用程序,基本需要以下步驟:
(1)、把JDBC驅(qū)動類裝載入Java虛擬機中,為此,可使用Class.forName()方法,此方法將給定的類加載到Java虛擬機中。如果系統(tǒng)中不存在給定的類,則會引發(fā)異常,異常類型為ClassNotFoundException。
???????? Class.forName(“JDBC驅(qū)動類的名稱”);
?
(2)、加載驅(qū)動,并與數(shù)據(jù)庫建立連接。DriverManager類跟蹤已注冊的驅(qū)動程序,當調(diào)用getConnection()方法時,它會搜索整個驅(qū)動程序列表,直到找到一個能夠連接至數(shù)據(jù)連接字符串中指定的數(shù)據(jù)庫的驅(qū)動程序。加載此驅(qū)動程序之后,將使用DriverManager類的getConnection()方法建立與數(shù)據(jù)庫的連接。此方法接收三個參數(shù),分別表示URL、用戶名和密碼。用戶名和密碼是可選的。
???????? Connection conn = DriverManager.getConnection(數(shù)據(jù)庫連接字符串,數(shù)據(jù)庫用戶名,密碼);
?
(3)、發(fā)送SQL語句,并得到結(jié)果集。一旦連接建立,就使用該連接創(chuàng)建Statement接口的實例,并將SQL語句傳遞給它所連接的數(shù)據(jù)庫,并返回類型為ResultSet的對象,它包含執(zhí)行SQL查詢的結(jié)果。
???????? Statement stmt = conn.createStatement();
???????? ResultSet rs = stmt.executeQuery(select a,b,c from table);
?
(4)、處理結(jié)果。使用ResultSet對象的next()方法將光標(cursor)指向下一行。最初光標位于第一行之前,因此第一次調(diào)用next()方法將光標置于第一行上。如果到達結(jié)果集的末尾,則ResultSet的next()方法會返回false。方法getXXX提供了獲取當前行中某列值的途徑,列名或列號可用于標識要從中獲取數(shù)據(jù)的列。例如:如果數(shù)據(jù)表中第一列的列名為a,存儲類型為整型,則可以使用兩種方法獲取存儲在該列中的值,如: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ū)動類裝載入Java虛擬機中 ??
- Class.forName(JDBC驅(qū)動類的名稱); ??
- ??
- //加載驅(qū)動,并與數(shù)據(jù)庫建立連接,其中數(shù)據(jù)庫連接字符串用來標識數(shù)據(jù)庫 ??
- Connection?conn?=?DriverManager.getConnection(數(shù)據(jù)庫連接字符串,數(shù)據(jù)庫用戶名,密碼); ??
- ??
- //執(zhí)行SQL語句,并得到結(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ū)動類裝載入Java虛擬機中
Class.forName(JDBC驅(qū)動類的名稱);
//加載驅(qū)動,并與數(shù)據(jù)庫建立連接,其中數(shù)據(jù)庫連接字符串用來標識數(shù)據(jù)庫
Connection conn = DriverManager.getConnection(數(shù)據(jù)庫連接字符串,數(shù)據(jù)庫用戶名,密碼);
//執(zhí)行SQL語句,并得到結(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提供了一種標識數(shù)據(jù)庫的方法,可以使相應(yīng)的JDBC驅(qū)動程序能識別數(shù)據(jù)庫并與之建立連接。
JDBC URL的標準語法由以下三個部分組成,各部分間用冒號分隔。
Jdbc:<子協(xié)議>:<子名稱>
JDBC URL的三個部分可以分解如下:
其中jdbc-----代表協(xié)議。
<子協(xié)議>----驅(qū)動程序名或數(shù)據(jù)庫連接機制的名稱。
<子名稱>----一種標識數(shù)據(jù)庫的方法。
JDBC URL示例:
jdbc:odbc:news
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news
?
3、? Statement接口和PreparedStatement接口中的方法
ResultSet executeQuery(String sql):可以執(zhí)行SQL查詢并獲取到ResultSet對象。
int executeUpdate(String sql):可以執(zhí)行插入、刪除、更新等操作,返回值是執(zhí)行該操作所影響的行數(shù)。
boolean execute(String sql):這是一個最為一般的執(zhí)行方法,可以執(zhí)行任意SQL語句,然后獲得一個布爾值,表示是否返回ResultSet。
4、? 為什么要關(guān)閉Statement對象以及數(shù)據(jù)庫連接
如果不關(guān)閉Statement對象,它們會一直占用服務(wù)器資源,直到Java垃圾收集程序來回收它。作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對象時顯示地關(guān)閉它們,這將立即釋放服務(wù)器資源,有助于避免潛在的內(nèi)存問題。同樣,使用完數(shù)據(jù)庫連接后,就應(yīng)關(guān)閉它,釋放連接所占用的數(shù)據(jù)庫資源。
5、? PreparedStatement語句
PreparedStatement接口繼承自Statement接口,PreparedStatement比普通的Statement對象使用起來更加靈活,更有效率。PreparedStatement實例包含已編譯的SQL語句,SQL語句可具有一個或多個輸入?yún)?shù)。這些輸入?yún)?shù)的值在SQL語句創(chuàng)建時未被指定,而是為每個輸入?yún)?shù)保留一個問號(“?”)作為占位符。
PreparedStatement pstmt = con.prepareStatement(“update table set a=? where b=?”);
在執(zhí)行PreparedStatement對象之前,必須設(shè)置每個輸入?yún)?shù)的值。可通過setXXX方法來完成,其中XXX是與該參數(shù)相應(yīng)的類型。例如,如果參數(shù)具有Java類型long,則使用的方法就是設(shè)置給該參數(shù)的值。例如,以下代碼將第一個參數(shù)設(shè)為長整型值123456789,第二個參數(shù)設(shè)為整型值10:
pstmt.setLong(1,123456789);
pstmt.setInt(2,10);
?
由于PreparedStatement對象已預(yù)編譯過,所以其執(zhí)行速度要快于Statement對象,因此,多次執(zhí)行的SQL語句應(yīng)被創(chuàng)建為PreparedStatement對象,以提高效率。
?
6、? 格式化時間
SimpleDateFormat hmFromat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
hmFromat.format(new Date());
?
7、 步驟
?1)調(diào)用Class類的forName()方法,加載并注冊數(shù)據(jù)庫驅(qū)動。
?2)調(diào)用DriverManager類的getConnection()方法,建立到數(shù)據(jù)庫的連接
?3)調(diào)用Connection對象的createStatement()方法,訪問數(shù)據(jù)庫
?4)調(diào)用Statement對象的executeQuery()方法得到ResultSet對象。
?5) 調(diào)用ResultSet對象的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工具類?? ?
- ?*/ ?? ??
- 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工具類
*/
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號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

