<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jimphei學(xué)習(xí)工作室

    jimphei學(xué)習(xí)工作室

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      23 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks
    1、建立數(shù)據(jù)庫連接

          首先要建立一個到想要使用的DBMS的連接。這包括兩個步驟:(1) 加載驅(qū)動程序;(2) 創(chuàng)建連接。


       (1) 加載驅(qū)動程序 
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //字符串為他驅(qū)動程序的類名

      (2) 創(chuàng)建連接

          創(chuàng)建連接的第二步是使用合適的驅(qū)動程序連接到DBMS。如下代碼行示范了一般的用法:

                //url字符串為使用的子協(xié)議,也就是在JDBC URL中放在jdbc:之后的東西 
              Connection con = DriverManager.getConnection(url,"myLogin", "myPassword"); 

     2、創(chuàng)建和執(zhí)行JDBC語句

       Statement對象可將SQL語句發(fā)送到DBMS。這只要創(chuàng)建一個Statement對象,將想要執(zhí)行的SQL語句傳遞給適當?shù)膱?zhí)行方法,

    然后執(zhí)行該Statement對象。

          Statement stmt = con.createStatement();

     

       對于SELECT語句,使用的方法是executeQuery。對于創(chuàng)建或修改表的語句,使用的方法是executeUpdate。

       //strSQL字符串是一條DDL(數(shù)據(jù)描述語言)語句

       stmt.executeUpdate(strSQL);

    3、處理結(jié)果

       JDBC將結(jié)果集返回給ResultSet對象

       //strSQL字符串是一條查詢語句   

       ResultSet rs = stmt.executeQuery(strSQL);
       1)next方法
       變量rs(ResultSet的一個實例)包含了結(jié)果集中顯示的表。為訪問名稱和單價要移動到每一行,根據(jù)它們的類型檢索數(shù)值。
    next方法將光標移到下一行,使那行(稱為當前行)成為可在其上操作的行。由于光標初始定位于ResultSet對象第一行的上面,
    所以第一次調(diào)用next方法將光標移到第一行,使它成為當前行。接下來調(diào)用next方法將使光標從上至下每次移動一行。
       2)getXXX方法
       適當類型的getXXX方法可用于檢索列中的數(shù)值。檢索VARCHAR SQL類型數(shù)值的方法是getString。檢索該類型數(shù)值的方法是getFloat。
    每次調(diào)用next方法,下一行就成為當前行,循環(huán)一直持續(xù)到rs中再也沒有可向前移動的行為止。
    while (rs.next()) 
    {
        String s = rs.getString(strColumnName1 );//strColumnName1為strSQL字符串中的列名
        float n = rs.getFloat(strColumnName2)//strColumnName2為strSQL字符串中的列名
        System.out.println(s + " " + n);
    }
    JDBC使用兩種方法標識getXXX方法檢索數(shù)值的列。一種是指定列名,這也是前面例子所做的。
    另一種是指定列索引(列的序號),1表示第一列,2表示第二列,以此類推。
       String s = rs.getString(1); float n = rs.getFloat(2);
       3)getString方法
       盡管推薦使用getString方法檢索CHAR和VARCHAR SQL類型的數(shù)據(jù),但也可能用它檢索其他基本SQL類型的數(shù)據(jù)
    (但不可用它檢索新的SQL3數(shù)據(jù)類型。本教程后面將討論SQL3類型)。用getString檢索所有數(shù)值有很多優(yōu)點但也有局限。
    如果用它檢索numeric類型的數(shù)據(jù),getString將把numeric值轉(zhuǎn)換成Java的String對象,這樣一來,在數(shù)據(jù)要作為數(shù)字前就必須轉(zhuǎn)換回numeric類型。
    在數(shù)值一直當成字符串的場合,這是無可非議的。如果想讓程序檢索除了SQL3類型之外的任何標準SQL類型,就可用getString方法。
     
    4、關(guān)閉連接
       connection.close();
     
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    下面是個完整的例子:
    1)下載并安裝Microsoft JDBC (http://download.microsoft.com/download/SQLSVR2000/Install/2.2.0022/NT5XP/EN-US/setup.exe)
    2) 安裝完成Microsoft JDBC后,將安裝目錄中的lib目錄下三個jar文件msbase.jar, mssqlserver.jar, msutil.jar引入項目中 
    3)建立數(shù)據(jù)庫tempdb,建立表COFFEES,SQL語句為:
       CREATE TABLE COFFEES (COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, SALES INTEGER, TOTAL INTEGER) 
    4)給表COFFEES添加一些數(shù)據(jù),如:
       INSERT INTO COFFEES VALUES ('Colombian', 101, 7.99, 0, 0); 
    5)輸入以下源文件,并執(zhí)行
    import java.sql.*;
    /**
     * @author liujun TODO To change the template for this generated type comment go
     *         to Window - Preferences - Java - Code Style - Code Templates
     */
    public class JDBC_01
    {
        public static void main(String[] args)
        {
            showTable();
        }
        public static void showTable()
        {
            //String strDriver="sun.jdbc.odbc.JdbcOdbcDriver";
            String strDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
            //String strConnUrl="jdbc:odbc:TempDataSources";
            String strConnUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdb";
            String strSQL = "select * from COFFEES";
            try
            {
                //加載驅(qū)動程序
                Class.forName(strDriver);
                //創(chuàng)建連接
                Connection objConn = DriverManager.getConnection(strConnUrl, "sa",
                        "");
                //創(chuàng)建Statement對象
                Statement objStatement = objConn.createStatement();
                //JDBC將結(jié)果集返回給ResultSet對象
                ResultSet objSet = objStatement.executeQuery(strSQL);
                //獲得查詢結(jié)果的列數(shù)
                int lCloumnCount = objSet.getMetaData().getColumnCount();
                System.out.println("查詢結(jié)果如下所示");
                //顯示列名
                for (int i = 1; i <= lCloumnCount; i++)
                {
                    System.out.print(objSet.getMetaData().getColumnName(i)
                            + "       ");
                }
                System.out.println();
                //顯示結(jié)果
                while (objSet.next())
                {
                    //顯示COF_NAME
                    System.out.print("" + objSet.getString(1));
                    //顯示SUP_ID PRICE SALES TOTAL
                    System.out.print("        " + objSet.getInt(2));
                    //顯示 PRICE
                    System.out.print("         " + objSet.getFloat(3));
                    //顯示SALES
                    System.out.print("         " + objSet.getInt(4));
                    //顯示 TOTAL
                    System.out.print("        " + objSet.getInt(5));
                }
           objConn.close();
            }
            catch (Exception e)
            {
                System.out.print(e.getMessage());
            }
        }
    }

    5、使用預(yù)備語句

       PreparedStatement對象是包含一條預(yù)編譯過的SQL語句。DBMS不必編譯就可直接運行PreparedStatement的SQL語句。所以代替Statement對象一般會縮短執(zhí)行時間。盡管paredStatement對象可用于不帶參數(shù)的SQL語句,但在多數(shù)場合是用于帶參數(shù)的SQL語句。其用法如下:

       String strUpdateSales="UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?";

       PreparedStatement updateSales = con.prepareStatement(strUpdateSales);
       updateSales.setInt(1, 75);//給上面的SQL語句的第一個問號付值
       updateSales.setString(2, "Colombian");//給上面的SQL語句的第二個問號付值
       updateSales.executeUpdate();//執(zhí)行UPDATE COFFEES SET SALES = 75 WHERE COF_NAME LIKE ‘Colombian’
    因此,可用該對象制作成模板實現(xiàn)一次構(gòu)造多條帶參數(shù)的SQL語句,簡化編碼。
     
    6、executeUpdate方法的返回值
       executeQuery返回一個ResultSet對象,但executeUpdate返回的是一個整數(shù)值,指出了表中已更新的行數(shù)
    如果executeUpdate的返回值為0表明如下兩種情況:(1) 執(zhí)行的語句是一不影響任何行的更新語句;(2) 執(zhí)行的是一DLL語句。
     
     7、使用事務(wù)
       一個事務(wù)是作為一個單元執(zhí)行的一組語句(一條或多條語句),因此它們要么全部執(zhí)行,要么全部不執(zhí)行。要讓兩條或更多條語句組成
    一個事務(wù)就要禁用自動提交模式,具體用方法con.setAutoCommit(false);一旦禁用了自動提交模式,就沒有SQL語句會提交了,
    除非您顯式調(diào)用con.commit()方法,實現(xiàn)提交事務(wù)。
       使用事務(wù)可以保持數(shù)據(jù)完整性。調(diào)用rollback方法可取消一個事務(wù),將修改的任何數(shù)據(jù)返還到以前的值。如果在執(zhí)行一個事務(wù)
    中的一條或多條語句時得到了SQLException。就應(yīng)該調(diào)用rollback方法取消事務(wù),從頭開始整個事務(wù)。一般要在catch塊中調(diào)用
    rollback,以避免可能使用不正確的數(shù)據(jù)。
     
    8、檢索警告
       SQLWarning對象是SQLException的子類,用于處理數(shù)據(jù)庫訪問警告。就像異常一樣,警告并不終止程序的執(zhí)行;它們只是提醒
    用戶——發(fā)生了一些未預(yù)料的事情。Connection對象、Statement對象(包括PreparedStatement和CallableStatement對象)
    或ResultSet對象都會報告警告。這些類都有g(shù)etWarnings方法,為查看調(diào)用對象報告的第一個警告,就必須調(diào)用該方法。如果
    getWarnings返回一個警告,就可在其上調(diào)用SQLWarning方法getNextWarning取得其他警告。自動執(zhí)行一條語句會清除前一條語句
    的警告,因此警告不會迭加。但這也表明提取一條語句報告的警告必須在執(zhí)行下一語句之前進行。
     
    9、存儲過程
       存儲過程是一組SQL語句組成的邏輯單元,用于執(zhí)行特定的任務(wù)。存儲過程用于封裝數(shù)據(jù)庫服務(wù)器上執(zhí)行的一組操作或查詢。
    存儲過程可以編譯,然后使用不同的參數(shù)和結(jié)果執(zhí)行,這些參數(shù)和結(jié)果可以是輸入、輸出和輸入/輸出參數(shù)的任意組合。
       1)用SQL語句創(chuàng)建存儲過程
       如下所示,其方法同其他的DDL語句相同:
       String createProcedure = "create procedure SHOW_SUPPLIERS " +
           "as " +"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + 
           "from SUPPLIERS, COFFEES " +"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
           "order by SUP_NAME"; 
       Statement stmt = con.createStatement();
       stmt.executeUpdate(createProcedure);
       2)從JDBC調(diào)用存儲過程
       第一步是創(chuàng)建一個CallableStatement對象。CallableStatement對象包含了存儲過程的一個調(diào)用;但它不包含存儲過程
    本身。接著使用連接con創(chuàng)建了存儲過程的一個調(diào)用。花括號內(nèi)的那部分就是存儲過程的轉(zhuǎn)義語法。當驅(qū)動程序碰到
    “{call SHOW_SUPPLIERS}”時,它將把這個轉(zhuǎn)義語法轉(zhuǎn)換成數(shù)據(jù)庫使用的本地SQL,以調(diào)用call 后面的的存儲過程。
    如下所示:
       CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}"); 
       ResultSet rs = cs.executeQuery();
       注意,用于執(zhí)行cs的方法是executeQuery,因為cs調(diào)用的存儲過程包含一個查詢,執(zhí)行后產(chǎn)生一個結(jié)果集。如果存儲過程
    包含一條更新或一條DLL語句,那就要使用executeUpdate方法。但有時一個存儲過程包含多條SQL語句,因而它產(chǎn)生的不只是
    一個結(jié)果集、不只是一個更新計數(shù)或產(chǎn)生一些結(jié)果集和更新計數(shù)的組合。這樣就有多個結(jié)果集,這時就應(yīng)該使用execute方法
    來執(zhí)行CallableStatement。 CallableStatement類是PreparedStatement的子類,因此CallableStatement對象可與
    PreparedStatement對象一樣帶有輸入?yún)?shù)。此外,CallableStatement對象還可帶輸出參數(shù)或輸入/輸出參數(shù)
    posted on 2009-08-14 10:34 jimphei 閱讀(120) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久亚洲AV无码麻豆| 中文字幕在线成人免费看| 91在线视频免费观看| 午夜两性色视频免费网站| 久久精品国产亚洲AV无码娇色| 中文字幕高清免费不卡视频| 亚洲中文字幕无码中文字在线 | 久久精品国产亚洲AV不卡| 亚洲高清国产拍精品熟女| 37pao成人国产永久免费视频| 亚洲AV无码专区国产乱码4SE| 今天免费中文字幕视频| 国产亚洲色婷婷久久99精品91| 一级毛片免费不卡| 国产成人福利免费视频| 亚洲AV无码国产精品麻豆天美 | 一个人看的hd免费视频| 四虎永久免费地址在线观看| 日本高清不卡中文字幕免费| 国产亚洲精品不卡在线| 国产高潮久久免费观看| 亚洲国产成人久久综合一区77 | mm1313亚洲国产精品美女| 亚洲aⅴ天堂av天堂无码麻豆| 午夜国产羞羞视频免费网站| 亚欧洲精品在线视频免费观看| 久久久久亚洲精品成人网小说| 一级成人a毛片免费播放| 久久久无码精品亚洲日韩蜜桃| 日本黄网站动漫视频免费| 亚洲综合色丁香麻豆| 最近高清中文字幕免费| 亚洲国产精品网站久久| 成人在线免费观看| 99久久亚洲综合精品成人网| 国拍在线精品视频免费观看| 色爽黄1000部免费软件下载| 亚洲国产人成网站在线电影动漫 | 成年黄网站色大免费全看| 亚洲一级毛片免费在线观看| 大胆亚洲人体视频|