?創(chuàng)建一個以JDBC連接數(shù)據(jù)庫的程序挣输,包含
7
個步驟: ??
1
纬凤、加載JDBC驅(qū)動程序: ??
????在連接數(shù)據(jù)庫之前,首先要加載想要連接的數(shù)據(jù)庫的驅(qū)動到JVM(Java虛擬機)撩嚼, ??
????這通過java.lang.Class類的靜態(tài)方法forName(String??className)實現(xiàn)停士。 ??
????例如: ??
try
{ ??
//加載MySql的驅(qū)動類?
????Class.forName(
"com.mysql.jdbc.Driver"
)?; ??
????}
catch
(ClassNotFoundException?e){ ??
????System.out.println(
"找不到驅(qū)動程序類?,加載驅(qū)動失斖昀觥恋技!"
); ??
????e.printStackTrace()?; ??
????} ??
???成功加載后,會將Driver類的實例注冊到DriverManager類中逻族。 ??
2
蜻底、提供JDBC連接的URL ??
????連接URL定義了連接數(shù)據(jù)庫時的協(xié)議、子協(xié)議聘鳞、數(shù)據(jù)源標識薄辅。 ??
?????書寫形式:協(xié)議:子協(xié)議:數(shù)據(jù)源標識 ??
????協(xié)議:在JDBC中總是以jdbc開始 ??
????子協(xié)議:是橋連接的驅(qū)動程序或是數(shù)據(jù)庫管理系統(tǒng)名稱。 ??
????數(shù)據(jù)源標識:標記找到數(shù)據(jù)庫來源的地址與連接端口抠璃。 ??
????例如:(MySql的連接URL) ??
????jdbc:mysql: ??
//localhost:3306/test?useUnicode=true&characterEncoding=gbk?;?
???useUnicode=
true
:表示使用Unicode字符集站楚。如果characterEncoding設置為 ??
???gb2312或GBK,本參數(shù)必須設置為
true
?搏嗡。characterEncoding=gbk:字符編碼方式源请。 ??
3
、創(chuàng)建數(shù)據(jù)庫的連接 ??
?????要連接數(shù)據(jù)庫彻况,需要向java.sql.DriverManager請求并獲得Connection對象谁尸, ??
?????該對象就代表一個數(shù)據(jù)庫的連接。 ??
?????使用DriverManager的getConnectin(String?url?,?String?username?,? ??
????String?password?)方法傳入指定的欲連接的數(shù)據(jù)庫的路徑纽甘、數(shù)據(jù)庫的用戶名和 ??
?????密碼來獲得良蛮。 ??
?????例如: ??
//連接MySql數(shù)據(jù)庫,用戶名和密碼都是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(
"數(shù)據(jù)庫連接失敽酚决瞳!"
); ??
????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í)行數(shù)據(jù)庫存儲過程。通常通過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í)行查詢數(shù)據(jù)庫的SQL語句 ??
????????究抓,返回一個結(jié)果集(ResultSet)對象。 ??
2
袭灯、
int
?executeUpdate(String?sqlString):用于執(zhí)行INSERT刺下、UPDATE或 ??
????????DELETE語句以及SQL?DDL語句,如:CREATE?TABLE和DROP?TABLE等 ??
3
妓蛮、execute(sqlString):用于執(zhí)行返回多個結(jié)果集怠李、多個更新計數(shù)或二者組合的 ??
????????語句圾叼。 ??
???具體實現(xiàn)的代碼: ??
??????????ResultSet?rs?=?stmt.executeQuery(
"SELECT?*?FROM?..."
)?; ??
int
?rows?=?stmt.executeUpdate(
"INSERT?INTO?..."
)?; ??
boolean
?flag?=?stmt.execute(String?sql)?; ??
6
蛤克、處理結(jié)果 ??
????兩種情況: ??
1
、執(zhí)行更新返回的是本次操作影響到的記錄數(shù)夷蚊。 ??
2
构挤、執(zhí)行查詢返回的結(jié)果是一個ResultSet對象。 ??
??????ResultSet包含符合SQL語句中條件的所有行惕鼓,并且它通過一套get方法提供了對這些 ??
??????行中數(shù)據(jù)的訪問筋现。 ??
??????使用結(jié)果集(ResultSet)對象的訪問方法獲取數(shù)據(jù): ??
while
(rs.next()){ ??
?????????String?name?=?rs.getString("name")?; ??
????String?pass?=?rs.getString(1)?;?//?此方法比較高效???
?????} ??
????(列是從左到右編號的,并且從列1開始) ??
?7箱歧、關(guān)閉JDBC對象? ??
?????操作完成以后要把所有使用的JDBC對象全都關(guān)閉矾飞,以釋放JDBC資源,關(guān)閉順序和聲 ??
?????明順序相反: ??
?????1呀邢、關(guān)閉記錄集 ??
?????2洒沦、關(guān)閉聲明 ??
?????3、關(guān)閉連接對象 ??
if
(rs?!=?
null
){???//?關(guān)閉記錄集???
try
{ ??
????????????rs.close()?; ??
????????}
catch
(SQLException?e){ ??
????????????e.printStackTrace()?; ??
????????} ??
??????????} ??
if
(stmt?!=?
null
){???//?關(guān)閉聲明???
try
{ ??