JDBC詳解

轉(zhuǎn)自:http://www.cnblogs.com/erbing/p/5805727.html
一、相關(guān)概念

1.什么是JDBC

JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API袱讹,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問崖飘,它由一組用Java語言編寫的類和接口組成嚷节。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序逗载。

2.數(shù)據(jù)庫驅(qū)動(dòng)

我們安裝好數(shù)據(jù)庫之后批什,我們的應(yīng)用程序也是不能直接使用數(shù)據(jù)庫的农曲,必須要通過相應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng)程序,通過驅(qū)動(dòng)程序去和數(shù)據(jù)庫打交道驻债。其實(shí)也就是數(shù)據(jù)庫廠商的JDBC接口實(shí)現(xiàn)乳规,即對Connection等接口的實(shí)現(xiàn)類的jar文件。

JDBC.png

二合呐、常用接口

1.Driver接口

Driver接口由數(shù)據(jù)庫廠家提供暮的,作為java開發(fā)人員,只需要使用Driver接口就可以了淌实。在編程中要連接數(shù)據(jù)庫冻辩,必須先裝載特定廠商的數(shù)據(jù)庫驅(qū)動(dòng)程序,不同的數(shù)據(jù)庫有不同的裝載方法拆祈。如:

裝載MySql驅(qū)動(dòng):Class.forName("com.mysql.jdbc.Driver");

裝載Oracle驅(qū)動(dòng):Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

Connection與特定數(shù)據(jù)庫的連接(會(huì)話)恨闪,在連接上下文中執(zhí)行sql語句并返回結(jié)果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定義的數(shù)據(jù)庫Connection連接上缘屹。

連接MySql數(shù)據(jù)庫:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

連接Oracle數(shù)據(jù)庫:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

連接SqlServer數(shù)據(jù)庫:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

常用方法:

createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象凛剥。
prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯sql的PrepareSatement對象。
prepareCall(sql):創(chuàng)建執(zhí)行存儲(chǔ)過程的callableStatement對象轻姿。
setAutoCommit(boolean autoCommit):設(shè)置事務(wù)是否自動(dòng)提交犁珠。
commit() :在鏈接上提交事務(wù)。
rollback() :在此鏈接上回滾事務(wù)互亮。
3.Statement接口

用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果的對象犁享。

三種Statement類:

Statement:由createStatement創(chuàng)建,用于發(fā)送簡單的SQL語句(不帶參數(shù))豹休。
PreparedStatement :繼承自Statement接口炊昆,由preparedStatement創(chuàng)建,用于發(fā)送含有一個(gè)或多個(gè)參數(shù)的SQL語句。PreparedStatement對象比Statement對象的效率更高凤巨,并且可以防止SQL注入视乐,所以我們一般都使用PreparedStatement。
CallableStatement:繼承自PreparedStatement接口敢茁,由方法prepareCall創(chuàng)建佑淀,用于調(diào)用存儲(chǔ)過程。
  常用Statement方法:

execute(String sql):運(yùn)行語句彰檬,返回是否有結(jié)果集
executeQuery(String sql):運(yùn)行select語句伸刃,返回ResultSet結(jié)果集。
executeUpdate(String sql):運(yùn)行insert/update/delete操作逢倍,返回更新的行數(shù)捧颅。
addBatch(String sql) :把多條sql語句放到一個(gè)批處理中。
executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行较雕。
4.ResultSet接口

ResultSet提供檢索不同類型字段的方法碉哑,常用的有:

getString(int index)、getString(String columnName):獲得在數(shù)據(jù)庫里是varchar郎笆、char等類型的數(shù)據(jù)對象谭梗。
getFloat(int index)、getFloat(String columnName):獲得在數(shù)據(jù)庫里是Float類型的數(shù)據(jù)對象宛蚓。
getDate(int index)、getDate(String columnName):獲得在數(shù)據(jù)庫里是Date類型的數(shù)據(jù)设塔。
getBoolean(int index)凄吏、getBoolean(String columnName):獲得在數(shù)據(jù)庫里是Boolean類型的數(shù)據(jù)。
getObject(int index)闰蛔、getObject(String columnName):獲取在數(shù)據(jù)庫里任意類型的數(shù)據(jù)痕钢。
  ResultSet還提供了對結(jié)果集進(jìn)行滾動(dòng)的方法:

next():移動(dòng)到下一行
Previous():移動(dòng)到前一行
absolute(int row):移動(dòng)到指定行
beforeFirst():移動(dòng)resultSet的最前面。
afterLast() :移動(dòng)到resultSet的最后面序六。
使用后依次關(guān)閉對象及連接:ResultSet → Statement → Connection
三任连、使用JDBC的步驟

加載JDBC驅(qū)動(dòng)程序 → 建立數(shù)據(jù)庫連接Connection → 創(chuàng)建執(zhí)行SQL的語句Statement → 處理執(zhí)行結(jié)果ResultSet → 釋放資源

1.注冊驅(qū)動(dòng) (只做一次)

方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推薦這種方式,不會(huì)對具體的驅(qū)動(dòng)類產(chǎn)生依賴例诀。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  會(huì)造成DriverManager中產(chǎn)生兩個(gè)一樣的驅(qū)動(dòng)随抠,并會(huì)對具體的驅(qū)動(dòng)類產(chǎn)生依賴。
2.建立連接

Connection conn = DriverManager.getConnection(url, user, password); 

URL用于標(biāo)識(shí)數(shù)據(jù)庫的位置,通過URL地址告訴JDBC程序連接哪個(gè)數(shù)據(jù)庫繁涂,URL寫法


URL寫法.png

其他參數(shù)如:useUnicode=true&characterEncoding=utf8
3.創(chuàng)建執(zhí)行SQL語句的statement

//Statement  
String id = "5";
String sql = "delete from table where id=" +  id;
Statement st = conn.createStatement();  
st.executeQuery(sql);  
//存在sql注入的危險(xiǎn)
//如果用戶傳入的id為“5 or 1=1”拱她,那么將刪除表中的所有記錄
//PreparedStatement 有效的防止sql注入(SQL語句在程序運(yùn)行前已經(jīng)進(jìn)行了預(yù)編譯,當(dāng)運(yùn)行時(shí)動(dòng)態(tài)地把參數(shù)傳給PreprareStatement時(shí),即使參數(shù)里有敏感字符如 or '1=1'也數(shù)據(jù)庫會(huì)作為一個(gè)參數(shù)一個(gè)字段的屬性值來處理而不會(huì)作為一個(gè)SQL指令)
String sql = “insert into user (name,pwd) values(?,?)”;  
PreparedStatement ps = conn.preparedStatement(sql);  
ps.setString(1, “col_value”);  //占位符順序從1開始
ps.setString(2, “123456”); //也可以使用setObject
ps.executeQuery();

4.處理執(zhí)行結(jié)果(ResultSet)

ResultSet rs = ps.executeQuery();  
 While(rs.next()){  
    rs.getString(“col_name”);  
     rs.getInt(1);  
     //…
 }  

5.釋放資源

//數(shù)據(jù)庫連接(Connection)非常耗資源扔罪,盡量晚創(chuàng)建秉沼,盡量早的釋放
 //都要加try catch 以防前面關(guān)閉出錯(cuò),后面的就不執(zhí)行了
try {
    if (rs != null) {
        rs.close();
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    try {
        if (st != null) {
            st.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

四、事務(wù)(ACID特點(diǎn)唬复、隔離級別矗积、提交commit、回滾rollback)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敞咧,一起剝皮案震驚了整個(gè)濱河市棘捣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妄均,老刑警劉巖柱锹,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丰包,居然都是意外死亡禁熏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門邑彪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧毙,“玉大人,你說我怎么就攤上這事寄症≈姹耄” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵有巧,是天一觀的道長释漆。 經(jīng)常有香客問我,道長篮迎,這世上最難降的妖魔是什么男图? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮甜橱,結(jié)果婚禮上逊笆,老公的妹妹穿的比我還像新娘。我一直安慰自己岂傲,他們只是感情好难裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镊掖,像睡著了一般乃戈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堰乔,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天偏化,我揣著相機(jī)與錄音,去河邊找鬼镐侯。 笑死侦讨,一個(gè)胖子當(dāng)著我的面吹牛驶冒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韵卤,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼骗污,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沈条?” 一聲冷哼從身側(cè)響起需忿,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜡歹,沒想到半個(gè)月后屋厘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡月而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年汗洒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片父款。...
    茶點(diǎn)故事閱讀 40,435評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溢谤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出憨攒,到底是詐尸還是另有隱情世杀,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布肝集,位于F島的核電站瞻坝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杏瞻。R本人自食惡果不足惜湿镀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伐憾。 院中可真熱鬧,春花似錦赫模、人聲如沸树肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸嘴。三九已至,卻和暖如春斩祭,著一層夾襖步出監(jiān)牢的瞬間劣像,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工摧玫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耳奕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像屋群,于是被迫代替她去往敵國和親闸婴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評論 2 359

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

  • 一芍躏、相關(guān)概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫...
    ZZS_簡閱讀 354評論 0 0
  • 一邪乍、JDBC執(zhí)行步驟 搭建環(huán)境 :在mysql中創(chuàng)建一個(gè)庫,并創(chuàng)建user表和插入表的數(shù)據(jù)对竣。新建一個(gè)Java工程庇楞,...
    暗香撫動(dòng)閱讀 698評論 0 0
  • JDBC概述 在Java中,數(shù)據(jù)庫存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫否纬、JDO技術(shù)吕晌、第三方O/R工具,如...
    usopp閱讀 3,542評論 3 75
  • JDBC簡介 SUN公司為了簡化烦味、統(tǒng)一對數(shù)據(jù)庫的操作聂使,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC谬俄。JDBC...
    奮斗的老王閱讀 1,520評論 0 51
  • 本人的環(huán)境為Myeclipse10柏靶、MySQL5.7.15 本文包括:簡介JDBC編程步驟打通數(shù)據(jù)庫程序詳解—Dr...
    廖少少閱讀 3,950評論 7 39