創(chuàng)建一個以JDBC連接數據庫的程序步驟:
1抹缕、加載JDBC驅動程序:
? ? 在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Java虛擬機)囱井, 這通過java.lang.Class類的靜態(tài)方法forName(String??className)實現(xiàn)。
?例如:
try{
? ?//加載MySql的驅動類?
? ?Class.forName("com.mysql.jdbc.Driver")?;
? ? }catch(ClassNotFoundException?e){
? ? System.out.println("找不到驅動程序類?,加載驅動失敶涠!");
? ? ?e.printStackTrace()?;
????}
? ?成功加載后遵倦,會將Driver類的實例注冊到DriverManager類中尽超。
?2、提供JDBC連接的URL
????連接URL定義了連接數據庫時的協(xié)議梧躺、子協(xié)議似谁、數據源標識。
????書寫形式:協(xié)議:子協(xié)議:數據源標識
? ? 協(xié)議:在JDBC中總是以jdbc開始
? ? 子協(xié)議:是橋連接的驅動程序或是數據庫管理系統(tǒng)名稱掠哥。
? ? 數據源標識:標記找到數據庫來源的地址與連接端口巩踏。
? ? 例如:(MySql的連接URL)
????jdbc:mysql:
? ? ? ? //localhost:3306/test?useUnicode=true&characterEncoding=gbk?;?
? ?useUnicode=true:表示使用Unicode字符集。如果characterEncoding設置為
? ?gb2312或GBK续搀,本參數必須設置為true?蛀缝。characterEncoding=gbk:字符編碼方式。
?3目代、創(chuàng)建數據庫的連接
????要連接數據庫,需要向java.sql.DriverManager請求并獲得Connection對象嗤练,
?????該對象就代表一個數據庫的連接榛了。
?????使用DriverManager的getConnectin(String?url?,?String?username?,
????String?password?)方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和
?????密碼來獲得煞抬。
?????例如:
?????//連接MySql數據庫霜大,用戶名和密碼都是root?
?????String?url?=?"jdbc:mysql://localhost:3306/test";
?????String?username?=?"root";
?????String?password?=?"root";
?????try{
Connection?con?=
DriverManager.getConnection(url?,?username?,?password?)?;
?????}catch(SQLException?se){
????System.out.println("數據庫連接失敗革答!");
se.printStackTrace()?;
}
?4战坤、創(chuàng)建一個Statement
?????要執(zhí)行SQL語句曙强,必須獲得java.sql.Statement實例,Statement實例分為以下3
?????種類型:
??????1途茫、執(zhí)行靜態(tài)SQL語句碟嘴。通常通過Statement實例實現(xiàn)。
??????2囊卜、執(zhí)行動態(tài)SQL語句娜扇。通常通過PreparedStatement實例實現(xiàn)。
??????3栅组、執(zhí)行數據庫存儲過程雀瓢。通常通過CallableStatement實例實現(xiàn)。
????具體的實現(xiàn)方式:
Statement?stmt?=?con.createStatement()?;
PreparedStatement?pstmt?=?con.prepareStatement(sql)?;
CallableStatement?cstmt?=
????????????????????????????con.prepareCall("{CALL?demoSp(??,??)}")?;
?5玉掸、執(zhí)行SQL語句
????Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery?刃麸、executeUpdate
???和execute
????1、ResultSet?executeQuery(String?sqlString):執(zhí)行查詢數據庫的SQL語句
????????司浪,返回一個結果集(ResultSet)對象泊业。
?????2、int?executeUpdate(String?sqlString):用于執(zhí)行INSERT断傲、UPDATE或
????????DELETE語句以及SQL?DDL語句脱吱,如:CREATE?TABLE和DROP?TABLE等
?????3、execute(sqlString):用于執(zhí)行返回多個結果集认罩、多個更新計數或二者組合的
????????語句箱蝠。
???具體實現(xiàn)的代碼:
??????????ResultSet?rs?=?stmt.executeQuery("SELECT?*?FROM?...")?;
????int?rows?=?stmt.executeUpdate("INSERT?INTO?...")?;
????booleanflag?=?stmt.execute(String?sql)?;
?6、處理結果
????兩種情況:
?????1垦垂、執(zhí)行更新返回的是本次操作影響到的記錄數宦搬。
?????2、執(zhí)行查詢返回的結果是一個ResultSet對象劫拗。
??????ResultSet包含符合SQL語句中條件的所有行间校,并且它通過一套get方法提供了對這些
??????行中數據的訪問。
??????使用結果集(ResultSet)對象的訪問方法獲取數據:
?????while(rs.next()){
?????????String?name?=?rs.getString("name")?;
????String?pass?=?rs.getString(1)?;?//?此方法比較高效?
}
????(列是從左到右編號的页慷,并且從列1開始)
?7憔足、關閉JDBC對象
?????操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源酒繁,關閉順序和聲
?????明順序相反:
?????1滓彰、關閉記錄集
?????2、關閉聲明
?????3州袒、關閉連接對象
??????????if(rs?!=?null){???//?關閉記錄集?
????????try{
rs.close()?;
????????}catch(SQLException?e){
e.printStackTrace()?;
}
}
??????????if(stmt?!=?null){???//?關閉聲明?
????????try{
stmt.close()?;
????????}catch(SQLException?e){
e.printStackTrace()?;
}
}
??????????if(conn?!=?null){??//?關閉連接對象?
?????????try{
conn.close()?;
?????????}catch(SQLException?e){
e.printStackTrace()?;
}
??????????}??