美國網(wǎng)站建設(shè)公司百度官方營銷推廣平臺加載中
JDBC(Java Data Base Connectivity的縮寫)是Java程序操作數(shù)據(jù)庫的API,也是Java程序與數(shù)據(jù)庫相交互的一門技術(shù)。
JDBC是Java操作數(shù)據(jù)庫的規(guī)范,由一組用Java語言編寫的類和接口組成,它對數(shù)據(jù)庫的操作提供基本方法,但對于數(shù)據(jù)庫的細(xì)節(jié)操作由數(shù)據(jù)庫廠商進(jìn)行實(shí)現(xiàn),使用JDBC操作數(shù)據(jù)庫,需要數(shù)據(jù)庫廠商提供數(shù)據(jù)庫的驅(qū)動(dòng)程序。
關(guān)于Java程序與數(shù)據(jù)庫相交互的示意圖如下圖所示。
JDBC(Java Database Connectivity) Java數(shù)據(jù)庫連接,是一組用來按照統(tǒng)一方式訪問數(shù)據(jù)庫的API。它向程序員提供了獨(dú)立于數(shù)據(jù)庫的統(tǒng)一接口,可以使開發(fā)人員不必考慮所用的特定數(shù)據(jù)庫便可編寫應(yīng)用程序,實(shí)現(xiàn)了Java與數(shù)據(jù)庫的互連。
由一組用Java語言編寫的類和接口組成。它能夠:與數(shù)據(jù)庫建立連接、發(fā)送SQL語句、處理結(jié)果JDBC的主要接口
java.sql.Driver:任何驅(qū)動(dòng)程序類都應(yīng)該實(shí)現(xiàn)這個(gè)接口。讀取數(shù)據(jù)庫驅(qū)動(dòng)器的信息、提供connect方法用于建立訪問數(shù)據(jù)庫所用的Connection對象
java.sql.DriverManager:用于管理JDBC驅(qū)動(dòng)程序一個(gè)接口(使用此接口能夠獲得與相應(yīng)數(shù)據(jù)庫的連接)
java.sql.Connection:表示驅(qū)動(dòng)程序與數(shù)據(jù)庫之間的連接。(使用此連接可以創(chuàng)建一個(gè)Statement對象)
java.sql.Statement:能對數(shù)據(jù)庫執(zhí)行SQL語句,并得到返回的結(jié)果
java.sql.ResultSet:表示從數(shù)據(jù)庫服務(wù)器返回的結(jié)果集。
ResultSet 有如下幾個(gè)方法
1. boolean? next()
用于將 ResultSet定位到下一行。
ResultSet最初是定位在第0行上的,此時(shí)應(yīng)該先調(diào)用? next()方法將其定位到第1行上,然后才可輸出。當(dāng) ResultSet已經(jīng)到了最后一行時(shí),再調(diào)用next()方法,則返回 false。
2. getXXX()
當(dāng) ResultSet已經(jīng)定位在某一行上時(shí),使用 getXxx ()方法得到這一行上單個(gè)字段的值。針對不同的字段類型,調(diào)用不同的getXxx ()方法(getString(col), getDate(col), getInt(col),…)
例:如果表中的第一個(gè)字段,字段名為“name”,是文本型的; 則可以使用getString
(1)或 getString(“name”)來得到它的值。
如果表中的第三個(gè)字段,字段名為“score”,是數(shù)值型的; 則可以使用getFloat(3)或 getFloat(“score”)來得到它的值。顯示結(jié)果集中所有記錄的前兩列:
while(rs.next())
{
name =rs.getString(1);
phone =rs.getString(2);
System.out.println(name+","+phone);
}
JDBC連接數(shù)據(jù)庫的過程
在了解了JDBC與數(shù)據(jù)庫后,下面向大家介紹使用JDBC操作數(shù)據(jù)的開發(fā)流程,其關(guān)鍵步驟如下:(1)注冊數(shù)據(jù)庫驅(qū)動(dòng) :加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器Class.forName(“com.mysql.jdbc.Driver”);
(2)構(gòu)建數(shù)據(jù)庫連接URL? ? ?“JDBC協(xié)議+IP地址或域名+端口+數(shù)據(jù)庫名稱”
MySQL連接URL的字符串為:“jdbc:mysql://localhost:3306/test”
(3)獲取Connection對象
注冊了數(shù)據(jù)庫驅(qū)動(dòng)及構(gòu)建數(shù)據(jù)庫URL后,通過驅(qū)動(dòng)管理器獲取數(shù)據(jù)庫的連接Connection,Connection對象是JDBC封裝的數(shù)據(jù)庫連接對象,創(chuàng)建此對象后,才可以對數(shù)據(jù)庫進(jìn)行相關(guān)操作:DriverManager.getConnection(url, username, password);
使用JDBC驅(qū)動(dòng)程序訪問數(shù)據(jù)庫
獲取相應(yīng)數(shù)據(jù)庫的jdbc驅(qū)動(dòng)程序,并將它們保存在指定的位置, 然后重新啟動(dòng)tomcat服務(wù);
連接的具體步驟:以打電話通知同學(xué)為你帶書為例…編寫程序的具體步驟編寫程序
加載驅(qū)動(dòng)程序;---打開手機(jī)、找到電話簿:親人、同學(xué)、朋友
定義所要連接數(shù)據(jù)庫的地址;---定位到同學(xué)
建立與數(shù)據(jù)庫的連接;--撥號給他打電話
建立語句對象;--接通后,你(對象)可以跟他(數(shù)據(jù)庫)交流了
聲明并執(zhí)行SQL語句;--任務(wù):幫你帶書
處理返回的結(jié)果; --給帶或是不能帶
關(guān)閉對象;--掛電話
首先應(yīng)該導(dǎo)入java.sql包。語句為:?<%@ page import="java.sql.*" %>
利用Class.forName()方法加載某一個(gè)數(shù)據(jù)庫的驅(qū)動(dòng)程序。
語法:Class.forName(“JDBC驅(qū)動(dòng)程序類”);
方法:例1:使用JDBC/ODBC橋驅(qū)動(dòng)程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
例2:使用SQLServer的驅(qū)動(dòng)程序:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
經(jīng)過以上其中之一語句的聲明后,驅(qū)動(dòng)程序就會自動(dòng)地加載。
注意:如果classpath路徑中沒有找到所需的驅(qū)動(dòng)程序則會拋出 ClassNotFoundException異常。
通過此步驟,定義要連接的數(shù)據(jù)庫資源
String ODBCURL= " jdbc:odbc:dbName";
String sqlserverURL= " jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbName ";
String mysqlURL= "jdbc:mysql://host:port/dbName ";
String oracleURL= "jdbc:oracle:thin:@host:port:dbName ";
不同數(shù)據(jù)庫連接的地址不同,這點(diǎn)需要特別注意
URL由3部分組成,各個(gè)部分用冒號間隔,格式如下:jdbc:<子協(xié)議>:<子名稱>??????
JDBC URL的3部分可分解如下:jdbc:JDBC中的協(xié)議就是jdbc。
<子協(xié)議>:數(shù)據(jù)庫驅(qū)動(dòng)程序名或數(shù)據(jù)庫連接機(jī)制的名稱。子協(xié)議的典型示例為oracle,它用于連接oracle數(shù)據(jù)庫。
<子名稱>:一種標(biāo)記數(shù)據(jù)庫的方法。子名稱根據(jù)子協(xié)議的不同而不同,使用子名稱的目的是為定位數(shù)據(jù)庫
例如 jdbc:oracle:thin:@[ip]:[port]:[sid]
子協(xié)議現(xiàn)在是 oracle子名稱現(xiàn)在由四部分構(gòu)成:包括驅(qū)動(dòng)程序類型thin、數(shù)據(jù)庫服務(wù)器的IP地址、提供服務(wù)的端口號、數(shù)據(jù)庫的名字
語法:Connection con=DriverManager.getConnection(url,”登錄數(shù)據(jù)庫用戶名”,”登錄密碼”);
例:以SQLServer連接數(shù)據(jù)庫book為例,用戶名為sa,密碼為123
Class.forName(" com.microsoft.jdbc.sqlserver.SQLServerDriver ");
String connStr=" jdbc:microsoft:sqlserver://host:1433;DatabaseName=book";
Connection conn = DriverManager.getConnection(connStr, " sa", " 123");
利用 Connection接口à createStatement() 方法創(chuàng)建語句對象。
例:Statement stmt=conn.createStatement();
語句對象用于執(zhí)行SQL語句。該對象負(fù)責(zé)將SQL語句傳遞給數(shù)據(jù)庫管理系統(tǒng)執(zhí)行;聲明SQL語句,并將該語句通過Statement對象提交給服務(wù)器進(jìn)行執(zhí)行。
String sql= " SELECT * FROM book ";//上面的語句用于從book表中查詢所有記錄。
ResultSet resultSet=stmt.executeQuery(sql);//該語句將sql命令提交給數(shù)據(jù)庫服務(wù)器進(jìn)行執(zhí)行,并將執(zhí)行結(jié)果存儲在ResultSet對象中進(jìn)行執(zhí)行。
Statement接口主要有如下三個(gè)方法:
?1. ResultSet? executeQuery(String sql)以sql語句為參數(shù),執(zhí)行sql查詢語句;
????? 返回ResultSet結(jié)果集(一個(gè)二維表)
例如:
Statement stmt=con.createStatement();
Stringsql= " SELECT * FROM book ";
ResultSet rs=stmt.executeQuery(sql);
2. int? executeUpdate(String sql)
以sql語句為參數(shù),執(zhí)行sql更新語句及DDL語句,如添加、刪除或修改操作,返回被受影響記錄的條數(shù)。例如:
Statement stmt=con.createStatement();
String sql= " delete FROM book where bookid= " + " ‘12335’ ";
int i=stmt.executeUpdate(sql);
System.out.println(i);
3. boolean execute(String sql)
用于執(zhí)行實(shí)現(xiàn)不知道類型的SQL語句,既可以執(zhí)行查詢語句,也可以執(zhí)行更新語句。
常用于動(dòng)態(tài)的處理未知的SQL語句,事先無法知道該SQL語句的具體類型及執(zhí)行的返回值。
執(zhí)行參數(shù)部分的SQL語句:
當(dāng)SQL語句的執(zhí)行結(jié)果是一個(gè)ResultSet結(jié)果集時(shí),本方法返回true;并可以通過StatementàgetResultSet()方法得到返回的結(jié)果集
當(dāng)SQL語句執(zhí)行后沒有返回的結(jié)果集時(shí),該方法返回false
Statement對象負(fù)責(zé)將SQL語句傳遞給數(shù)據(jù)庫管理系統(tǒng)執(zhí)行,返回的是一個(gè)ResultSet的對象。 ?ResultSet對象,稱為結(jié)果集,是符合條件的所有行的集合。
可以通過(first(), last(), previous(), next(), absolute(int), …) 方法瀏覽可滾動(dòng)結(jié)果集中的內(nèi)容rs.close();//關(guān)閉結(jié)果集
stmt.close();//關(guān)閉語句對象
con.close();//關(guān)閉連接
將打開的資源關(guān)閉。注意:資源關(guān)閉的順序和打開的順序恰恰相反。
異常處理? ?數(shù)據(jù)庫訪問中可能會發(fā)生異常(如無法連接),需要做異常處理
編寫Servlet時(shí),需要將訪問數(shù)據(jù)庫代碼放在try-catch結(jié)構(gòu)中,
try { …}catch(SQLExceptionex){ …}
在編寫JSP頁面時(shí),數(shù)據(jù)庫操作可以不寫try-catch, 服務(wù)器將JSP編譯成Servlet時(shí)會自動(dòng)加上try-catch
例7.2 通過JDBC連接MySQL數(shù)據(jù)庫
(1)創(chuàng)建名稱為10.1的動(dòng)態(tài)Web項(xiàng)目,將MySQL數(shù)據(jù)庫的驅(qū)動(dòng)包添加至項(xiàng)目的構(gòu)建路徑,構(gòu)建開發(fā)環(huán)境
(2) 創(chuàng)建程序中的主頁index.jsp,在該頁面中加載數(shù)據(jù)庫驅(qū)動(dòng)并創(chuàng)建數(shù)據(jù)庫連接
應(yīng)用程序?yàn)榱四芎蛿?shù)據(jù)庫交互信息,必須首先和數(shù)據(jù)庫建立連接。目前在開發(fā)中常用的連接數(shù)據(jù)庫的方式是加載JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序。
用Java語言編寫的數(shù)據(jù)庫驅(qū)動(dòng)程序稱作JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序。JDBC可以調(diào)用本地的JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序和相應(yīng)的數(shù)據(jù)庫建立連接,如圖所示。
使用JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序方式和數(shù)據(jù)庫建立連接需要經(jīng)過2個(gè)步驟
①加載JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序
② 和指定的數(shù)據(jù)庫建立連接。
使用JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序訪問數(shù)據(jù)庫時(shí),必須要保證連接數(shù)據(jù)庫的應(yīng)用程序所駐留的計(jì)算機(jī)上安裝有相應(yīng)JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序,比如,Tomcat服務(wù)器上的某個(gè)Web應(yīng)用程序想訪問MySQL數(shù)據(jù)庫管理系統(tǒng)所管理的數(shù)據(jù)庫,那么Tomcat服務(wù)器所駐留的計(jì)算機(jī)上必須要安裝MySQL提供的JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序。
登錄MySQL的官方網(wǎng)站www.mysql.com下載JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序(JDBC Driver for MySQL)。本教材下載的是mysql-connector-java-5.1.28.zip。
解壓后的mysql-connector-java-5.1.28-bin.jar復(fù)制到Tomcat服務(wù)器所使用的JDK的擴(kuò)展目錄中。應(yīng)用程序加載MySQL的JDBC-數(shù)據(jù)庫驅(qū)動(dòng)程序代碼如下:
?try{
Class.forName("com.mysql.jdbc.Driver");
?}? catch(Exception e){
?}
Java.sql包中的DriverManager類有兩個(gè)用于建立連接的類方法:
Connection getConnection(java.lang.String, java.lang.String, java.lang.String)
Connection getConnection(java.lang.String)
數(shù)據(jù)庫服務(wù)器占用的端口是3306,假設(shè)MySQL數(shù)據(jù)庫服務(wù)器所駐留的計(jì)算機(jī)的IP地址是192.168.100.1。應(yīng)用程序要和warehouse建立連接,用戶的id和密碼分別是root、99,
?那么使用Connection getConnection(java.lang.String, java.lang.String, java.lang.String)
方法建立連接的代碼如下:
try{? String uri = "jdbc:mysql:// 192.168.100.1:3306/warehouse"
String user ="root";
String password ="99";
con = DriverManager.getConnection(uri,user,password);
?}catch(SQLException e){
System.out.println(e);
}
使用Connection getConnection(java.lang.String) 方法建立連接的代碼如下:
try{? String uri =" jdbc:mysql:// 192.168.100.1:3306/warehouse?user=root&password=99";
con = DriverManager.getConnection(uri);
}catch(SQLException e){
System.out.println(e);
}
在某些Web程序中需要避免操作數(shù)據(jù)庫出現(xiàn)中文亂碼,那么需要使用
Connection getConnection(java.lang.String) 方法建立連接,連接中的代碼是(假設(shè)用戶是root,其密碼是99):
String uri = "jdbc:mysql://127.0.0.1/warehouse?"+"user=root&password=&characterEncoding=gb2312";
con = DriverManager.getConnection(uri);
應(yīng)用程序一旦和某個(gè)數(shù)據(jù)庫建立連接,就可以通過SQL語句和該數(shù)據(jù)庫中的表交互信息,比如查詢、修改、更新表中的記錄
JDBC在Java Web中的應(yīng)用
1、開發(fā)模式
???????在Java Web開發(fā)使用JDBC,應(yīng)遵循MVC的設(shè)計(jì)思想,從而使用Web程序擁有一定的健壯性、可擴(kuò)展性。JDBC應(yīng)用于Java Web開發(fā)中,處于MVC之中的模型層位置,如下圖所示。
2、分頁查詢
分頁查詢是Java Web開發(fā)之中十分常用的技術(shù)。在數(shù)據(jù)庫量非常大的情況下,不適合將所有數(shù)據(jù)顯示到一個(gè)頁面之中,既給查看帶來有便,又占用了程序及數(shù)據(jù)庫的資源,此時(shí)就需要對數(shù)據(jù)進(jìn)行分頁查詢。
通過JDBC實(shí)現(xiàn)分頁查詢的方法有很多種,而且不同的數(shù)據(jù)庫機(jī)制也提供了不同的分頁方式,兩種非常典型的分頁方法。
1、通過ResultSet的光標(biāo)實(shí)現(xiàn)分頁
2、通過數(shù)據(jù)庫機(jī)制進(jìn)行分頁
連接MySQL數(shù)據(jù)庫和連接Oracle數(shù)據(jù)庫的方法非常類似。只是有兩個(gè)地方需要注意一下
1. 需要把MySQL的驅(qū)動(dòng)程序mysql-connector-java-5.0.4-bin.jar部署到“/WEB-INF/lib/”下。(MySQL驅(qū)動(dòng)程序可以從其官方網(wǎng)站www.mysql.com上下載)
2). 注冊驅(qū)動(dòng)程序和獲取連接的語句變?yōu)?#xff1a;
Class.forName("com.mysql.jdbc.Driver");或者Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://[ip]:[port]/[sid]","Login","password");
例:
<%@page contentType="text/html; charset=GBK" %>
<%@page import="java.sql.*" %>
<%
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/book","root",“123");
Statement stmt = con.createStatement();
stmt.executeUpdate("create table table1(id int, name varchar(30))");
stmt.executeUpdate("insert into table1 values(10, 'java')");
stmt.executeUpdate("insert into table1 values(20, 'JSP')");
out.print("table1 has been created!");
stmt.close(); con.close();
%>