1......
Driver接口:數(shù)據(jù)庫驅(qū)動程序的接口奕删,所有具體數(shù)據(jù)庫廠商需要的驅(qū)動程序需要實現(xiàn)次接口炼杖。
Connection connect(String url,Properties info)用于獲取數(shù)據(jù)庫連接
2.....
|-Connection接口:與具體的數(shù)據(jù)庫的連接對象合瓢。
Statement ? ? ? ? createStatement()創(chuàng)建一個靜態(tài)sql語句對象
PreparedStatement ? ? ? ?prepareStatement(String sql)創(chuàng)建預(yù)編譯的sql語句對象
(存在sql注入漏洞的bug)
3.....
|-Statement接口:用于執(zhí)行靜態(tài)SQL語句
int ? ? ? ?executeUpdate(String sql)執(zhí)行更新操作的sql語句(create/alter/drop/insert/update/delete)
ResultSet ? ? ?executeQuery(String sql)執(zhí)行查詢操作的sql語句
(select)
(可以防止注入漏洞秩彤,對sql語句進行預(yù)編譯)
|-PreparedStatement接口:用于執(zhí)行預(yù)編譯的SQL語句(是Statement的子接口)
int ? ? ?executeUpdate()執(zhí)行更新操作的sql語句
ResultSet ? ? executeQuery()執(zhí)行查詢操作的sql語句
4......
|-ResultSet接口:結(jié)果集對象肛冶。存儲所有數(shù)據(jù)庫查詢的結(jié)果鲜锚,用該對象進行數(shù)據(jù)遍歷突诬。
booleannext():把光標移動到下一行。如果下一行有數(shù)據(jù)芜繁,返回true旺隙,如果沒有下一行數(shù)據(jù),返回false骏令。
getXXX(列索引|列字段名稱):獲取字段的數(shù)據(jù)
i"=??)
第一種連接操作數(shù)據(jù)庫的方法 ? ? ? 存在sql注入的風險
第一步: 加載驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
第二部:創(chuàng)建鏈接數(shù)據(jù)庫
Connection conn=driverManger.getConnection(url,user,password);
第三部:創(chuàng)建Statement對象
Statement statement=conn.createStatement();
第四步:創(chuàng)建Sql語句
String sql="sql語句";
第五步:執(zhí)行sql語句
如果上面的sql語句是DDL. DML語句 ? 就使用如下代碼:
statement.executeUpdate(sql); ? 可以用int類型去接受
如果上面的sql語句是DQL語句,,就是用如下代碼:
statement.executeQuery(sql); ? 可以用int類型區(qū)接受
第六步: ?關(guān)閉 ?
調(diào)用close方法 ? ? ? ?conn ? ? ? ? statement
if(conn!=null){conn.close()} ? ?statement和conn 一樣
第二種方法 ? 是用Statement的子接口 ? PreparedStatement ? 不會存在sql注入風險
第一步: 加載驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
第二步:創(chuàng)建鏈接數(shù)據(jù)庫
Connection conn=driverManger.getConnection(url,user,password);
第三步:創(chuàng)建sql語句
第四步:創(chuàng)建Preparedstatement對象
Preparedstatement pstat=conn.preparedstatement(sql);
執(zhí)行DDL,DML語句代碼如下
ResultSet rs=pstat.executeupdate(); ? ? Result是個集合 ? ?
執(zhí)行DQL語句代碼如下
ResultSet rs=pstat.executeQuery();
第五步:關(guān)閉
ResultSet也需要關(guān)閉
conn ? ?pstat ? ? ?rs ?三個都要關(guān)閉
statement 和 Preparedstatement的區(qū)別:
1...語法不同 ??
? statement:執(zhí)行的事靜態(tài)sql語句
Preparedstatement:先執(zhí)行預(yù)編譯SQL語句: 可以用 ? 進行參數(shù)占位 ?后面給參數(shù)賦值
? ? 比如1: ? ? ?String sql="select * from user where uid=?;";
? ? ? ? ? ? ? ? ? ? ?pstat.setInt(1,值);
? ? ? ? ? ? ? ? ? ? int是根據(jù)sql語句 列字段(Uid)的類型, ? 1是第幾個? ? ?值是填?的 ?
? ? 比如2: ? ? ? ? String sql ="INSERT INTO student(NAME,gender)
VALUES(?,?)";//預(yù)編譯sql:使用蔬捷?號代替參數(shù)值。一個?號代表一個參數(shù)值
2...原理不同
statement:不能進行緩存
Preparedstatement:可以進行緩存,執(zhí)行效率比statement快
3...安全問題
statement:不能防止sql注入
Preparedstatement:可以防止sql注入
JDBC的批處理:
Statement批處理:
? ? ? ? ? ? ? ? ? ? ?void ? ? ?addBatch(String sql)添加sql到緩存區(qū)(暫時不發(fā)送)
? ? ? ? ? ? ? ? ? ? ?int[] ? ? ?executeBatch()執(zhí)行批處理命令周拐。發(fā)送所有緩存區(qū)的sql
? ? ? ? ? ? ? ? ? ? ? void ? ? ? clearBatch()清空sql緩存區(qū)
PreparedStatement批處理:
? ? ? ? ? ? ? ? ? void ? ? addBatch()添加參數(shù)到緩存區(qū)
? ? ? ? ? ? ? ? ?int[] ? ? ?executeBatch()執(zhí)行批處理命令铡俐。發(fā)送所有緩存區(qū)的sql
? ? ? ? ? ? ? ? void ? ? ?clearBatch()清空sql緩存區(qū)