您好,登錄后才能下訂單哦!
1.JDBC的設(shè)計(jì)
從一開始,Java技術(shù)開發(fā)人員就意識(shí)到了Java在數(shù)據(jù)庫應(yīng)用方面的巨大潛力。從1995年開始,他們就致力于擴(kuò)展Java標(biāo)準(zhǔn)類庫,使之可以運(yùn)用SQL訪問數(shù)據(jù)庫。他們最初希望通過擴(kuò)展Java,就可以讓人們“純”用Java語言與任何數(shù)據(jù)庫進(jìn)行通信。但是,他們很快發(fā)現(xiàn)這是一項(xiàng)無法完成的任務(wù):因?yàn)闃I(yè)界存在許多不同的數(shù)據(jù)庫,且他們所使用的協(xié)議也各不相同。盡管許多數(shù)據(jù)庫供應(yīng)商都表示支持Java提供一套數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議,但是每一家企業(yè)都希望Java能采用自己的網(wǎng)絡(luò)協(xié)議。
所有的數(shù)據(jù)庫供應(yīng)商和工具開發(fā)商都認(rèn)為,如果Java能夠?yàn)镾QL訪問提供一套“純”JavaAPI,同時(shí)提供一個(gè)驅(qū)動(dòng)管理器,以允許第三方驅(qū)動(dòng)程序可以連接到特定的數(shù)據(jù)庫,那它就會(huì)顯得非常有用。這樣,這樣數(shù)據(jù)庫供應(yīng)商就可以提供自己的驅(qū)動(dòng)程序,將其插入到驅(qū)動(dòng)管理器中。這將成為一種向驅(qū)動(dòng)管理器注冊(cè)第三方驅(qū)動(dòng)程序的簡(jiǎn)單機(jī)制。
這種接口組織方式遵循了微軟公司非常成功的ODBC模式,ODBC為C語言訪問數(shù)據(jù)庫提供了一套編程接口。JDBC和ODBC都基于同一個(gè)思想:根據(jù)API編寫的程序都可以與驅(qū)動(dòng)管理器進(jìn)行通信,而驅(qū)動(dòng)管理器則通過驅(qū)動(dòng)程序與實(shí)際的數(shù)據(jù)庫進(jìn)行通信。
所有這些都意味著JDBC API是大部分程序員不得不使用的接口。
JDBC:java database connectivity SUN公司提供的一套操作數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。
JDBC與數(shù)據(jù)庫驅(qū)動(dòng)的關(guān)系:接口與實(shí)現(xiàn)的關(guān)系。
JDBC規(guī)范(掌握四個(gè)核心對(duì)象):
DriverManager:用于注冊(cè)驅(qū)動(dòng)
Connection:表示與數(shù)據(jù)庫創(chuàng)建的連接
Statement:操作數(shù)據(jù)庫sql語句的對(duì)象
ResultSet:結(jié)果集或一張?zhí)摂M表
開發(fā)一個(gè)JDBC程序的準(zhǔn)備工作:
JDBC規(guī)范在哪里:
JDK中:
java.sql.*;
javax.sql.*;
數(shù)據(jù)庫廠商提供的驅(qū)動(dòng):jar文件
*.jar
2.開發(fā)一個(gè)JDBC程序
實(shí)現(xiàn)查詢數(shù)據(jù)庫中的數(shù)據(jù)顯示在java的控制臺(tái)中
1、創(chuàng)建數(shù)據(jù)庫表,并向表中添加測(cè)試數(shù)據(jù)
2、創(chuàng)建java project項(xiàng)目,添加數(shù)據(jù)庫驅(qū)動(dòng)
3、實(shí)現(xiàn)JDBC操作
//1、注冊(cè)驅(qū)動(dòng)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2、創(chuàng)建連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","password");
//3、得到執(zhí)行sql語句的Statement對(duì)象
Statement stmt = conn.createStatement();
//4、執(zhí)行sql語句,并返回結(jié)果
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
//5、處理結(jié)果
while(rs.next()){
System.out.println(rs.getObject(1));
......
}
//6、關(guān)閉資源
rs.close();
stmt.close();
3.JDBC常用的類和接口詳解
1、java.sql.Drivermanager類 : 創(chuàng)建連接
a、注冊(cè)驅(qū)動(dòng)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用
原因有2個(gè):
導(dǎo)致驅(qū)動(dòng)被注冊(cè)2次
強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動(dòng)jar
解決辦法:
Class.forName("com.mysql.jdbc.Driver");
b、與數(shù)據(jù)庫建立連接
static Connection getConnection(String url, String user, String password) //試圖建立到給定數(shù)據(jù)庫 URL 的連接。
getConnection("jdbc:mysql://localhost:3306/day06", "root", "password");
URL:SUN公司與數(shù)據(jù)庫廠商之間的一種協(xié)議。
jdbc:mysql://localhost:3306/mydb1
協(xié)議 子協(xié)議 IP :端口號(hào) 數(shù)據(jù)庫
mysql: jdbc:mysql://localhost:3306/mydb1或者 jdbc:mysql:///mydb1(默認(rèn)本機(jī)連接)
oracle: jdbc:oracle:thin:@localhost:1521:sid
Properties info = new Properties(); //要參考數(shù)據(jù)庫文檔
info.setProperty("user", "root");
info.setProperty("password","password");
getConnection(String url, Properties info)
getConnection(String url)
DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=password");
2、java.sql.Connection接口:一個(gè)連接
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中。所有與數(shù)據(jù)庫交互都是基于連接對(duì)象的。
Statement createStatement(); //創(chuàng)建操作sql語句的對(duì)象
3、java.sql.Statement接口:操作sql語句,并返回相應(yīng)結(jié)果的對(duì)象(小貨車)
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中。用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果的對(duì)象。
ResultSet executeQuery(String sql); //根據(jù)查詢語句返回結(jié)果集。只能執(zhí)行select語句
int executeUpdate(String sql); //根據(jù)執(zhí)行的DML(insert update delete)語句,返回受影響的行數(shù)
boolean execute(String sql); //此方法可以執(zhí)行任意sql語句。返回boolean值,表示是否返回ResultSet結(jié)果集。僅當(dāng)執(zhí)行select語句,且有返回結(jié)果時(shí)返回true, 其它語句都返回false;無錫看婦科的醫(yī)院 http://www.ytsgfk120.com/
4、java.sql.ResultSet接口:結(jié)果集(客戶端存表數(shù)據(jù)的對(duì)象)
a、封裝結(jié)果集的
提供一個(gè)游標(biāo),默認(rèn)游標(biāo)指向結(jié)果集第一行之前
調(diào)用一次next(),游標(biāo)向下移動(dòng)一行
提供一些get方法
封裝數(shù)據(jù)的方法
Object getObject(int columnIndex); //根據(jù)序號(hào)取值,索引從1開始
Object getObject(String ColomnName); //根據(jù)列名取值。
將結(jié)果集中的數(shù)據(jù)封裝到j(luò)avaBean中
java的數(shù)據(jù)類型與數(shù)據(jù)庫中的類型的關(guān)系
java 數(shù)據(jù)庫
byte tityint
short smallint
int int
long bigint
float float
double double
String char varchar
Date date
boolean next(); //將光標(biāo)從當(dāng)前位置向下移動(dòng)一行
int getInt(int colIndex); //以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值
int getInt(String colLabel); //以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
float getFloat(int colIndex); //以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值
float getFloat(String colLabel); //以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
String getString(int colIndex); //以String 形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值
String getString(String colLabel); //以String形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
Date getDate(int columnIndex);
Date getDate(String columnName);
void close(); //關(guān)閉ResultSet 對(duì)象
b、可移動(dòng)游標(biāo)的方法
boolean next(); //將光標(biāo)從當(dāng)前位置向前移一行。
boolean previous(); //將光標(biāo)移動(dòng)到此 ResultSet 對(duì)象的上一行。
boolean absolute(int row); //參數(shù)是當(dāng)前行的索引,從1開始根據(jù)行的索引定位移動(dòng)的指定索引行。
void afterLast(); //將光標(biāo)移動(dòng)到末尾,正好位于最后一行之后。
void beforeFirst(); //將光標(biāo)移動(dòng)到開頭,正好位于第一行之前。
4.SQL注入問題:preparedStatement
preparedStatement:預(yù)編譯對(duì)象, 是Statement對(duì)象的子類
特點(diǎn):
性能要高
會(huì)把sql語句先編譯
sql語句中的參數(shù)會(huì)發(fā)生變化,過濾掉用戶輸入的關(guān)鍵字
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = DBUtils.getConnection();
String sql = "select * from user where name=? and password=?";
ps = conn.prepareStatement(sql); //注:創(chuàng)建此對(duì)象時(shí),要把sql語句先放進(jìn)去
//給預(yù)編譯sql語句賦值
ps.setString(1, name);
ps.setString(2, password);
rs = ps.executeQuery();
}catch(Exception e){
e.printStackTrace();
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。