JDBC操作

JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是java數(shù)據(jù)可連接技術(shù)的簡稱啤握,提供連接各種常用數(shù)據(jù)庫的能力未状。讓java程序員可以直接通過java程序操作數(shù)據(jù)鸭限。jdbc是標(biāo)準(zhǔn)蜕径,它是由類與接口組成,對于程序員只需要知道標(biāo)準(zhǔn)(Connection Statement PreparedStatement ResultSet)不需要了解具體的實現(xiàn)就可以操作數(shù)據(jù)庫


jdbc1.png

=====


2.png
DriverManager:這是一個實現(xiàn)類败京,它是一個工廠類兜喻,用來生產(chǎn)Driver對象這個類的結(jié)構(gòu)設(shè)計模式為工廠方法;
Driver:這是驅(qū)動程序?qū)ο蟮慕涌谏穆螅赶蛞粋€實實在在的數(shù)據(jù)庫驅(qū)動程序?qū)ο笃咏裕敲催@個數(shù)據(jù)庫驅(qū)動是從哪里來的呢?
  • DriverManager中有個方法:getDriver(String URL)泛粹,通過這個方法可以得到驅(qū)動程序?qū)ο笏煺。@個方法是在各個數(shù)據(jù)庫廠商按JDBC規(guī)范設(shè)計的數(shù)據(jù)庫驅(qū)動程序包里的類中靜態(tài)實現(xiàn)的,也就是在靜態(tài)塊中晶姊。
Connection:這個接口可以指向一個數(shù)據(jù)庫連接對象扒接,那么如何得帶這個連接對象呢?
  • 是通過DriverManager工廠中的getConnection(String URL)方法得到的
Statement:用于執(zhí)行靜態(tài)的SQL語句的接口们衙,通過Connection中的createStatement方法得到的
ResultSet:用于指向結(jié)果集對象的接口钾怔,結(jié)果集對象是通過Statement中的execute等方法得到的

創(chuàng)建一個關(guān)于JDBC項目

1. 導(dǎo)入jar包
2. 注冊驅(qū)動
  • 反射
  • Class.forName("com.mysql.jdbc.Driver");
3. 獲取連接(Connection)
  • Connection con = DriverManager.getConnection(String url, String username, String password);
4. 獲取操作sql對象 (Statement)
  • Statement st = con.createStatement();
    如果要獲取滾動結(jié)果集,可以使用createStatement(int, int);
5. 操作sql
  • DQL 語句
    ResultSet rs = st.executeQuery(String sql);
  • DML 語句
    int row = st.executeUpdate(String sql);
6. 遍歷結(jié)果集
  • while(rs.next()) {
    rs.getInt(int columnIndex);
    rs.getString(String columuName);
    }
7. 釋放資源
  • rs.close();
  • st.close();
  • con.close();

PreparedStatement
  1. 怎樣獲让商簟宗侦?
    PreparedStatement pst = con.prepareStatement(String sql);
  2. 怎樣給占位符“?”賦值
    pst.setXxx(int,value);
  3. 執(zhí)行
    pst.executeQuery();
    pst.executeUpate();
Statement和PreparedStatement的區(qū)別

Statement每次執(zhí)行sql語句忆蚀,數(shù)據(jù)庫都要執(zhí)行sql語句的編譯矾利,最好用于僅執(zhí)行一次查詢并返回結(jié)果的情形,效率高于PreparedStatement.但存在sql注入風(fēng)險馋袜。PreparedStatement是預(yù)編譯執(zhí)行的男旗。在執(zhí)行可變參數(shù)的一條SQL時,PreparedStatement要比Statement的效率高桃焕,因為DBMS預(yù)編譯一條SQL當(dāng)然會比多次編譯一條SQL的效率高剑肯。安全性更好,有效防止SQL注入的問題观堂。對于多次重復(fù)執(zhí)行的語句让网,使用PreparedStatement效率會更高一點。執(zhí)行SQL語句是可以帶參數(shù)的师痕,并支持批量執(zhí)行SQL溃睹。由于采用了Cache機制,則預(yù)編譯的語句胰坟,就會放在Cache中因篇,下次執(zhí)行相同的SQL語句時,則可以直接從Cache中取出來。

PreparedStatement: 數(shù)據(jù)庫會對sql語句進行預(yù)編譯竞滓,下次執(zhí)行相同的sql語句時咐吼,數(shù)據(jù)庫端不會再進行預(yù)編譯了,而直接用數(shù)據(jù)庫的緩沖區(qū)商佑,提高數(shù)據(jù)訪問的效率(但盡量采用使用锯茄?號的方式傳遞參數(shù)),如果sql語句只執(zhí)行一次茶没,以后不再復(fù)用肌幽。

從安全性上來看,PreparedStatement是通過?來傳遞參數(shù)的抓半,避免了拼sql而出現(xiàn)sql注入的問題喂急,所以安全性較好。
在開發(fā)中笛求,推薦使用 PreparedStatement

Statement 接口提供了執(zhí)行語句和獲取結(jié)果的基本方法廊移。PreparedStatement 接口添加了處理 IN 參數(shù)的方法;而CallableStatement 添加了處理 OUT 參數(shù)的方法涣易,用來調(diào)用存儲過程画机。


CallableStatement

CallableStatement cstmt = con.prepareCall("call getTestData(?, ?)");
cstmt.setInt(1, sc.nextInt());
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.execute();
int result = cstmt.getInt(2);

什么是SQL注入冶伞,怎么防止SQL注入新症?

SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令响禽。具體來說徒爹,它是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺數(shù)據(jù)庫引擎執(zhí)行的能力芋类,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫隆嗅,而不是按照設(shè)計者意圖去執(zhí)行SQL語句。
那么侯繁,如何防止SQL注入胖喳?不相信用戶輸入,檢查用戶輸入的合法性贮竟;將用戶的登錄名丽焊、密碼等數(shù)據(jù)加密保存;不使用動態(tài)拼接sql咕别,可以使用參數(shù)化或直接使用存儲過程來執(zhí)行所有的查詢技健;不使用管理員權(quán)限的數(shù)據(jù)庫連接,為每個應(yīng)用創(chuàng)建單獨的惰拱、有限的權(quán)限連接數(shù)據(jù)庫用戶雌贱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子欣孤,更是在濱河造成了極大的恐慌馋没,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件降传,死亡現(xiàn)場離奇詭異披泪,居然都是意外死亡,警方通過查閱死者的電腦和手機搬瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門款票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泽论,你說我怎么就攤上這事艾少。” “怎么了翼悴?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵缚够,是天一觀的道長。 經(jīng)常有香客問我鹦赎,道長谍椅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任古话,我火速辦了婚禮雏吭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陪踩。我一直安慰自己杖们,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布肩狂。 她就那樣靜靜地躺著摘完,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傻谁。 梳的紋絲不亂的頭發(fā)上孝治,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音审磁,去河邊找鬼谈飒。 笑死,一個胖子當(dāng)著我的面吹牛力图,可吹牛的內(nèi)容都是我干的步绸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼吃媒,長吁一口氣:“原來是場噩夢啊……” “哼瓤介!你這毒婦竟也來了吕喘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤刑桑,失蹤者是張志新(化名)和其女友劉穎氯质,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祠斧,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闻察,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琢锋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辕漂。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吴超,靈堂內(nèi)的尸體忽然破棺而出钉嘹,到底是詐尸還是另有隱情,我是刑警寧澤鲸阻,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布跋涣,位于F島的核電站,受9級特大地震影響鸟悴,放射性物質(zhì)發(fā)生泄漏陈辱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一细诸、第九天 我趴在偏房一處隱蔽的房頂上張望沛贪。 院中可真熱鬧,春花似錦揍堰、人聲如沸鹏浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至之碗,卻和暖如春蝙眶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褪那。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工幽纷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人博敬。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓友浸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偏窝。 傳聞我的和親對象是個殘疾皇子收恢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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