java如何創(chuàng)建一個(gè)jdbc程序詳解
JDBC簡(jiǎn)介
- Java數(shù)據(jù)庫(kù)連接(Java Database Connectivity,JDBC),是一種用于執(zhí)行SQL語(yǔ)句的Java API,它由一組用Java編程語(yǔ)言編寫(xiě)的類(lèi)和接口組成。
- JDBC為數(shù)據(jù)庫(kù)開(kāi)發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純Java API來(lái)編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。
- 使用JDBC編寫(xiě)的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)。
- JDBC擴(kuò)展了Java的功能,由于Java語(yǔ)言本身的特點(diǎn),使得JDBC具有簡(jiǎn)單、健壯、安全、可移植、獲取方便等優(yōu)勢(shì)。
我們?cè)跊](méi)有JDBC之前,使用驅(qū)動(dòng)程序在Java程序與MySQL、Oracle、SQLServer等數(shù)據(jù)庫(kù)之間建立連接,驅(qū)動(dòng)程序就是在該課程中將要學(xué)到的內(nèi)容。那么就存在一個(gè)問(wèn)題:在同一個(gè)Java程序與數(shù)據(jù)庫(kù)之間建立連接時(shí),驅(qū)動(dòng)程序是否是共用的呢?如果一樣,很顯然就能節(jié)省代碼量,但是實(shí)際上是不一樣的。一定要注意是不一樣的。那么就存在一個(gè)問(wèn)題:當(dāng)?shù)讓訑?shù)據(jù)庫(kù)發(fā)生改變之后,數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序也會(huì)隨之發(fā)生變化,那么該怎么解決該問(wèn)題呢?于是JDBC出現(xiàn)了,目的是為了減輕開(kāi)發(fā)人員的工作量,以提高代碼的復(fù)用。
JDBC API
| 接口/類(lèi) | 功能說(shuō)明 |
|---|---|
| DriverManager | 數(shù)據(jù)庫(kù)驅(qū)動(dòng)管理類(lèi),用于加載和卸載各種驅(qū)動(dòng)程序,并建立于數(shù)據(jù)庫(kù)的連接 |
| Connection | 此接口用于連接數(shù)據(jù)庫(kù) |
| Statement | 此接口用于執(zhí)行SQL語(yǔ)句并將數(shù)據(jù)檢索到ResultSet中 |
| ResultSet | 結(jié)果集接口,提供檢索SQL語(yǔ)句返回?cái)?shù)據(jù)的各種方法 |
| PreparedStatement | 此接口用于執(zhí)行預(yù)編譯的SQL語(yǔ)句 |
| CallableStatement | 此接口用于執(zhí)行SQL存儲(chǔ)過(guò)程的語(yǔ)句 |
JDBC結(jié)構(gòu)
1.JDBC API是Java開(kāi)發(fā)工具包(JDK)的組成部份:
- JDBC驅(qū)動(dòng)程序管理器
- JDBC驅(qū)動(dòng)程序測(cè)試工具包
- JDBC-ODBC橋
2.JDBC驅(qū)動(dòng)程序管理器是JDBC體系結(jié)構(gòu)的支柱,其主要作用是把Java應(yīng)用程序連接到正確的JDBC驅(qū)動(dòng)程序上。
3.JDBC驅(qū)動(dòng)程序測(cè)試工具包為JDBC驅(qū)動(dòng)程序的運(yùn)行提供一定的可信度,只有通過(guò)JDBC驅(qū)動(dòng)程序測(cè)試包的驅(qū)動(dòng)程序才被認(rèn)為是符合JDBC標(biāo)準(zhǔn)的。
4.JDBC-ODBC橋使ODBC驅(qū)動(dòng)程序可被用作JDBC驅(qū)動(dòng)程序。其目標(biāo)是為方便實(shí)現(xiàn)訪問(wèn)某些不常見(jiàn)的DBMS,它的實(shí)現(xiàn)為JDBC的快速發(fā)展提供了一條途徑。
在開(kāi)始之前,我們先來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的JDBC程序
步驟
1,注冊(cè)驅(qū)動(dòng);(只需要注冊(cè)一次)
2,建立連接;
3,創(chuàng)建執(zhí)行的sql語(yǔ)句;
4,執(zhí)行語(yǔ)句;
5,處理執(zhí)行結(jié)果;
6,釋放資源;
示例
package cn.ccnu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Statement;
public class Demo1 {
public static void main(String[] args) throws Exception {
test();
}
public static void test() throws Exception {
//1,注冊(cè)驅(qū)動(dòng)
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// System.getProperty("jdbc.driver", "con.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver");//這三種注冊(cè)方式,推薦使用這種
//2,建立連接
//url格式
//JDBC:子協(xié)議:子名稱//主機(jī)名:端口/數(shù)據(jù)庫(kù)名稱
String url = "jdbc:mysql://localhost:3306/test";//如果是本機(jī),也可以將localhost:3306省掉
String user = "root";
String password = "123456";
Connection conn = (Connection)DriverManager.getConnection(url, user, password);
//3,創(chuàng)建slq執(zhí)行語(yǔ)句
Statement st = (Statement) conn.createStatement();
//4,執(zhí)行語(yǔ)句
ResultSet rs = st.executeQuery("select * from a");
//5,處理執(zhí)行結(jié)果
while (rs.next()) {
System.out.println(rs.getObject(1));
}
//6,關(guān)閉連接,釋放資源
rs.close();
st.close();
conn.close();
}
}
分析JDBC開(kāi)發(fā)步驟
使用JDBC訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟一般如下:
- 加載JDBC驅(qū)動(dòng)程序
- 創(chuàng)建數(shù)據(jù)庫(kù)連接
- 創(chuàng)建Statement對(duì)象
- 執(zhí)行SQL語(yǔ)句
- 處理返回結(jié)果
- 關(guān)閉創(chuàng)建的對(duì)象
開(kāi)發(fā)第一個(gè)JDBC程序
package com.wfu.ch09;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test1 {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");//里面的名字一定不要寫(xiě)錯(cuò),這個(gè)也是導(dǎo)入的
//forName(String className) 返回與帶有給定字符串名的類(lèi)或接口相關(guān)聯(lián)的 Class 對(duì)象。
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/k-user","root","123456");//試圖建立到給定數(shù)據(jù)庫(kù) URL 的連接。
Statement stmt=conn.createStatement(); //創(chuàng)建一個(gè) Statement 對(duì)象來(lái)將 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)。
// String insertsql="insert into k_user(userno,username,pwd) values('1002','張三','123')";
// int x=stmt.executeUpdate(insertsql); //executeUpdate 返回一個(gè)int 型的數(shù)據(jù) 括號(hào)里面是一個(gè)字符串?dāng)?shù)據(jù)類(lèi)型,詳細(xì)內(nèi)容看文檔
//(1) 對(duì)于 SQL 數(shù)據(jù)操作語(yǔ)言 (DML) 語(yǔ)句,返回行計(jì)數(shù)
//(2) 對(duì)于不返回任何內(nèi)容的 SQL 語(yǔ)句,返回 0
// if(x>0){
// System.out.println("插入成功!");
// }
// String updateSql="update k_user set pwd='123456' where userno='1002'";
// int x=stmt.executeUpdate(updateSql);
// if(x>0){
// System.out.println("更新成功!");
// }
String deleteSql="delete from k_user where userno='1002'";
int x=stmt.executeUpdate(deleteSql);
if(x>0){
System.out.println("刪除成功!");
}
String sql="select * from k_user";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
for(int i=1;i<=13;i++){
System.out.print(rs.getString(i)+" ");
}
System.out.println();
}
rs.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.wfu.ch09;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test2 {
public static void main(String[] args) {
try {
// step1:加載JDBC驅(qū)動(dòng)程序
Class.forName("com.mysql.jdbc.Driver");
// step2:建立數(shù)據(jù)庫(kù)的連接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/stock11", "root", "123");
// // step3:創(chuàng)建Statement對(duì)象
Statement st = conn.createStatement();
//step4:執(zhí)行SQL語(yǔ)句
String selectSql="select * from k_user";
//step5:處理結(jié)果集
ResultSet rs=st.executeQuery(selectSql);
while(rs.next()){
for(int i=1;i<=13;i++){
System.out.print(rs.getString(i)+" ");
}
System.out.println();
// String x=rs.getString("hometown");
// System.out.println(x);
}
//step6:關(guān)閉創(chuàng)建的對(duì)象
//關(guān)閉結(jié)果集
rs.close();
//關(guān)閉statement對(duì)象
st.close();
//關(guān)閉連接
conn.close();
// step4: 執(zhí)行SQL語(yǔ)句
//// String insertSql = "insert into k_user(userno,username,pwd) values('1001','tom','123')";
// int x = st.executeUpdate(insertSql);
// if(x>0){
// System.out.println("插入成功!");
// }
// String updateSql="update k_user set pwd='123456' where userno='1001'";
// int x=st.executeUpdate(updateSql);
// if(x>0){
// System.out.println("更新成功!");
// }
// String deleteSql="delete from k_user where userno='1001'";
// int x=st.executeUpdate(deleteSql);
// if(x>0){
// System.out.println("刪除成功!");
// }
//
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
各個(gè)語(yǔ)句說(shuō)明
加載JDBC驅(qū)動(dòng)程序
加載驅(qū)動(dòng)程序的方法:
Class.forName("DriverName")
其中DriverName是要加載的JDBC驅(qū)動(dòng)程序名稱。驅(qū)動(dòng)程序名稱根據(jù)數(shù)據(jù)庫(kù)廠商提供的JDBC驅(qū)動(dòng)程序的種類(lèi)來(lái)確定。
加載MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的方法為:
Class.forName("com.mysql.jdbc.Driver");
加載Oracle數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的方法為:
創(chuàng)建數(shù)據(jù)庫(kù)連接-1
DriverManager類(lèi)是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間,跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。該類(lèi)負(fù)責(zé)加載、注冊(cè)JDBC驅(qū)動(dòng)程序,管理應(yīng)用程序和已注冊(cè)的驅(qū)動(dòng)程序的連接。
DriverManager的常用方法:
| 方法名 | 功能說(shuō)明 |
|---|---|
| Static connection getConnection(String url, String user, String password) | 用于建立到指定數(shù)據(jù)庫(kù) URL 的連接。其中url為 提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)位置的方法,user為用戶名,password為密碼 |
| static Driver getDriver(String url) | 用于返回能夠打開(kāi)url所指定的數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序 |
使用DriverManager類(lèi)的getConnection()創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接:
Connection conn = DriverManager.getConnection(String url,String user,String password);
創(chuàng)建數(shù)據(jù)庫(kù)連接-2
URL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)位置的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能夠識(shí)別該數(shù)據(jù)庫(kù)并與它建立連接。
JDBC URL由三個(gè)部分組成:
jdbc : < subprotocol> : < subname>
可以根據(jù)子協(xié)議的改變而變化。
是子協(xié)議,指數(shù)據(jù)庫(kù)連接的方式。
創(chuàng)建數(shù)據(jù)庫(kù)連接-3
對(duì)于MySQL驅(qū)動(dòng)的連結(jié)的URL是:
jdbc:mysql://serverName:port/instance
- mysql為子協(xié)議名稱
- serverName為MySQL數(shù)據(jù)庫(kù)服務(wù)器名稱,可以是一個(gè)域名,也可以是IP地址
- port為MySQL數(shù)據(jù)庫(kù)的端口號(hào),默認(rèn)為3306
- instance是數(shù)據(jù)庫(kù)的實(shí)例名
示例:
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/haier", "root", "123");
創(chuàng)建SQL 語(yǔ)句
創(chuàng)建完連接之后,可以通過(guò)此連接向目標(biāo)數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。在發(fā)送SQL語(yǔ)句之前,須創(chuàng)建一個(gè)Statement類(lèi)的對(duì)象,該對(duì)象負(fù)責(zé)將SQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)。如果SQL語(yǔ)句運(yùn)行后產(chǎn)生結(jié)果集,Statement對(duì)象會(huì)將結(jié)果集封裝成ResultSet對(duì)象并返回。
通過(guò)調(diào)用Connection接口的createStatement方法來(lái)創(chuàng)建Statement對(duì)象,如:
Statement smt = conn.createStatement();
執(zhí)行SQL語(yǔ)句
在Statement接口中有兩個(gè)非常重要的方法,分別是executeUpdate方法和executeQuery方法。使用executeUpdate方法可以執(zhí)行插入、修改和刪除等操作的SQL語(yǔ)句, executeUpdate方法的返回值是一個(gè)int類(lèi)型數(shù)值,表示更新數(shù)據(jù)表的行數(shù)。使用 executeQuery方法可以執(zhí)行數(shù)據(jù)庫(kù)查詢操作的SQL語(yǔ)句,他的返回值是實(shí)現(xiàn)ResultSet接口的對(duì)象,在其中保存從數(shù)據(jù)庫(kù)中查詢出來(lái)的數(shù)據(jù)。
例如:
int row=stmt.executeUpdate(sql);
寫(xiě)到這,對(duì)于sql命令的展開(kāi)沒(méi)有進(jìn)行詳細(xì)的說(shuō)明,在上面的例子中的代碼中有很多注釋,都有了詳細(xì)的說(shuō)明,對(duì)于如何寫(xiě)一個(gè)jdbc 程序也有了步驟說(shuō)明,而且都是一個(gè)接著一個(gè)的,包括聲明的對(duì)象類(lèi)型,還有一個(gè)注意的地方就是在最后關(guān)閉程序的時(shí)候,也是有順序的,對(duì)于有依賴關(guān)系的語(yǔ)句都是依次關(guān)閉的,在程序的代碼中也是有說(shuō)明的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
- java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法
- Java數(shù)據(jù)庫(kù)連接_jdbc-odbc橋連接方式(詳解)
- JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法
- Java中JDBC實(shí)現(xiàn)動(dòng)態(tài)查詢的實(shí)例詳解
- Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
- 使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例
相關(guān)文章
Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別
這篇文章主要介紹了Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別,文章介紹詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
mybatis的foreach標(biāo)簽語(yǔ)法報(bào)錯(cuò)的解決
這篇文章主要介紹了mybatis的foreach標(biāo)簽語(yǔ)法報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
@Autowired 自動(dòng)注入接口失敗的原因及解決
這篇文章主要介紹了@Autowired 自動(dòng)注入接口失敗的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SSH框架網(wǎng)上商城項(xiàng)目第4戰(zhàn)之EasyUI菜單的實(shí)現(xiàn)
SSH框架網(wǎng)上商城項(xiàng)目第4戰(zhàn)之EasyUI菜單的實(shí)現(xiàn),本文主要使用EasyUI技術(shù)簡(jiǎn)單實(shí)現(xiàn)后臺(tái)菜單,感興趣的小伙伴們可以參考一下2016-05-05
Java中JUC包(java.util.concurrent)下的常用子類(lèi)
相信大家已經(jīng)對(duì)并發(fā)機(jī)制中出現(xiàn)的很多的常見(jiàn)知識(shí)點(diǎn)進(jìn)行了總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中JUC包(java.util.concurrent)下的常用子類(lèi)的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12

