JDBC CRUD

JDBC主要功能如下:

  • 建立與數(shù)據(jù)庫或者其他數(shù)據(jù)源的連接腻脏。
  • 向數(shù)據(jù)庫發(fā)送SQL命令
  • 處理數(shù)據(jù)庫的返回結(jié)果神汹。

JDBC中常用的類和接口

  • Connection: 連接到數(shù)據(jù)庫伤哺。
  • Statement: 建立操作指令。
  • executeQuery: 執(zhí)行查詢指令畏腕。
  • ResultSet: 獲得查詢結(jié)果凸主。

建立連接的操作:

public static Connection getConnection() {

    Connection con = null;
    
    try {
        Class.forName(driverName); //建立JDBC-ODBC橋接器
        con = DriverManager.getConnection(dbURL,userName,userPw); //建立連接。
    }catch(Exception e) {
        e.printStackTrace();
    }
    
    //返回建立的連接對象
    return con;
}

查詢操作

  1. 向數(shù)據(jù)庫發(fā)送SQL查詢語句
    首先使用Satement聲明一個SQL語句對象额湘,然后讓已創(chuàng)建的連接對象con調(diào)用方法createStatement()創(chuàng)建這個SQL語句對象:
Statement sql = con.createStatement();
  1. 處理查詢結(jié)果
    有了SQL語句對象后卿吐,就可以調(diào)用相應的方法實現(xiàn)對數(shù)據(jù)庫中表的查詢和修改旁舰,并將查詢結(jié)果存放在一個Result類聲明的對象中。也就是說SQL查詢語句對數(shù)據(jù)庫的查詢操作將返回一個ResultSet對象嗡官,ResultSet對象是由統(tǒng)一形式的列組織的數(shù)據(jù)行組成箭窜。
ResultSet rs = sql.executeQuery(SQL查詢語句);

ResultSet 對象一次只能看到一個數(shù)據(jù)行,實用next()方法移到下一行數(shù)據(jù)行衍腥,獲得一行數(shù)據(jù)后磺樱,ResultSet對象可以實用getXxx方法獲得字段值(列值),將位置索引或列名傳遞給getXxx方法即可婆咸。
無論字段是何種屬性竹捉,總可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的串表示。
當使用ResultSet的getXxx方法查看一行記錄時尚骄,不可以顛倒字段的順序块差。

查詢stu表中學生信息

        Connection con = DBUtil.getConnection();
        
        try {
            Statement sql = con.createStatement();
            ResultSet rs = sql.executeQuery("SELECT * FROM stu");
            
            while(rs.next()) {
                System.out.println(rs.getString("id") + "  " + rs.getString("name") + "    "+  rs.getString("phone"));
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

順序查詢

查詢表中字段信息:

當創(chuàng)建好連接對象con之后,那么該連接對象調(diào)用getMetaData()方法可以返回一個DatabaseMetaData對象:
DatabaseMetaData metadata = con.getMetaData();
 Metadata對象再調(diào)用getColumns可以將表的字段信息以行列的形式存儲在一個ResultSet對象:
ResultSet tableMessage = metadata.getColumns(null,null,"goods",null);  

如果表中由n個字段倔丈,tableMessage就剛好有n行憨闰,每行4列,每行分別含有和相應字段有關(guān)的信息需五。信息的次序為:“數(shù)據(jù)庫名”鹉动、“數(shù)據(jù)庫擴展名”、“表名“宏邮、“字段名”泽示。
tableMessage對象調(diào)用next方法使游標向下移動一行(游標的初始位置在第一行之前),然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息蜀铲,其中最重要的信息是第4列边琉,該列上的信息為字段的名字。

獲取表中字段信息

    Connection con = DBUtil.getConnection();
        
        try {
            DatabaseMetaData metadata = con.getMetaData();
            ResultSet tableMessage = metadata.getColumns(null, null, "stu", null);
            while(tableMessage.next()) {
                System.out.println(tableMessage.getString(1) + tableMessage.getString(2) + tableMessage.getString(3) + tableMessage.getString(4 ));
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("成功");

控制游標

有時候需要在結(jié)果集中前后移動记劝、顯示結(jié)果集中的某條記錄或隨機顯示若干條記錄時变姨,必須要返回一個可滾動的結(jié)果集,為了得到一個可滾動的結(jié)果集厌丑,需使用下述方法獲得一個Statement對象定欧。

Statement stmt = con.createStatement(int type, int concurrency);

然后根據(jù)參數(shù)type、concurrency的取值情況怒竿,stmt返回相應類型的結(jié)果集砍鸠。

Result re = stmt.executeQuery(SQL語句);

type的取值決定滾動方式,取值可以是:

取值 含義
ResultSet.TYPE_FORWORD_ONLY 結(jié)果集的游標只能向下滾動耕驰。
ResultSet.TYPE_SCROLL 結(jié)果集的游標可以上下移動爷辱,當數(shù)據(jù)庫變化時,當前結(jié)果集不變。
ResultSet.TYPE_SCROLL_SENSITIVE 返回可滾動的結(jié)果集饭弓,當數(shù)據(jù)庫變化時双饥,當前結(jié)果集同步改變
取值 含義
ResultSet.CONCUR_READ_ONLY 不能用結(jié)果集更新數(shù)據(jù)庫中的表
ResultSet.CONCUR_UPDATABLE 能用結(jié)果集更新數(shù)據(jù)庫中的表

Concurrency取值決定是否可以用結(jié)果集更新數(shù)據(jù)庫,Concurrenct取值:

取值 含義
ResultSet.CONCUR_READ_ONLY 不能用結(jié)果集更新數(shù)據(jù)庫中的表
ResultSet.CONCUR_UPDATABLE 能用結(jié)果集更新數(shù)據(jù)庫中的表
方法名 含義
public boolean previous() 將游標向上移動弟断,該方法返回boolean型數(shù)據(jù)咏花,當移動結(jié)果集第一行之前時返回false。
public void beforeFirst 將游標移動到結(jié)果集的初始位置阀趴,即在第一行之前昏翰。
public void afterLast() 將游標移動到結(jié)果集最后一行之后。
public void first() 將游標移動到結(jié)果集的第一行
public void last() 將游標移動到結(jié)果集的最后一行
public boolean isAfterLast() 判斷游標是否在最后一行之后刘急。
public boolean isBeforeFirst() 判斷游標是否在第一行之前棚菊。
public boolean isFirst() 判斷游標是否指向結(jié)果集的第一行。
public boolean isLast() 判斷游標是否指向結(jié)果集的最后一行
public int getRow() 得到當前游標所指行的行號排霉,行號從1開始窍株,如果結(jié)果集沒有行,返回0
public boolean absolute(int row) 將游標移到參數(shù)row指定的行

滾動查詢經(jīng)常用到ResultSet的下述方法攻柠。

方法名 含義
public boolean previous() 將游標向上移動球订,該方法返回boolean型數(shù)據(jù),當移動結(jié)果集第一行之前時返回false瑰钮。
public void beforeFirst 將游標移動到結(jié)果集的初始位置冒滩,即在第一行之前。
public void afterLast() 將游標移動到結(jié)果集最后一行之后浪谴。
public void first() 將游標移動到結(jié)果集的第一行
public void last() 將游標移動到結(jié)果集的最后一行
public boolean isAfterLast() 判斷游標是否在最后一行之后开睡。
public boolean isBeforeFirst() 判斷游標是否在第一行之前。
public boolean isFirst() 判斷游標是否指向結(jié)果集的第一行苟耻。
public boolean isLast() 判斷游標是否指向結(jié)果集的最后一行
public int getRow() 得到當前游標所指行的行號篇恒,行號從1開始,如果結(jié)果集沒有行凶杖,返回0
public boolean absolute(int row) 將游標移到參數(shù)row指定的行

條件查詢

更新胁艰、添加與刪除操作

Statement對象調(diào)用方法:

  public int executeUpdate(String sqlStatement);

通過參數(shù)sqlStatement指定的方式實現(xiàn)對數(shù)據(jù)庫表中記錄的更新、添加和刪除操作智蝠。更新腾么、添加和刪除記錄的SQL語法分別是:

  UPDATE <表名> SET <字段名> = 新增 WHERE <條件子句>
  INSERT INTO 表(字段列表) VALUES(對應的具體的記錄)或INSETE INTO表(VALUES (對應的具體的記錄)
  DELETE FROM <表名> WHER <條件子句>

public class ModifyTable {

String datasourceName = "";

String SQL,message="";

public ModifyTable() {
    
}

public void setSQL(String SQL) {
    this.SQL = SQL;
}

public String modifyRecord() {
    Connection con = DBUtil.getConnection();
    Statement sql = null;
    try {
        sql = con.createStatement();
        sql.execute(SQL);
        message = "操作成功";
        con.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return message;
}
public class Main {
    public static void main(String[] args) {
        ModifyTable modify = new ModifyTable();
        modify.setSQL("INSERT INTO stu(name,phone) VALUES ('KKK','17852179777')");
        String backMess = modify.modifyRecord();
        System.out.println(backMess);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杈湾,隨后出現(xiàn)的幾起案子解虱,更是在濱河造成了極大的恐慌,老刑警劉巖漆撞,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殴泰,死亡現(xiàn)場離奇詭異于宙,居然都是意外死亡,警方通過查閱死者的電腦和手機艰匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門限煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抹恳,“玉大人员凝,你說我怎么就攤上這事》芟祝” “怎么了健霹?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓶蚂。 經(jīng)常有香客問我糖埋,道長,這世上最難降的妖魔是什么窃这? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任瞳别,我火速辦了婚禮,結(jié)果婚禮上杭攻,老公的妹妹穿的比我還像新娘祟敛。我一直安慰自己,他們只是感情好兆解,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布馆铁。 她就那樣靜靜地躺著,像睡著了一般锅睛。 火紅的嫁衣襯著肌膚如雪埠巨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天现拒,我揣著相機與錄音辣垒,去河邊找鬼。 笑死印蔬,一個胖子當著我的面吹牛勋桶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扛点,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼哥遮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陵究?” 一聲冷哼從身側(cè)響起眠饮,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜邮,沒想到半個月后仪召,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寨蹋,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年扔茅,在試婚紗的時候發(fā)現(xiàn)自己被綠了已旧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡召娜,死狀恐怖运褪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玖瘸,我是刑警寧澤秸讹,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站雅倒,受9級特大地震影響璃诀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔑匣,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一劣欢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裁良,春花似錦凿将、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彼棍,卻和暖如春灭忠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背座硕。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工弛作, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人华匾。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓映琳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜘拉。 傳聞我的和親對象是個殘疾皇子萨西,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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