JDBC--Java Database Connectivity
?
1.JDBC:Java DataBase Connectivity ?可以為多種關(guān)系型數(shù)據(jù)庫DBMS 提供統(tǒng)一的訪問方式,用Java來操作數(shù)據(jù)庫
2.JDBC API 主要功能:
三件事,具體是通過以下類/接口實(shí)現(xiàn):
DriverManager : 管理jdbc驅(qū)動
Connection: 連接(通過DriverManager產(chǎn)生)
Statement(PreparedStatement) :增刪改查 ?(通過Connection產(chǎn)生 )
CallableStatement ?: 調(diào)用數(shù)據(jù)庫中的 存儲過程/存儲函數(shù) ?(通過Connection產(chǎn)生 )
Result :返回的結(jié)果集 ?(上面的Statement等產(chǎn)生 )
Connection產(chǎn)生操作數(shù)據(jù)庫的對象:
Connection產(chǎn)生Statement對象:createStatement()
Connection產(chǎn)生PreparedStatement對象:prepareStatement()
Connection產(chǎn)生CallableStatement對象:prepareCall();
Statement操作數(shù)據(jù)庫:
增刪改:executeUpdate()
查詢:executeQuery();
ResultSet:保存結(jié)果集 select * from xxx
next():光標(biāo)下移,判斷是否有下一條數(shù)據(jù);true/false
previous(): ?true/false
getXxx(字段名|位置):獲取具體的字段值?
PreparedStatement操作數(shù)據(jù)庫:
public interface PreparedStatement extends Statement?
因此
增刪改:executeUpdate()
查詢:executeQuery();
--此外
賦值操作 setXxx();
PreparedStatement與Statement在使用時的區(qū)別:
1.Statement:
sql
executeUpdate(sql)
2.
PreparedStatement:
sql(可能存在占位符?)
在創(chuàng)建PreparedStatement 對象時,將sql預(yù)編譯 prepareStatement(sql)
executeUpdate()
setXxx()替換占位符?
推薦使用PreparedStatement:原因如下:
1.編碼更加簡便(避免了字符串的拼接)
String name = "zs" ;
int age = 23 ;
stmt:
String sql =" insert into student(stuno,stuname) values('"+name+"', ?"+age+" ) ? ?" ;
stmt.executeUpdate(sql);
pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//預(yù)編譯SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
2.提高性能(因為 有預(yù)編譯操作,預(yù)編譯只需要執(zhí)行一次)
需要重復(fù)增加100條數(shù)?
stmt:
String sql =" insert into student(stuno,stuname) values('"+name+"', ?"+age+" ) ? ?" ;
for(100)
stmt.executeUpdate(sql);
pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//預(yù)編譯SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
for( 100){
pstmt.executeUpdate();
}
3.安全(可以有效防止sql注入)
sql注入: 將客戶輸入的內(nèi)容 ?和 開發(fā)人員的SQL語句 混為一體
stmt:存在被sql注入的風(fēng)險 ?
(例如輸入 ?用戶名:任意值 ' or 1=1 --
?? ? ? 密碼:任意值)
分析:
select count(*) from login where uname='任意值 ' or 1=1 --' and upwd ='任意值' ?;
select count(*) from login where uname='任意值 ' or 1=1 ;
select count(*) from login ;
select count(*) from login where uname='"+name+"' and upwd ='"+pwd+"'?
pstmt:有效防止sql注入
推薦使用pstmt
3.jdbc訪問數(shù)據(jù)庫的具體步驟:
a.導(dǎo)入驅(qū)動,加載具體的驅(qū)動類
b.與數(shù)據(jù)庫建立連接
c.發(fā)送sql,執(zhí)行
d.處理結(jié)果集 (查詢)
4.
數(shù)據(jù)庫驅(qū)動
?? ??? ?驅(qū)動jar?? ??? ??? ??? ??? ?具體驅(qū)動類?? ??? ??? ??? ??? ??? ?連接字符串
Oracle?? ??? ?ojdbc-x.jar?? ??? ??? ??? ?oracle.jdbc.OracleDriver?? ??? ??? ??? ?jdbc:oracle:thin:@localhost:1521:ORCL
MySQL?? ??? ?mysql-connector-java-x.jar?? ??? ?com.mysql.jdbc.Driver?? ??? ??? ??? ??? ?jdbc:mysql://localhost:3306/數(shù)據(jù)庫實(shí)例名
SqlServer?? ?sqljdbc-x.jar?? ??? ??? ??? ?com.microsoft.sqlserver.jdbc.SQLServerDriver?? ??? ?jdbc:microsoft:sqlserver:localhost:1433;databasename=數(shù)據(jù)庫實(shí)例名
使用jdbc操作數(shù)據(jù)庫時,如果對數(shù)據(jù)庫進(jìn)行了更換,只需要替換:驅(qū)動、具體驅(qū)動類、連接字符串、用戶名、密碼
?
總結(jié)
以上是生活随笔為你收集整理的JDBC--Java Database Connectivity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--542. 01 矩阵
- 下一篇: Leetcode--322. 零钱兑换