漫談jdbc,jdbc串連資料庫

來源:互聯網
上載者:User

漫談jdbc,jdbc串連資料庫
本文可作為北京尚學堂jdbc課程的學習筆記;
簡介jdbc是什麼東西?
jdbc全稱(Java Database Connectivity java資料庫連接)
它是幹什麼的?
至於它是幹什麼的,那就應了那句老話了,說來話長..
很久很久之前,作為使用者,我們有c,c++,java...各種語言,另一方面資料庫領域Oracle,Mysql,DB2,SQLServer也是種類繁多。
為了方便我們使用者的使用各大資料庫廠商就就建立了自己的API,如

看上去還不錯哦。
後來,我們還是覺得麻煩,雖然各個廠商有自己的API,但我Oracle和Myaql畢竟不一樣呀!作為客戶的我們,並不想學習那麼多的API,怎麼辦?
再加一層唄!

至於odbc是微軟出的一套東西,乾的事情和jdbc一樣,就是屏蔽各個資料庫的不同!
看上面的圖大家就應該明白,各個資料庫廠商會開發自己的jdbc jar包。
至此,我們就不需要管各個資料庫的差異問題了。(當然,各個資料庫的sql文法還有些微的不同,再後來Hibernate出現了,這裡我們先不談)
我們只用瞭解一個統一的介面,就能方便的使用各個資料庫。


編程步驟
LoadDriver

    Class.forName("com.mysql.jdbc.Driver");    Class.forName("com.mysql.jdbc.Driver").newInstance();    new com.mysql.jdbc.Driver();
三種方式都可以,不過我們經常採用第一種方式,三者有什麼區別?
我們看這個例子
package load;public class LoadTest {    public static void main(String[] args) {        try {            Class.forName("load.Loaded");            System.out.println("*******");            Class.forName("load.Loaded").newInstance();            System.out.println("*****");            new Loaded();        } catch (ClassNotFoundException |IllegalAccessException|InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}package load;public class Loaded {    static{        System.out.println("i am static");    }    public Loaded(){        System.out.println("i am constructed");    }}
運行結果:
i am static
*******
i am constructed
*****
i am constructed
大家應該明白了
Class.forName("***"); 會載入一個類,返回的結果是Class類型的,在載入過程中,會執行類中的靜態語句塊;
Class.forName("***").newInstance(); 它其實和new ***()是一樣的,當然類只用載入一次,所以上面調用這行代碼的時候沒有顯示i am static
new ***() 這個和上面那個的區別在於,這個方法可以傳遞參數,構造不同的類,但是上面的newInstance只能構造無參的對象;
在說的通俗一點,jvm要產生一個類
需要兩步,載入與執行個體化!
第一個方式是載入,後面兩個既載入,又執行個體化(當然,如果前面已經載入了,就不用再載入了)

另外,關於這部分源碼基本的分析如com.mysql.jdbc.Driver中到底幹了什麼,我們後面再說,這裡就不多討論了。

獲得Connection

DriverManager.getConnection(url,username,password);

三個參數的意思我就不多說了,這裡需要我們注意的其實也就一個url,不過大家也不用死記硬背,知道有這麼個東西就ok;

獲得Statemment;    Statement st=con.creatStatemnent();
獲得結果集;首先我們得說明,這裡的結果集是用ResultSet來組織的。
    ResutSet rs=st.executeQuery("select * from admininfo");
遍曆結果集:    while (rs.next()) {
        System.out.println(rs.getString("Filedname"));
    }
這裡我得說明一點,即使你想取得資料集中的第一條資料,rs.next()這行也必須有。我們可以理解為,初始情況下resultset內部的"遊標"在第一條資料前面,我們得next一下能找到下一條資料!
close    一個原則,後建立的對象先關閉。


最基本的jdbc

下面的代碼,寫的比較全,只有一個要求,背下來!不要說,先看看,以後再說,這是基礎!應該全文默寫!!

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBC_Test2 {    public static void main(String[] args) {                Connection conn=null;        Statement st=null;        ResultSet rs=null;        String url="jdbc:mysql://localhost:3306/webexample?useUnicode=true&characterEncoding=UTF-8";        String userName="root";        String passWord="";        try {            Class.forName("com.mysql.jdbc.Driver");            conn=DriverManager.getConnection(url,userName,passWord);            st=conn.createStatement();            rs=st.executeQuery("select * from admininfo");            while (rs.next()) {                System.out.println(rs.getString("Aname"));            }                                } catch (ClassNotFoundException e) {            e.printStackTrace();           //log4j 具體記錄        }catch (SQLException e) {            e.printStackTrace();        }        finally{            try {                if (rs!=null) {                    rs.close();                    rs=null;                }                if (st!=null) {                    st.close();                    st=null;                }                if (conn!=null) {                    conn.close();                    conn=null;                }                            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

幾個知識點PreparedStatement其實Statement本身已經夠用了,不過有點不方便,哪裡不方便?
看下面的例子:
我想將一條資料插入到資料庫中如下
      
            String name="董磊峰";            int id=16;            String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ";            st.executeUpdate(sql);
大家不覺得產生那個sql語句很麻煩嗎?你少寫一個'都有可能出錯。
所以有了PreparedStatement,它也是一個介面,繼承自Statement。
其用法為
       
            String name="董磊峰2";            int id=18;            String sql="insert into admininfo (Aname,Aid) values(?,?)";            PreparedStatement st=conn.prepareStatement(sql);            st.setString(1, name);         //給第一個欄位注入String型的數值name  這個不是從0開始            st.setInt(2, id);            st.execute();


用若干個?代替要插入的字元,比上面的sql清楚多了,不是嗎?

批處理問題如果我想執行多條sql語句怎麼辦?
使用Statement
            String name="董磊峰2";            int id=154;            int id2=487;            String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ";            String sql2="insert into admininfo (Aname,Aid) values('"+name+"',"+id2+") ";            System.out.println(sql);            st=conn.createStatement();            st.executeUpdate(sql);            st.executeUpdate(sql2);
使用PretaredStatement
            String name="董磊峰2";            int id=48;            String sql="insert into admininfo (Aname,Aid) values(?,?)";            System.out.println(sql);            st=conn.prepareStatement(sql);            st.setString(1, name);            st.setInt(2, id);            st.execute();                        st=conn.prepareStatement(sql);            st.setString(1, name);            st.setInt(2, id+1);            st.execute();
似乎都不是太方便
看新的方法
使用Statement
            st=conn.createStatement();            st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ");            st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") ");            st.executeBatch();
使用PretaredStatement
            String sql="insert into admininfo (Aname,Aid) values(?,?)";            System.out.println(sql);            st=conn.prepareStatement(sql);            st.setString(1, name);            st.setInt(2, id);            st.addBatch();                        st.setString(1, name+"ss");            st.setInt(2, id+15);            st.addBatch();            st.executeBatch();
會用即可,這裡不必深究。

TransactionTransaction我們一般翻譯成會話,就是一個不可分割的多條(或一條)sql語句,在一個Transaction中,這些sql語句要麼全部執行成功,要麼一個也不執行。
它有什麼用?還用解釋麼?想想銀行。
在jdbc中,預設一個sql語句就是一個transaction。
看看代碼
      
            try{                        conn.setAutoCommit(false);            st=conn.createStatement();            st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ");            st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") ");            st.executeBatch();            conn.commit();            conn.setAutoCommit(true);    //用完了得改回去            }catch(Exception e){                if(conn!=null){                conn.rollBack();          //sql代碼撤銷                conn.setAutoCommit(true);  //還得改回去                }            }

可滾動的結果集        
            String sql="select * from admininfo order by Aid";            st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);            rs=st.executeQuery(sql);                    /*    admininfo 表內容         *  Aid  Aname            15  dlf            16  董磊峰            18  董磊峰2            48  董磊峰2            49  董磊峰2            55  董磊峰2            154  董磊峰2            155  董磊峰2            487  董磊峰2            1599  董磊峰2ss            2000  董磊峰2            2015  董磊峰2ss            3000  董磊峰2666            8000  董磊峰2hhhh            10001  wyf            10002  zrk            */            rs.absolute(4);            System.out.println("第4   "+ rs.getInt("Aid"));            System.out.println("第幾條   "+ rs.getRow());            rs.first();            System.out.println("第一個   "+ rs.getInt("Aid"));            rs.last();            System.out.println("最後一個   "+ rs.getInt("Aid"));            System.out.println("總數   "+ rs.getRow());            System.out.println("是否最後一個   "+ rs.isLast());            System.out.println("最後結尾   "+ rs.isAfterLast());            rs.next();            System.out.println("最後結尾   "+ rs.isAfterLast());


結果
第4   48
第幾條   4
第一個   15
最後一個   10002
總數   16
是否最後一個   true
最後結尾   false
最後結尾   true
看看這些方法的名字還有結果,大家應該能知道方法的作用,不過isAfterLast方法大家估計有點迷惑。
最後一個的後面?
這個方法是判斷當前指標是否已經到檔案尾,注意:檔案尾和最後一條記錄是不同的。

比如我們開始讀取 ResultSet 時,指標位於檔案頭,首先需要 rs.next() 執行這個方法,指標移到第一條記錄後才可以進行讀取。到檔案尾也是一樣的,讀到最後一條記錄後,再繼續讀就到檔案尾了,沒有記錄了,執行 isAfterLast() 方法就返回 true 了。


參考資料

http://blog.163.com/yutao_inx_319/blog/static/207234007201311177482930/    java,ResultSet 類中的isAfterLast()方法

http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html  三種類載入方式的區別




淺談怎應用JDBC串連資料庫MySQL答案

首先正確安裝好MySQL,建立好資料庫
studentinfo
mysqlcreate database studentinfo;
然後編寫java代碼,
ConnectToMySQL.java
import java.sql.*;public class ConnectToMySQL { public static Connection getConnection() throws SQLException , java.lang.ClassNotFoundException{ String url = jdbc:mysql://localhost:3306/studentinfo; Class.forName(com.mysql.jdbc.Driver); String userName = root; String password = ; Connection con = DriverManager.getConnection(url,userName,password); return con; } public static void main(String[] args) { try{ Connection con = getConnection(); Statement sql = con.createStatement(); sql.execute(drop table if exists student); sql.execute(create table student(id int not null auto_increment,name varchar(20) not null default 'name',math int not null default 60,primary key(id));); sql.execute(insert student values(1,'AAA','99')); sql.execute(insert student values(2,'BBB','77')); sql.execute(insert student values(3,'CCC','65')); String query = select * from student; ResultSet result = sql.executeQuery(query); System.out.println(Student表資料如下:); System.out.println(---------------------------------); System.out.println(學號+ +姓名+ +數學成績); System.out.println(---------------------------------); int number; String name; String math; while(result.next()){ number = result.getInt(id); name = result.getString(name); math = result.getString(math); System.out.println(number + + name + + math)......餘下全文>>
 
簡單談一下spring,struts,hibernate的作用;

我來用人性化的語言簡單的介紹下:
1.struts的作用避免了在jsp頁面當中寫太多的代碼,做到保持jsp的介面整潔,同時可以實現mvc模式,struts的根本作用就是方便以後對程式的修改。
2.hibernate呢,就省掉了你自己手寫代碼串連資料庫的麻煩
3.spring作用降低耦合性,在另外兩個架構中間,使它們之間的關係不是絕對的,說到底也是為了以後的修改做打算。
他們三者呢,都是為了能更好的實現團隊合作而被使用的
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.