JDBC
1.1 概念
概念:Java DataBase Connectivity 卸夕,Java 數(shù)據(jù)庫連接邢锯,JDBC讓我們可以通過Java操作數(shù)據(jù)庫
JDBC本質(zhì):它是官方推出的一套專門用于操作關(guān)系型數(shù)據(jù)庫的規(guī)則,就是接口。各個(gè)不用的數(shù)據(jù)庫廠商都去實(shí)現(xiàn)這個(gè)接口楣嘁,并提供相應(yīng)的jar包性宏。我們可以使用這些jar包針對不同的關(guān)系型數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫的操作亥鸠。
1.2 使用步驟
導(dǎo)入jar包(數(shù)據(jù)庫驅(qū)動(dòng)包)mysql-connector-java-5.1.37-bin.jar
導(dǎo)入步驟:
在項(xiàng)目的根目錄下創(chuàng)建 libs 文件夾
將驅(qū)動(dòng)包復(fù)制到 libs 下
右鍵選中此 jar 文件朵纷,點(diǎn)擊 Build Path ,再點(diǎn)擊? Add to Build Path
注:如果導(dǎo)入 jar包報(bào)錯(cuò)晤郑,需要?jiǎng)h除敌呈,刪除的步驟是
右鍵項(xiàng)目,選中 Build Path造寝,選擇 Configure Build Path
找到 libraries 標(biāo)簽頁磕洪,選擇指定的資源點(diǎn)擊 remove
注冊驅(qū)動(dòng)
獲取數(shù)據(jù)庫連接對象
定義SQL語句
獲取執(zhí)行SQL語句的對象
執(zhí)行
接收返回的結(jié)果
處理結(jié)果
釋放資源
1.3 常見錯(cuò)誤
ClassNotFoundException:找不到類,一般是驅(qū)動(dòng)包的類名問題
Unknown database 'xxx':找不到數(shù)據(jù)庫诫龙,一般是數(shù)據(jù)庫庫名的問題
Access denied for user 'xxx'@'localhost' (using password: YES):訪問數(shù)據(jù)庫被拒絕析显,一般是數(shù)據(jù)庫的用戶名或者密碼有誤
SQLException:數(shù)據(jù)庫異常
MySQLSyntaxErrorException:數(shù)據(jù)庫語法錯(cuò)誤
1.4 細(xì)節(jié)問題
注冊驅(qū)動(dòng):告知程序要使用哪一個(gè)數(shù)據(jù)庫的jar包
Class.forName("com.mysql.jdbc.Driver");
注:mysql5版本以后,注冊驅(qū)動(dòng)的語句可以省略
Connection連接對象
/*
* 參數(shù):
* 1.要連接的數(shù)據(jù)庫:
jdbc:mysql://地址:端口號/庫名 ; 如果地址是本機(jī)签赃,端口是3306叫榕,那么可以寫成:jdbc:mysql:///庫名
* 2.數(shù)據(jù)庫管理員身份的用戶名
* 3.數(shù)據(jù)庫管理員身份的密碼
*/
Connectionconn=DriverManager.getConnection("jdbc:mysql:///0519pm","root","1234");
Statement執(zhí)行對象
用于執(zhí)行SQL語句
executeUpdate(String sql):執(zhí)行增刪改查浑侥,返回 int 值,表示影響的記錄數(shù)
executeQuery(String sql):執(zhí)行查詢晰绎,返回結(jié)果集 ResultSet
ResultSet結(jié)果集對象
用于封裝查詢后的結(jié)果
方法:
next():判斷是否有下一條可遍歷的記錄,返回布爾值
getXxx(參數(shù)):該方法有重載括丁,參數(shù)可以是int荞下,也可以是String;參數(shù)是int時(shí)字段值根據(jù)字段在結(jié)果集中的第幾列獲仁贩伞尖昏;參數(shù)是String時(shí)字段值根據(jù)字段名獲取。
ResultSet构资、Statement抽诉、Connection都需要釋放 close()
形參與SQL語句中的關(guān)鍵字之間要有空格,否則關(guān)鍵字與參數(shù)拼接會(huì)報(bào)錯(cuò)
1.5 SQL注入問題
用一些關(guān)鍵字與字符串進(jìn)行拼接吐绵,會(huì)造成造成安全性的問題
例如:select * from user where username = 'qwer' and password = '1234' or '1' = '1'迹淌; '1' = '1' 是一個(gè)恒等式結(jié)果永遠(yuǎn)為true,而 '1' = '1'前又使用了or關(guān)鍵字己单,從而導(dǎo)致了用戶名和密碼有誤也能成功登錄唉窃。
解決辦法:使用PreparedStatement對象
1.? 參數(shù)參與SQL語句不再使用字符串的拼接,而使用了占位符
占位符中的關(guān)鍵字纹笼,不再以關(guān)鍵字的形態(tài)出現(xiàn)
1.5.1 PreparedStatement的獲取
PreparedStatement pstmt = conn.preparedStatement(String sql)纹份;
將SQL語句預(yù)編譯
1.5.2 PreparedStatement的功能
為占位符設(shè)置值
setXxx(參數(shù)1,參數(shù)2)
參數(shù)1:問號的位置廷痘,從1開始
參數(shù)2:問號位置上的值
執(zhí)行SQL
executeUpdate():執(zhí)行增刪改查蔓涧,返回 int 值,表示影響的記錄數(shù)
executeQuery():執(zhí)行查詢笋额,返回結(jié)果集 ResultSet