JDBC1

JDBC介紹

java data base connectivity, java數(shù)據(jù)庫(kù)連接
java通過該標(biāo)準(zhǔn)去操作MySQL鲜锚, Oracle等數(shù)據(jù)庫(kù)

用到的包
java.sql; javax.sql 
類:DriverManager 注冊(cè)驅(qū)動(dòng)
接口:Connection 獲取連接
     Statement
     ResultSet
     PreparedStatement
     CallableStatement
     DateSource  (javax.sql)

入門代碼

前提創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)

create table user(
  id int primary key auto_increment,
  username varchar(20) unique not null;
  password varchar(20) not null;
  emai varchar(40) not null;
);
insert into user values (null, 'tom', '123', 'tom@163.com');
insert into user values(null, 'fox', '123', 'fox@163.com');
// 驅(qū)動(dòng)需要下載突诬,jar包,將其導(dǎo)入到環(huán)境路徑中
import java.sql.DriverManager; // 驅(qū)動(dòng)管理芜繁,注冊(cè)驅(qū)動(dòng)
import com.mysql.jdbc.Driver; //此驅(qū)動(dòng)是mysql提供
import java.sql.Connection;
import java.sql.ResultSet;
public class jdbcDemo1{
    public static void main(String[] arg){
        //注冊(cè)驅(qū)動(dòng),還有另一種方式Class.forName("com.jdbc.mysql.Driver");
       DriverManager.registerDriver(new Driver()); //此處有異常旺隙,拋出

       //獲取連接對(duì)象
       Connection con = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "abc");

       //通過連接對(duì)象獲取操作sql語(yǔ)句的Statement
      Statement st = con.createStatement();

       //操作sql語(yǔ)句
       String sql = "select * from user";
       ResultSet rs = st.excuteQuery(sql); //返回結(jié)果集

       //遍歷結(jié)果集,可以記住
       while(rs.next){
             int id = rs.getInt("id");
             String username =  rs.getString("username");
             String password = rs.getString("password");
             String email = rs.getString("email");
            
             System.out.println(id+"  "+ username+password+email);
       }

       //釋放資源,關(guān)閉數(shù)據(jù)庫(kù)
       //java與數(shù)據(jù)庫(kù)連接骏令,必須釋放資源
       rs.close();
       st.close();
       con.close();
  }
}

DriveManager詳解

注冊(cè)驅(qū)動(dòng):

//DriverManager類是管理一組JDBC驅(qū)動(dòng)程序的基本服務(wù)
//底層是vector容器蔬捷,可以裝入很多數(shù)據(jù)庫(kù)驅(qū)動(dòng)

//第一種方式,這種方式榔袋,根據(jù)源碼可知,DriverManager中會(huì)產(chǎn)生兩個(gè)Driver
DriverManager.registerDriver(new Driver());
//第二種方式周拐,反射機(jī)制。推薦使用
//降低耦合摘昌,不依賴于驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");//注冊(cè)MySQL驅(qū)動(dòng)
Class.forName("oracle.jdbc.driver.OracleDriver");//注冊(cè)oracle驅(qū)動(dòng)

//通過DriverManager獲取連接對(duì)象
Connection con = DriverManager.getConnection(String url, String user; String password); //url確定使用哪一個(gè)驅(qū)動(dòng)

關(guān)于URL

url格式:
主協(xié)議 自協(xié)議 主機(jī) 端口 數(shù)據(jù)庫(kù)
jdbc : mysql ://localhost:3306/day17

mysql url: jdbc:mysql://localhost:3306/數(shù)據(jù)庫(kù)名
mysql 簡(jiǎn)寫 url: jdbc:mysql:///day17   (本地的速妖,且端口號(hào)3306)
oracle url: jdbc:oracle:thin:@localhost:1521:sid
在url后面可以帶參數(shù):
        useUnicode=true&characterEncoding=UTF-8

Connection詳解 java.sql.Connection;

代表連接對(duì)象,數(shù)據(jù)庫(kù)與程序的連接
作用:

  • 通過Connection獲得操作sql的Statement對(duì)象
    • Statement st = con.createStatement();
    • 獲取執(zhí)行預(yù)處理的PraparedStatement對(duì)象
    • 獲取存儲(chǔ)過程的CallableStatement對(duì)象
  • 操作事務(wù)
    • setAutoCommit(boolean flag) 開啟事務(wù)
    • rollback() 事務(wù)回滾
    • commit() 事務(wù)提交
//通過DriverManager獲取連接對(duì)象
Connection con = DriverManager.getConnection(String url, String user; String password); //url確定使用哪一個(gè)驅(qū)動(dòng)
Statement st = con.createStatement();

Statement詳解 java.sql.Statement;

作用:

  • 執(zhí)行sql語(yǔ)句

    • DML:insert update delete 插入 修改 刪除
      • 使用方法 int executeUpdate(String sql)
    • DQL: select 查詢
      • 使用方法 ResultSet executeQuery(String
        sql)

        excute(String sql) 執(zhí)行任意sql語(yǔ)句聪黎,少用
        
  • 批處理操作

    • addBatch(String sql); 將sql添加到批處理
    • executeBatch(); 批量處理
    • clearBatch(); 清空批處理
//執(zhí)行update語(yǔ)句
int row = st.executeUpdate("update user set password='135'");
System.out.println(row);//=2;里面有兩條記錄罕容,兩個(gè)記錄的password改了
//根據(jù)返回值,判斷修改是否成功

ResultSet詳解 java.sql.ResultSet

封裝select語(yǔ)句執(zhí)行后的結(jié)果集(表)
初始的時(shí)候稿饰,游標(biāo)在第一行之前锦秒,調(diào)用ResultSet.next()方法,使游標(biāo)指向具體的行

 ResultSet rs = st.excuteQuery("select * from user"); //返回結(jié)果集

//獲取任意類型的數(shù)據(jù)
rs.getObject(int index)喉镰;
rs.getObject(String columnName);

//獲取指定類型的數(shù)據(jù)
rs.getString(int index);
rs.getString(String columnName);
rs.getInt(String columnName); //等等

//遍歷
while(rs.next()){
  ...
}
//部分函數(shù)
rs.next() ;// 移動(dòng)到下一行
rs.previous(); //移動(dòng)到前一行
rs.absolute(int row); //移動(dòng)到指定行
rs.beforeFirst(); //移動(dòng)到最前面
rs.afterLast(); //移動(dòng)到最后面
rs.updateRow(); //更新行數(shù)據(jù)

釋放資源

通常需要關(guān)閉的對(duì)象:

  • ResultSet
  • Statement
  • Connection(務(wù)必注意)

包含異常處理的入門代碼

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;

//對(duì)異常進(jìn)行try-catch

public class jdbcDemo4 {
public static void main(String[] args) {
    Connection con = null;
    Statement st = null;
    ResultSet rs = null;
    //注冊(cè)驅(qū)動(dòng)
    try {
        DriverManager.registerDriver(new Driver());
        //獲取連接
        con = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/day17","root","123");
        //獲取sql的Statement
        st = con.createStatement();
        //執(zhí)行
        rs = st.executeQuery("select * from user");
        //遍歷
        while(rs.next()){
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            
            System.out.println(id+"  "+ username+"  "+password+"  "+email);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally{
        //釋放資源
        if(rs!= null){
        try {
            rs.close();
        } catch (SQLException e) {
            
            e.printStackTrace();
        }
        }
        try {
            if(st != null)
                st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(con != null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旅择,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侣姆,更是在濱河造成了極大的恐慌生真,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捺宗,死亡現(xiàn)場(chǎng)離奇詭異柱蟀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚜厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門长已,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事术瓮】的簦” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵胞四,是天一觀的道長(zhǎng)恬汁。 經(jīng)常有香客問我,道長(zhǎng)撬讽,這世上最難降的妖魔是什么蕊连? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮游昼,結(jié)果婚禮上甘苍,老公的妹妹穿的比我還像新娘。我一直安慰自己烘豌,他們只是感情好载庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊佩,像睡著了一般囚聚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上标锄,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天顽铸,我揣著相機(jī)與錄音,去河邊找鬼料皇。 笑死谓松,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的践剂。 我是一名探鬼主播鬼譬,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼逊脯!你這毒婦竟也來了优质?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤军洼,失蹤者是張志新(化名)和其女友劉穎巩螃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匕争,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牺六,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汗捡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扇住,靈堂內(nèi)的尸體忽然破棺而出春缕,到底是詐尸還是另有隱情,我是刑警寧澤艘蹋,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布锄贼,位于F島的核電站,受9級(jí)特大地震影響女阀,放射性物質(zhì)發(fā)生泄漏宅荤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一浸策、第九天 我趴在偏房一處隱蔽的房頂上張望冯键。 院中可真熱鬧,春花似錦庸汗、人聲如沸惫确。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)改化。三九已至,卻和暖如春枉昏,著一層夾襖步出監(jiān)牢的瞬間陈肛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工兄裂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留句旱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓懦窘,卻偏偏與公主長(zhǎng)得像前翎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畅涂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法港华,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法午衰,繼承相關(guān)的語(yǔ)法立宜,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • 本人的環(huán)境為Myeclipse10臊岸、MySQL5.7.15 本文包括:簡(jiǎn)介JDBC編程步驟打通數(shù)據(jù)庫(kù)程序詳解—Dr...
    廖少少閱讀 3,946評(píng)論 7 39
  • JDBC概述 在Java中橙数,數(shù)據(jù)庫(kù)存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫(kù)、JDO技術(shù)帅戒、第三方O/R工具灯帮,如...
    usopp閱讀 3,535評(píng)論 3 75
  • 本節(jié)介紹Statement接口及其子類PreparedStatement和CallableStatement崖技。 它...
    zlb閱讀 1,161評(píng)論 0 0
  • salzburg 要塞,城堡钟哥,從來沒有被攻克過的要塞迎献。很像暴風(fēng)城。刑室里的陰森恐懼感腻贰,令人發(fā)抖的刑具吁恍。盤旋樓梯讓我...
    sweetsummer閱讀 161評(píng)論 0 0