JDBC(二)完成CRUD

1.獲取數(shù)據(jù)庫(kù)連接

(1)使用JDBC的準(zhǔn)備環(huán)境:

  • 1):拷貝MySQL的JDBC驅(qū)動(dòng),到Java項(xiàng)目中:mysql-connector-java-5.1.26-bin.jar。(注意:是jar包,不是zip包.)
  • 2):選擇jar,[buil path],把jar添加到classpath路徑.
驅(qū)動(dòng)包.png

(2)DBC操作第一步:獲取JDBC連接對(duì)象/Connection對(duì)象.

操作步驟(賈璉):

  • 1):加載注冊(cè)驅(qū)動(dòng).
Class.forName("com.mysql.jdbc.Driver");

為什么說(shuō)上述代碼,在完成加載注冊(cè)驅(qū)動(dòng)?
上述代碼的作用:
1):把com.mysql.jdbc.Driver這一份字節(jié)碼加載進(jìn)JVM.
2):當(dāng)一份字節(jié)碼被加載進(jìn)JVM,就會(huì)執(zhí)行其靜態(tài)代碼塊挠阁。而其底層的靜態(tài)代碼塊在完成注冊(cè)驅(qū)動(dòng)工作.

加載注冊(cè)驅(qū)動(dòng).png
  • 2):獲取連接對(duì)象.

通過(guò)DriverManager的getConnection方法創(chuàng)建Connection對(duì)象.

Connection  conn = DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/jdbcdemo
//如果連接的是本機(jī)的MySQL,并且端口是默認(rèn)的3306,則可以簡(jiǎn)寫:url=jdbc:mysql:///jdbcdemo
username=root
password=admin

可以通過(guò) show processlist命令來(lái)查看有幾個(gè)MySQL進(jìn)程.

(3)備注

  • 從Java6開始:JDBC4.0: (了解)JDBC4.0有一個(gè)新特性-無(wú)需加載注冊(cè)驅(qū)動(dòng).

  • 規(guī)范要求:從JDBC 4.0所有的驅(qū)動(dòng)都必須包括 META-INF/services/java.sql.Driver 文件宾肺。此文件包含 java.sql.Driver 的 JDBC 驅(qū)動(dòng)程序?qū)崿F(xiàn)的名稱。
    程序會(huì)自動(dòng)從 META-INF/services/java.sql.Driver去讀取當(dāng)前的驅(qū)動(dòng)類的全限定名,此時(shí)程序員不再需要顯示的編寫 Class.forName("com.mysql.jdbc.Driver")代碼.

  • 在Web開發(fā)中,還是得使用手動(dòng)加載注冊(cè)驅(qū)動(dòng).

  • PS:有的時(shí)候侵俗,MySQL的驅(qū)動(dòng)類也也會(huì)看到使用org.gjt.mm.mysql.Driver的情況锨用,org.gjt.mm.mysql.Driver是早期的驅(qū)動(dòng)名稱,后來(lái)就改名為com.mysql.jdbc.Driver隘谣,現(xiàn)在一般都推薦使用 com.mysql.jdbc.Driver增拥。

  • 在最新版本的mysql jdbc驅(qū)動(dòng)中,為了保持對(duì)老版本的兼容寻歧,仍然保留了org.gjt.mm.mysql.Driver掌栅,但是實(shí)際上 org.gjt.mm.mysql.Driver中調(diào)用了com.mysql.jdbc.Driver,因此現(xiàn)在這兩個(gè)驅(qū)動(dòng)沒(méi)有什么區(qū)別码泛。

注冊(cè)驅(qū)動(dòng)規(guī)范.png

2.JDBC常用的API

(1)操作JDBC的步驟口訣:

賈璉欲執(zhí)事:
1:載注冊(cè)驅(qū)動(dòng).
2:獲取接對(duì)象.
3:創(chuàng)建/獲取語(yǔ)句對(duì)象.
4:執(zhí)行SQL語(yǔ)句.
5:放資源.

(2)重要接口

  • Connection接口: 表示JDBC的連接對(duì)象.
    常用方法:
Statement createStatement()          //:創(chuàng)建一個(gè)靜態(tài)的語(yǔ)句對(duì)象.
PreparedStatement prepareStatement(String sql)  //:創(chuàng)建一個(gè)預(yù)編譯語(yǔ)句對(duì)象. 此時(shí)參數(shù)sql:表示帶有占位符(?)的SQL語(yǔ)句的模板.
close()://釋放資源
  • Statement接口: 靜態(tài)SQL語(yǔ)句并返回它所生成結(jié)果.
    常用方法:
int executeUpdate(String sql)://執(zhí)行DDL/DML語(yǔ)句.
      //若當(dāng)前SQL是DDL語(yǔ)句,則返回0.
      //若當(dāng)前SQL是DML語(yǔ)句,則返回受影響的行數(shù).
ResultSet executeQuery(String sql)//:執(zhí)行DQL語(yǔ)句,返回結(jié)果集.
close()//:釋放資源
  • PreparedStatement接口:是Statemen接口的子接口-->享有Statement中的方法.表示預(yù)編譯的 SQL 語(yǔ)句的對(duì)象

常用方法:

void setXxx(int parameterIndex,Xxx value)//:設(shè)置第幾個(gè)占位符的真正參數(shù)值.
int executeUpdate()://執(zhí)行DDL/DML語(yǔ)句. 注意:沒(méi)有參數(shù)
      若當(dāng)前SQL是DDL語(yǔ)句,則返回0.
      若當(dāng)前SQL是DML語(yǔ)句,則返回受影響的行數(shù).
ResultSet executeQuery()//:執(zhí)行DQL語(yǔ)句,返回結(jié)果集.
//close():釋放資源
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等.
  • ResultSet接口:通過(guò)執(zhí)行DQL語(yǔ)句查詢之后的結(jié)果對(duì)象.封裝了查詢之后的所有數(shù)據(jù).

    ResultSet 對(duì)象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)猾封。最初,光標(biāo)被置于第一行之前噪珊。next 方法將光標(biāo)移動(dòng)到下一行晌缘;因?yàn)樵摲椒ㄔ?ResultSet 對(duì)象沒(méi)有下一行時(shí)返回 false,所以可以在 while 循環(huán)中使用它來(lái)迭代結(jié)果集

常用方法:

boolean next()://判斷當(dāng)前光標(biāo)是否能向下移動(dòng),如果能向下移動(dòng)返回true,并同時(shí)將光標(biāo)移動(dòng)到下一行.
Xxx getXxx(int columnIndex)://取出當(dāng)前光標(biāo)所在行的第columnIndex列的數(shù)據(jù)(columnIndex從1開始算).
Xxx getXxx(String columnName)://取出當(dāng)前光標(biāo)所在行的列名為columnName列的數(shù)據(jù),columnName可以是別名.
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等. 推薦使用列名來(lái)取數(shù)據(jù).
close()://釋放資源

3.SQL語(yǔ)言的分類

SQL語(yǔ)言共分為四大類:數(shù)據(jù)查詢語(yǔ)言DQL痢站,數(shù)據(jù)操縱語(yǔ)言DML磷箕,數(shù)據(jù)定義語(yǔ)言DDL,數(shù)據(jù)控制語(yǔ)言DCL*阵难。

    1. 數(shù)據(jù)查詢語(yǔ)言DQL:數(shù)據(jù)查詢語(yǔ)言DQL基本結(jié)構(gòu)是由SELECT子句岳枷,F(xiàn)ROM子句,WHERE 子句組成的查詢塊: SELECT <字段名表> FROM <表或視圖名> WHERE <查詢條件>
    1. 數(shù)據(jù)操縱語(yǔ)言DML 數(shù)據(jù)操縱語(yǔ)言DML主要有三種形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 刪除:DELETE
    1. 數(shù)據(jù)定義語(yǔ)言DDL:數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表多望、視圖嫩舟、 索引、同義詞怀偷、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 視圖 索引 同義詞 簇
      DDL操作是隱性提交的家厌!不能rollback
    1. 數(shù)據(jù)控制語(yǔ)言DCL: 數(shù)據(jù)控制語(yǔ)言DCL用來(lái)授予或回收訪問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán),并控制 數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效果椎工,對(duì)數(shù)據(jù)庫(kù)實(shí)行監(jiān)視等饭于。

如:

  1. GRANT:授權(quán)蜀踏。
  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)。 回滾---ROLLBACK 回滾命令使數(shù)據(jù)庫(kù)狀態(tài)回到上次最后提交的狀態(tài)掰吕。其格式為: SQL>ROLLBACK;
  3. COMMIT [WORK]:提交果覆。

4.JDBC的DDL(創(chuàng)建表和異常處理)

需求:
創(chuàng)建一張t_student表:id/name/age:

CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11));
  • 創(chuàng)建一張表
public void createTable() throws Exception{
        String sql="CREATE TABLE `t_student` (`id` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //1.加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對(duì)象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL語(yǔ)句
        st.executeUpdate(sql);
        st.close();
        conn.close();
    }
  • 如何正確的處理JDBC異常

    public void createTableException(){
        String sql="CREATE TABLE `t_student` (`id1` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //聲明資源
        Connection conn = null;
        Statement st = null;
        try{
            //可能出現(xiàn)異常
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            st=conn.createStatement();
            st.executeUpdate(sql);
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            try {
                if(st!=null){
                    st.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }finally {
                try {
                    if(conn!=null){
                        conn.close();
                    }
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
            }
        }
    }
  • 使用Java7的自動(dòng)資源關(guān)閉
    public void createEXceptionByJava7(){
        String sql="CREATE TABLE `t_student` (`id2` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        try {
            //1.獲取連接對(duì)象
            Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            //2.創(chuàng)建/獲取語(yǔ)句對(duì)象
            Statement st=conn.createStatement();
            //3.執(zhí)行SQL語(yǔ)句,可能會(huì)出現(xiàn)異常
            st.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.JDBC的DML操作(增殖熟、刪局待、改)

  • 增加
    public void insert() throws Exception{
        String sql="INSERT INTO t_student(name,age) VALUES('jarry',20)";
        //1.加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對(duì)象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }
  • 修改
public void update()throws Exception{
        String sql="UPDATE t_student SET name='jihang' ,age=18 WHERE name='jarry'";
        //1.加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對(duì)象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }
  • 刪除
public void delete()throws Exception{
        String sql="DELETE FROM t_student WHERE name ='jihang'";
        //1.加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對(duì)象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }

發(fā)現(xiàn):執(zhí)行DDL和DML的語(yǔ)句的操作模板是一模一樣的,僅僅是SQL語(yǔ)句不一樣.

6.JDBC的DQL操作(查詢)

  • 查詢總數(shù)
// 查詢數(shù)量
    public void queryCount() throws Exception {
        String sql = "SELECT COUNT(id) count FROM t_product";
        // 加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對(duì)象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        if (rs.next()) {
            long rows = rs.getLong("count");
            //long rows = rs.getLong(1);
            System.out.println(rows);
        }
        rs.close();
        st.close();
        conn.close();
    }
  • 查詢單個(gè)細(xì)節(jié)
//查詢單個(gè)細(xì)節(jié)
    public void querySingle() throws Exception {
        String sql = "SELECT * FROM t_product WHERE id =1";
        // 加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對(duì)象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        if (rs.next()) {
            long rows = rs.getLong("id");
            String name = rs.getString("name");
            String salePrice = rs.getString("sale_price");
            long type = rs.getInt("type");
            System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
        }
        rs.close();
        st.close();
        conn.close();
    }
  • 查詢?nèi)考?xì)節(jié)
//查詢?nèi)考?xì)節(jié)
    public void queryAll() throws Exception {
        String sql = "SELECT * FROM t_product";
        // 加載注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對(duì)象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語(yǔ)句對(duì)象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        while (rs.next()) {
            long rows = rs.getLong("id");
            String name = rs.getString("name");
            String salePrice = rs.getString("sale_price");
            long type = rs.getInt("type");
            System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
        }
        rs.close();
        st.close();
        conn.close();
    }

7.SQL和Java的對(duì)應(yīng)類型

java.util.Date和java.sql.Date有什么關(guān)系:
java.sql.Date是java.util.Date的子類.

Date的數(shù)據(jù)關(guān)系.png
數(shù)據(jù)庫(kù)和java的數(shù)據(jù)類型.png
數(shù)據(jù)庫(kù)的對(duì)應(yīng)類型.png

JavaWeb-目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菱属,隨后出現(xiàn)的幾起案子钳榨,更是在濱河造成了極大的恐慌,老刑警劉巖纽门,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薛耻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赏陵,警方通過(guò)查閱死者的電腦和手機(jī)饼齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝙搔,“玉大人缕溉,你說(shuō)我怎么就攤上這事〕孕停” “怎么了倒淫?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)败玉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)运翼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任兴枯,我火速辦了婚禮血淌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘财剖。我一直安慰自己悠夯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布躺坟。 她就那樣靜靜地躺著沦补,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咪橙。 梳的紋絲不亂的頭發(fā)上夕膀,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天虚倒,我揣著相機(jī)與錄音,去河邊找鬼产舞。 笑死魂奥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的易猫。 我是一名探鬼主播耻煤,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼准颓!你這毒婦竟也來(lái)了哈蝇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瞬场,失蹤者是張志新(化名)和其女友劉穎买鸽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贯被,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眼五,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彤灶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片看幼。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幌陕,靈堂內(nèi)的尸體忽然破棺而出诵姜,到底是詐尸還是另有隱情,我是刑警寧澤搏熄,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布棚唆,位于F島的核電站,受9級(jí)特大地震影響心例,放射性物質(zhì)發(fā)生泄漏宵凌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一止后、第九天 我趴在偏房一處隱蔽的房頂上張望瞎惫。 院中可真熱鬧,春花似錦译株、人聲如沸瓜喇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乘寒。三九已至,卻和暖如春现恼,著一層夾襖步出監(jiān)牢的瞬間肃续,已是汗流浹背黍檩。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留始锚,地道東北人刽酱。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瞧捌,于是被迫代替她去往敵國(guó)和親棵里。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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