JDBC核心API詳解

JDBC核心API詳解

時間:20180310


Statement對象:可以類比于一艘貨船乖篷,1.現(xiàn)在java程序中將sql裝入Statement對象中饶碘,2.Statement對象貨船漂洋過海到mysql數(shù)據(jù)庫,3.在數(shù)據(jù)庫中執(zhí)行Statement對象中sql語句瑞驱,4.將sql執(zhí)行的結果放入Statement中,5.Statement再次飄洋過海回到java程序中谎砾,6.將Statement對象中結果集ResultSet返回給java程序。

例1:通過Statement去執(zhí)行sql
使用Statement接口執(zhí)行DDL語句(Create/drop/alter)

/**
 * 使用Statement接口執(zhí)行DDL語句(Create/drop/alter)
 * @author mengjie
 *
 */
public class Demo1 {
    //url==jdbc協(xié)議:mysql協(xié)議+ip地址+端口+數(shù)據(jù)庫
    private static String url = "jdbc:mysql://localhost:3306/day16";
    
    //user
    private static String user = "root";
    
    //password
    private static String password = "root";
    
    public static void main(String[] args) throws Exception {
        //1.注冊驅動程序
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接
        Connection conn = DriverManager.getConnection(url,user,password);
        //3.準備sql語句
        String sql = "CREATE TABLE student(id INT, NAME VARCHAR(20),age INT)";
        //Statement對象:可以類比于一艘貨輪
        //4.在連接基礎上捧颅,創(chuàng)建Statement
        Statement stmt = conn.createStatement();
        //5.執(zhí)行sql,返回結果
        int count = stmt.executeUpdate(sql);
        System.out.println("影響了"+count+"行景图!");
        //6關閉資源:后打開先關閉
        stmt.close();
        conn.close();
    }
}

例2: 通過Statement去執(zhí)行sql
使用Statement接口執(zhí)行DML語句(insert/update/delete)

/**
 * 使用Statement對象執(zhí)行DML語句(insert/update/delete)
 * @author mengjie
 *
 */
public class Demo2 {
    private static String url = "jdbc:mysql://localhost:3306/day16";
    private static String username = "root";
    private static String password = "root";
    public static void main(String[] args) throws Exception {
        //1.注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2.創(chuàng)建連接
        Connection conn = DriverManager.getConnection(url,username,password);
        //3.創(chuàng)建sql
        String sql = "INSERT INTO student (id,NAME,age) VALUES(1,'小花',22)";
        //4.創(chuàng)建statement
        Statement statement = conn.createStatement();
        //5.執(zhí)行sql
        int n = statement.executeUpdate(sql);
        System.out.println("影響了" + n + "行");
        statement.close();
        conn.close();
    }
}

總結

jdbc操作步驟

  1. 注冊驅動程序
  2. 獲取連接對象
  3. 準備sql語句
  4. 創(chuàng)建Statement對象
  5. 執(zhí)行sql
  6. 關閉資源

標準的jdbc,并利用工具類的寫法

/**
 * jdbc通用方法
 * @author mengjie
 *
 */
public class JdbcUtil {
    //url
    private static String url = "jdbc:mysql://localhost:3306/day16";
    //user 
    private static String user  = "root";
    //password
    private static String password = "root";
    
    /**
     *z只注冊一次驅動碉哑,靜態(tài)代碼塊 
     */
    static {
        //注冊驅動程序
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 獲取連接的方法
     * @throws SQLException 
     */
    public static Connection getConnection() {
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 釋放資源的方法
     */
    public static void close(Statement stmt, Connection conn) {
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo3 {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1)獲取連接
            conn = JdbcUtil.getConnection();
            
            //2)準備sql
            String sql = "CREATE TABLE employee(" +
                                  "id INT PRIMARY KEY AUTO_INCREMENT, "+ 
                                  "NAME VARCHAR(20),"+ 
                                  "gender VARCHAR(2), "+
                                  "age INT, "+
                                  "title VARCHAR(20),"+ 
                                  "email VARCHAR(50),"+ 
                                  "phone VARCHAR(11))";
            
            //3)創(chuàng)建一個Statement對象
            stmt = conn.createStatement();
            //4) 執(zhí)行sql
            int n = stmt.executeUpdate(sql);
            System.out.println("影響了"+n+"行");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5)關閉資源
            JdbcUtil.close(stmt, conn);
        }
    }
}

重載通用類方法

/**
 * jdbc通用方法
 * @author mengjie
 *
 */
public class JdbcUtil {
    //url
    private static String url = "jdbc:mysql://localhost:3306/day16";
    //user 
    private static String user  = "root";
    //password
    private static String password = "root";
    
    /**
     *z只注冊一次驅動挚币,靜態(tài)代碼塊 
     */
    static {
        //注冊驅動程序
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 獲取連接的方法
     * @throws SQLException 
     */
    public static Connection getConnection() {
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 釋放資源的方法
     */
    public static void close(Statement stmt, Connection conn) {
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
    
    /**
     * 釋放資源的方法
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo4 {
   public static void main(String[] args) {
       
       Connection conn = null;
       Statement stmt = null;
       ResultSet res = null;
       try{
           //1)獲取連接
           conn = JdbcUtil.getConnection();
           //2)準備sql
           String sql = "select * from student";
           //3)創(chuàng)建statement
           stmt = conn.createStatement();
           //4)執(zhí)行sql
           res = stmt.executeQuery(sql);
           //取數(shù)據(jù)
           //int id = res.getInt(1);//java.sql.SQLException: Before start of result set
           //上面報錯的原因在于 光標指向第一行之前
           //System.out.println(res.next());//true
           //System.out.println(res.next());//true
           //System.out.println(res.next());//true
           //System.out.println(res.next());//true
           //System.out.println(res.next());//false //java.sql.SQLException: After end of result set
           //s上面報錯的原因在于光標指向最后一行的之后
           //next()方法返回值如果是true代表當前行有數(shù)據(jù),那么就可以使用getXX()方法獲取列的值扣典,如果是false妆毕,則沒有數(shù)據(jù),這時
           //如果調用getXX()就會報錯贮尖!
           //int id = res.getInt(1);
           
           while(res.next()) {
               //1)根據(jù)列索引來獲取
//              int id = res.getInt(1);
//              String name = res.getString(2);
//              int age = rs.getInt(3);
//              System.out.println(id+"\t" + name +"\t" + age);
               
               //2)根據(jù)列名稱來獲取
               int id = res.getInt("id");
               String name = res.getString("name");
               int age = res.getInt("age");
               System.out.println(id+"\t" + name + "\t" + age);
           }
       }catch(Exception e){
           e.printStackTrace();
       }finally {
           JdbcUtil.close(res, stmt, conn);
       }
   }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末笛粘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子远舅,更是在濱河造成了極大的恐慌闰蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件图柏,死亡現(xiàn)場離奇詭異序六,居然都是意外死亡,警方通過查閱死者的電腦和手機蚤吹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門例诀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裁着,你說我怎么就攤上這事繁涂。” “怎么了二驰?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵扔罪,是天一觀的道長。 經(jīng)常有香客問我桶雀,道長矿酵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任矗积,我火速辦了婚禮全肮,結果婚禮上,老公的妹妹穿的比我還像新娘棘捣。我一直安慰自己辜腺,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著评疗,像睡著了一般测砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壤巷,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天邑彪,我揣著相機與錄音,去河邊找鬼胧华。 笑死寄症,一個胖子當著我的面吹牛,可吹牛的內容都是我干的矩动。 我是一名探鬼主播有巧,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悲没!你這毒婦竟也來了篮迎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤示姿,失蹤者是張志新(化名)和其女友劉穎甜橱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栈戳,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡岂傲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了子檀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊掖。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褂痰,靈堂內的尸體忽然破棺而出亩进,到底是詐尸還是另有隱情,我是刑警寧澤缩歪,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布归薛,位于F島的核電站,受9級特大地震影響匪蝙,放射性物質發(fā)生泄漏主籍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一骗污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沈条,春花似錦需忿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涕烧。三九已至,卻和暖如春汗洒,著一層夾襖步出監(jiān)牢的瞬間议纯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工溢谤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞻凤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓世杀,卻偏偏與公主長得像阀参,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞻坝,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 本節(jié)介紹Statement接口及其子類PreparedStatement和CallableStatement蛛壳。 它...
    zlb閱讀 1,165評論 0 0
  • 以下我是歸納的JDBC知識點圖: 圖上的知識點都可以在我其他的文章內找到相應內容。 JDBC常見面試題 JDBC操...
    Java3y閱讀 1,733評論 0 15
  • 本人的環(huán)境為Myeclipse10所刀、MySQL5.7.15 本文包括:簡介JDBC編程步驟打通數(shù)據(jù)庫程序詳解—Dr...
    廖少少閱讀 3,950評論 7 39
  • 獨立自主地起舞衙荐,不帶半點嬌羞的炫耀。
    vickysaid閱讀 84評論 0 0
  • 2017年7.月14日 星期五 晴 今天是特訓的第20天浮创,馬上迎來我們的畢業(yè)典禮忧吟!今晚大家都特別的不舍 一起從...
    翁霞閱讀 156評論 0 1