Unit02: JDBC核心API

JDBC 核心API

JAVAJSD_V01JDBCDAY02_003.png

Statement

Statement執(zhí)行查詢

  • 創(chuàng)建Statement的方式:
    Connection.createStatement();

  • 執(zhí)行INSERT,UPDATE和DELETE:
    Statement.executeUpdate()

  • 執(zhí)行SELECT:
    Statement.executeQuery()

      String sql = "select empno,ename,sal,hiredate from emp";
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(sql);
      //對(duì)rs的處理
      stmt.close();
    

executeQuery()方法將返回SQL語(yǔ)句執(zhí)行后的結(jié)果集

Statemeent執(zhí)行插入

    String sql = "insert into emp(empno,ename,jop,sal) values(1001,'張三豐',‘Manager’ 9500)";

    int flag = -1;

    try{
        conn = ConnectionSource.getConnection();
        stmt = con.createStatement();
        flag = stmt.executeUpdate(sql);
        //處理結(jié)果
    }catch(){
        //處理異常
    }

executeUpdate() 方法將返回SQL語(yǔ)句執(zhí)行后影響的記錄數(shù)

Statement執(zhí)行更改

和INSERT操作完全相同,只是SQL語(yǔ)句不同
String sql = "update emp set sal = 9900 where empno = 1001";
int flag = -1;
try{
con = ConnectionSource.getConnection();
stmt = con.createStatement();
flag = stmt.executeUpdate(sql);
//處理結(jié)果
}catch(){
//處理異常
}

PreparedStatement

PreparedStatement原理

  • Statement主要用于執(zhí)行靜態(tài)SQL語(yǔ)句,即內(nèi)容固定不變的SQL語(yǔ)句
  • Statement每執(zhí)行一次都要對(duì)傳入的SQL語(yǔ)句編譯一次,效率較差
  • 某些情況下,SQL語(yǔ)句只是其中的參數(shù)有所不同,其余字句完全相同,適用于PreparedStatement
  • 預(yù)防sql注入攻擊
  • PreparedStatement是接口,繼承自Statement
  • SQL語(yǔ)句提前編譯,三種常用方法execute、executeQuery和executeUpdate已被更改,不再需要參數(shù)
2017-11-23 20-49-32屏幕截圖.png
  • PreparedStatement實(shí)例包含已事先編譯的SQL語(yǔ)句
  • SQL語(yǔ)句可有一個(gè)或多個(gè)IN參數(shù)
    IN參數(shù)的值在SQL語(yǔ)句創(chuàng)建時(shí)未被指定肋层。該語(yǔ)句為每個(gè)IN參數(shù)保留一個(gè)問(wèn)號(hào)(“踪央?”)作為占位符
    每個(gè)問(wèn)號(hào)的值必須在該語(yǔ)句執(zhí)行之前,通過(guò)適當(dāng)?shù)膕etInt或者setString 方法提供巡蘸。
  • 由于PreparedStatement對(duì)象已編譯過(guò)络拌,所以其執(zhí)行速度快于Statement對(duì)象俭驮。因此,多次執(zhí)行的SQL語(yǔ)句經(jīng)常創(chuàng)建為PreparedStatement對(duì)象,以提高效率春贸。
  • 批量處理

PreparedStatement pstmt = con.prepareStatement("UPDATE emp SET job=? WHERE empno=?");
SQL語(yǔ)句已發(fā)送給數(shù)據(jù)庫(kù),并編譯號(hào)為執(zhí)行作號(hào)準(zhǔn)備
pstmt.setString(1,"Manager");
pstmt.setInt(2,1001);
對(duì)占位符進(jìn)行初始化
pstmt.executeUpdate();
執(zhí)行SQL語(yǔ)句

通過(guò)PS提升性能

JAVAJSD_V01JDBCDAY02_015.png
  • 數(shù)據(jù)庫(kù)具備緩存功能混萝,可以對(duì)statement的執(zhí)行計(jì)劃進(jìn)行緩存,以避免重復(fù)分析
  • 緩存原理:
    • 使用statemenet本身作為key并將執(zhí)行計(jì)劃存入與statement對(duì)應(yīng)的緩存中
    • 對(duì)曾經(jīng)執(zhí)行過(guò)的statements萍恕,再運(yùn)行時(shí)執(zhí)行計(jì)劃將重用
  • 舉例:

    • SELECT a,b FROM t WHERE c = 1;
    • 再次發(fā)送相同的statemenet時(shí)譬圣,數(shù)據(jù)庫(kù)會(huì)對(duì)先前使用過(guò)的執(zhí)行計(jì)劃進(jìn)行重用,降低開銷
  • 悲勑燮骸:

    • SELECT a,b FROM t WHERE c = 1;
    • SELECT a,b FROM t WHERE c = 2;

被視作不同的SQL語(yǔ)句,執(zhí)行計(jì)劃不可重用

String sql = "select a,b from t where c = ?";
PrearedStatemenet ps = conn.prepareStatement(sql);
    for(){
        ps.setInt(1,i);
        ResultSet rs = ps.executeQuery();
        rs.close();
        ps.close();
    }

SQL Injection簡(jiǎn)介

  • 場(chǎng)景:
    String sql = "select * from t where username = '"+name+"'+and password='"+password+"';

  • 輸入?yún)?shù)后,數(shù)據(jù)庫(kù)接受到完整sql語(yǔ)句將是:
    select * from t where username = 'scott' and password = 'tiger';

  • 如果用戶輸入的passwd參數(shù)是:a 'or' 'b' ='b,則數(shù)據(jù)庫(kù)收到的SQL語(yǔ)句將是:

    select * from t where username = 'scott' and password = 'a' or 'b' = 'b';

    此SQL語(yǔ)句的where條件將永遠(yuǎn)為true 此現(xiàn)象被稱作SQL注入

通過(guò)PS防止SQL Injection

  • 對(duì)JDBC而言,SQL注入攻擊只對(duì)Statement有效屯蹦,對(duì)PreparedStatement無(wú)效维哈,因?yàn)镻repare
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市登澜,隨后出現(xiàn)的幾起案子阔挠,更是在濱河造成了極大的恐慌,老刑警劉巖脑蠕,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件购撼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谴仙,警方通過(guò)查閱死者的電腦和手機(jī)迂求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晃跺,“玉大人揩局,你說(shuō)我怎么就攤上這事∠苹ⅲ” “怎么了凌盯?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵付枫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驰怎,道長(zhǎng)阐滩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任县忌,我火速辦了婚禮掂榔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芹枷。我一直安慰自己衅疙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布鸳慈。 她就那樣靜靜地躺著饱溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪走芋。 梳的紋絲不亂的頭發(fā)上绩郎,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音翁逞,去河邊找鬼肋杖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挖函,可吹牛的內(nèi)容都是我干的状植。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怨喘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼津畸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起必怜,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肉拓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梳庆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暖途,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年膏执,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驻售。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡更米,死狀恐怖芋浮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤纸巷,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布镇草,位于F島的核電站,受9級(jí)特大地震影響瘤旨,放射性物質(zhì)發(fā)生泄漏梯啤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一存哲、第九天 我趴在偏房一處隱蔽的房頂上張望因宇。 院中可真熱鬧,春花似錦祟偷、人聲如沸察滑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贺辰。三九已至,卻和暖如春嵌施,著一層夾襖步出監(jiān)牢的瞬間饲化,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吗伤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吃靠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓足淆,卻偏偏與公主長(zhǎng)得像巢块,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巧号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本節(jié)介紹Statement接口及其子類PreparedStatement和CallableStatement族奢。 它...
    zlb閱讀 1,165評(píng)論 0 0
  • JDBC簡(jiǎn)介 SUN公司為了簡(jiǎn)化、統(tǒng)一對(duì)數(shù)據(jù)庫(kù)的操作裂逐,定義了一套Java操作數(shù)據(jù)庫(kù)的規(guī)范,稱之為JDBC泣栈。JDBC...
    奮斗的老王閱讀 1,520評(píng)論 0 51
  • 預(yù)編譯sql處理(防止sql注入) Statement : 執(zhí)行SQL命令CallableStatement : ...
    奮斗的老王閱讀 1,149評(píng)論 2 52
  • 本人的環(huán)境為Myeclipse10卜高、MySQL5.7.15 本文包括:簡(jiǎn)介JDBC編程步驟打通數(shù)據(jù)庫(kù)程序詳解—Dr...
    廖少少閱讀 3,950評(píng)論 7 39
  • 世情冷,人情淡南片,雨送黃葉花難活掺涛。北風(fēng)歡,淚眼滿疼进,欲箋心事薪缆,無(wú)以成言。嘆伞广!嘆拣帽!嘆疼电! 人非昨,今成過(guò)减拭,夢(mèng)魂常似秋葉落蔽豺。...
    緣來(lái)浮生若夢(mèng)閱讀 497評(píng)論 0 0