jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准
JDBC概述
API
JDBC(Java DataBase Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
要想徹底了解JDBC首先就必須要搞清楚JDBC的API到底有什么。
JDBC的API主要都被存放在java.sql和javax.sql中,前者是Java核心包而后者是擴展包,java類庫是Java發(fā)布之初就確定了的基礎(chǔ)庫,而javax類庫則是在上面增加的一層?xùn)|西,就是為了保持版本兼容要保存原來的,但有些東西有了更好的解決方案,典型的就是awt(Abstract Windowing ToolKit) 和swing。
一般而言,我們在程序設(shè)計中使用較多的是java.sql而非javax.sql。java.sql類庫中包含的是一些接口和方法
java.sql常用API
DriverManager 類
建立與驅(qū)動程序的連接
Driver 接口
提供用來注冊和連接基于 JDBC 技術(shù)(“JDBC驅(qū)動程序”)的驅(qū)動程序的 API,通常僅由 DriverManager 類使用
Connection 接口
提供創(chuàng)建語句以及管理連接及其屬性的方法
Statement
用于發(fā)送基本 SQL 語句
PreparedStatement
PreparedStatement:用于發(fā)送準備好的語句或基本 SQL 語句(派生自 Statement)
CallableStatement
用于調(diào)用數(shù)據(jù)庫存儲過程(派生自 PreparedStatement)
ResultSet 接口
獲取和更新查詢的結(jié)果
Date 類
SQL DATE 的映射關(guān)系
SQLData 接口
指定 UDT 到此類的一個實例的映射關(guān)系
形象記憶
你可以將客戶端和服務(wù)器想象成一條河的兩岸,那么為了使兩岸之間有聯(lián)系,我們就需要根據(jù)河的寬度來架橋,而與這條河相對應(yīng)架起的這座橋我們稱之為DriverManager;而要通過橋進行兩岸的貿(mào)易往來就必須要進行聘請搬運工來搬運雙方交易的貨物,這樣的搬運工我們稱他們?yōu)镃onnection;這種搬運工假設(shè)有高度的自主能動性,能夠根據(jù)兩岸的具體需求來搬運相應(yīng)的貨物,而這種行為的發(fā)生是由于它們有一個叫Statement的大腦神經(jīng)元,這個神經(jīng)元可以自由地控制搬運工的行為發(fā)生;為了存儲搬運工辛苦成果,兩岸必須各自建立一個存儲貨物的倉庫,我們叫它ResultSet。
它們之間的關(guān)系大概就是這樣的:
連接數(shù)據(jù)庫
基本步驟
1.加載數(shù)據(jù)庫連接相應(yīng)的驅(qū)動類
2.調(diào)用數(shù)據(jù)庫接口,建立數(shù)據(jù)庫連接
3.創(chuàng)建數(shù)據(jù)庫具體的操作對象
4.設(shè)計要運行的SQL語句
5.收集處理結(jié)果集
6.關(guān)閉JDBC對象及其相關(guān)的類
重點說明
NO1.注冊驅(qū)動程序的三種方法:
一、Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
通過Class把類先裝載到j(luò)ava的虛擬機中,并沒有創(chuàng)建Driver類的實例。
二、DriverManager.registerDriver(new?com.microsoft.sqlserver.jdbc.SQLServerDriver());
jdbc是使用橋的模式進行連接的,即橋連接。DriverManager就是管理數(shù)據(jù)庫驅(qū)動的一個類,java.sql.Driver就是一個提供注冊數(shù)據(jù)庫驅(qū)動的接口,而com.microsoft.sqlserver.jdbc.SQLServerDriver()是 java.sql.Driver接口的一個具體實現(xiàn)。
三、System.setProperty("jdbc.drivers",?"com.microsoft.sqlserver.jdbc.SQLServerDriver");
多個驅(qū)動使用冒號分隔開,在連接時JDBC會按順序搜索,直到找到第一個能成功連接指定URL的驅(qū)動程序。
推薦使用第一種方法,理由有兩點:
1.第一種方法的好處在于能夠在編譯時不依賴于特定的JDBC Driver庫,也就是減少了項目代碼的依賴性,而且也很容易改造成從配置文件讀取JDBC配置,從而可以在運行時動態(tài)更換數(shù)據(jù)庫連接驅(qū)動,而第二種方法則不可以這樣做,它一定要有JDBC的驅(qū)動才可以通過編譯,這樣對我們的程序就有很多的壞處,尤其是為以后換數(shù)據(jù)庫帶來麻煩。
2.我們通過Driver類的源碼可以了解到,Driver類中就有一個靜態(tài)的代碼塊,只要我們執(zhí)行了Driver類中的靜態(tài)代碼塊,并把驅(qū)動的實例放入到Drivers的一個數(shù)組列表中,我們再調(diào)用方法registerDriver就相當(dāng)于又向Drivers列表中放了一次Driver驅(qū)動,雖然這并不影響我們程序,但是這樣做實在是沒有必要,反而會影響程序的運行。事實上第二種和第三種方法都要創(chuàng)建Driver類實例。
NO2.調(diào)用接口,建立連接:
Connection conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Pet", "sa", "123456");
jdbc:sqlserver類似于網(wǎng)絡(luò)協(xié)議,讓Java知道要干什么;localhost:1433是主機地址及端口,讓java知道目標在哪兒;后面的就是數(shù)據(jù)庫的表名,用戶名,密碼,沒有這些,數(shù)據(jù)庫就會不理睬Java的請求。
NO3.創(chuàng)建一個Statement對象:
Statement state=conn.createStatement();
PreparedStatement pst=conn.prepareStatement(sql);
上面提供了兩種方法用來創(chuàng)建Statement對象,凡是要向數(shù)據(jù)庫發(fā)送SQL語句時,都需要創(chuàng)建Statement接口或者PreparedStatement接口。PreparedStatement:預(yù)編譯的Statement接口,具體操作步驟如下
第一步:通過連接獲得PreparedStatement接口對象,用帶占位符(?)的sql語句構(gòu)造。
PreparedStatement ps=con.praperedStatement("select * from Pet where id=?");
第二步:設(shè)置參數(shù)
ps.setString(1,"3");
第三步:執(zhí)行sql語句
rs= ps.executeQuery();
PreparedStatement(預(yù)編譯)的優(yōu)點:
a.執(zhí)行SQL語句使用預(yù)編譯的方式。Statement直接將SQL語句發(fā)送到數(shù)據(jù)庫。PreparedStatement安全性要更高一些。
b.使用占位符的方式拼接SQL中的參數(shù),SQL更加的簡潔。
除此之外,如果執(zhí)行多條只有參數(shù)值不同SQL語句時,預(yù)編譯的PreparedStatement執(zhí)行效率會明顯比非預(yù)編譯的Statement高許多。
所以在實際操作中應(yīng)當(dāng)盡可能地使用預(yù)編譯。
NO4.導(dǎo)入SQL語句到對象中并返回結(jié)果:
String sql="select*from msg";
ResultSet rs=state.executeQuery(sql);//返回一個查詢到的結(jié)果集
ResultSet rs2=state.executeUpdate(sql);//返回值為 int 型,表示影響記錄的條數(shù)
NO5.收集返回的結(jié)果集:
executeQuery(sql)用于執(zhí)行DQL數(shù)據(jù)查詢語言,通過使用select語句返回一個結(jié)果集ResultSet,而后再遍歷得到查詢結(jié)果?;
ResultSet.next()會根據(jù)下標來獲取數(shù)據(jù),與數(shù)組不同的是數(shù)據(jù)庫中第一條記錄的下標是1而非0;
executeUpdate(sql)則用于執(zhí)行DML數(shù)據(jù)操作語言(增加,刪除,修改,返回int,表示語句影響行數(shù));
NO6.解除與數(shù)據(jù)庫的連接:
尤其要注意close()的順序!
要按先 ResultSet ,再Statement,最后Connetction的順序關(guān)閉資源。因為ResultSet和Statement在連接的情況下才能使用,所以在連接使用結(jié)束后可能還有其他的Statement還在連接,所以不能先關(guān)閉Connection。
再借用之前舉的例子,你想啊,如果橋上的搬運工還沒搬完貨物就先把橋撤了會怎么樣。
實戰(zhàn)演練
JDBCDemo01連接數(shù)據(jù)庫
那些被注釋掉的代碼可以試著解除注釋運行一下,會發(fā)現(xiàn)新的大陸。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 數(shù)據(jù)庫連接步驟
* @author Administrator
*
*/
public class JDBCDemo01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加載數(shù)據(jù)庫連接的驅(qū)動類
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//數(shù)據(jù)庫的接口
Connection conn=
DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Pet",
"sa", "123456");
//SQL語句(數(shù)據(jù))處理的接口
// DQL數(shù)據(jù)查詢語言(查詢,返回結(jié)果集)
// DML數(shù)據(jù)操作語言(增加,刪除,修改,返回int,表示語句影響行數(shù))
//創(chuàng)建具體操作對象
Statement state=conn.createStatement();
String sql="select*from msg";
//執(zhí)行SQL語句,返回結(jié)果集
ResultSet rs=state.executeQuery(sql);
//使用循環(huán)遍歷結(jié)果集中的數(shù)據(jù)
while(rs.next()){
//根據(jù)下標獲取數(shù)據(jù),下標是從1開始(列數(shù))
//System.out.println(rs.getString(1)+
//" "+rs.getString(2));
//根據(jù)列名取數(shù)據(jù)
System.out.println(rs.getString("id")+" "+
rs.getString("info"));
}
//關(guān)閉JDBC對象及其相關(guān)類
rs.close();
state.close();
conn.close();
//System.out.println(conn);
}
}
感謝您的閱讀
總結(jié)
以上是生活随笔為你收集整理的jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: orm和mysql_orm与mysql
- 下一篇: jquery ajax mysql登录_