Java 實現連接sql server 2000(JDBC數據庫訪問例子)

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- Java 實現連接sql server 2000(JDBC數據庫訪問例子) (http://www.webasp.net/article/22/21439.htm)
-- 作者:未知
-- 發佈日期: 2005-04-30

劉金龍 04041222 ljlsunny@vip.sina.com

 



第一種:通過ODBC連接數據庫

JAVA語言的跨平台的工作能力(Write Once ,Run Anywhere)、優秀的圖像處理能力(我相信現在沒有那種語言可以超過JAVA在網絡上的圖形處理能力)、網絡通信功能、通過JDBC數據庫訪問技術等等,讓我們誰都不可否認JAVA語言是SUN公司對於計算機界的一個巨大的貢獻。筆者可以描述這樣一個場景:有一天你上網完全可以不用IE 或者NETSCAPE,上網就像是玩遊戲,你可以獲得遊戲那麼精美的圖像和互動的感覺,如果你玩過UO,也許你就知道那種感覺了,但是JAVA做成的東西一定會超過UO的,因為不單單是遊戲,也不是單單是瀏覽器,如果你願意(要你有錢,有時間,有優秀的JAVA人才)你可以把所有的這一切用Java完全集成出來!!!我不是誇大JAVA的功能,大家可以訪問一下http://www.simchina.net的那個社區程序,你就能找到一種感覺了:相信我沒有說什麼假話 。好了,不說廢話了,現在我向你介紹JAVA的數據庫訪問技術----JDBC數據庫訪問技術(你可千萬不要搞成ODBC了喲!)。   JDBC技術事實上是一種能通過JAVA語言訪問任何結構化數據庫的應用程序接口(API)(Sun這樣說的,我也不知道是不是真的),而且現在的JDBC 3.0據Sun說也能訪問Execel等電子錶格程序!   JDBC對於數據庫的訪問有四種方式,我們這裡只是介紹兩種:   第一種是通過ODBC做為“橋”(Bridge)對數據庫訪問,第二種是直接對數據庫訪問。  我們先來看看第一種JDBC<-->ODBC訪問的流程:  JDBC Driver Mannager->JDBC<->ODBC橋->ODBC->數據庫客戶機驅動庫->數據庫服務器->返回查詢結果,在這種訪問中值的我們注意的是雖然JAVA是"Write Once ,Run Anywhere",但是如果通過這種訪問的話,需要客戶端必須設置ODBC和有相應的數據庫客戶機的驅動,當你看了下面的另外一個流程的時候或許你會想:明明下一種更方面,為什麼還要有這個東西的產生!呵呵,因為,未必所有的數據庫服務器提供商都提供下面的JDBC驅動程序(給JDBC訪問提供相應的接口),所以就有了JDBC<->ODBC Bridge。   接著再讓我們來看看第二種訪問流程:   JDBC Driver Mannager->局部JDBC驅動->客戶端數據庫->數據庫服務器->返回查詢結果,這種訪問事實上是轉換JDBC調用為相應的數據庫(Oracle, Sybase, Informix, DB2, 和其他的數據庫數據庫管理系統)的客戶端API調用(這麼說,不知道大家能不能懂,說簡單點就好像ASP不是通過DSN對數據庫訪問而是通過OLEDB訪問,說道這裡我還是不知道大家能不能明白我的意思。哎呀,不要扔雞蛋嘛!),這種方式的訪問需要相應的數據庫提供商提供相應的JDBC驅動程序,但是有一種好處,可以獨立於odbc用於可以隨處可Run的客戶端的瀏覽器中的Applet程序。 我們下面將給大家一個通過JDBC-ODBC橋數據庫訪問的實例,但是在看下面的事例前我想問大家一次:JDK1.3裝了嗎?數據庫驅動裝了嗎(我使用的是SQLserver)?你該沒有使用Linux吧?雖然java支持Linux,但是老兄我可沒有使用Linux喲(這同JAVA的Write Once ,Run Anywhere沒有關係),由於使用了運行於Win下面的ODBC,我建議你看看這篇東西http://www.aspcn.com/showarticle.asp?id=112,否則你要是有了問題,出不了結果那豈不是要怪我(不過欲加之罪,何患無吃... ...),冤枉呀!

哎呀,說了這麼多的廢話,還是讓我們來看看到底JDBC的調用吧!既然我們是通過odbc訪問數據庫,所以這個odbc是跑不了的,我們先來設置你的odbc:打開你的odbc數據源->選擇系統dsn(Click加新的dsn-)->接下來輸入選擇數據庫類型、輸入dsn名:、選擇服務器、連接數據庫的方式、輸入數據庫的登陸用戶和密碼->測試連接,如果測試成功的話,那麼你的dsn就建立好了,我的dsn名為Sqlserver.使用的是sqlserver7.0,以 “sa”登陸,密碼為空。這些東西都是後面要用道的!   好了下面讓我們來看程序代碼: (該代碼已經通過運行)//########################################################### //代碼開始 //########################################################### import java.sql.*; //加載java數據連接包,java基本所有的數據庫的調用的都在這個東西裡面 public class InsertCoffees { public static void main(String args[]) { String url = "jdbc:odbc:sqlserver"; //取得連接的url名,注意sqlserver是dsn名 Connection con; //實例化一個Connection對像 Statement stmt; String query = "select * from col_link"; //選擇所有的Col_link表中的數據輸出 try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加載jdbc-odbc橋驅動 } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); //加載jdbc-odbc橋錯誤 System.err.println(e.getMessage()); //其他錯誤 } try { con = DriverManager.getConnection(url, "sa", ""); //數據庫連接 stmt = con.createStatement(); //Create 一個聲明 stmt.executeUpdate("CREATE TABLE col_link (sitename varchar (20) NULL ,siteurl varchar (50) NULL) "); //執行了一個sql語句生成了一個表col_link的表 stmt.executeUpdate("insert into col_link values('ASP中華網','http://www.aspcn.com')"); stmt.executeUpdate("insert into col_link values('永遠到底有多遠','http://xuankong.com')"); //執行一個insert into語句 stmt.executeUpdate("update col_link set siteurl='http://www.aspcn.com/xuankong/xuankongt.jpg' where siteurl='http://xuankong.com'"); //執行一個update語句,更新數據庫 ResultSet rs = stmt.executeQuery(query); //返回一個結果集 System.out.println("Col_link表中的數據如下(原始數據)"); //下面的語句使用了一個while循環打印出了col_link表中的所有的數據 System.out.println("站點名 "+" "+"站點地址"); System.out.println("---------------"+" "+"----------------"); while (rs.next()) { String s = rs.getString("sitename"); String f = rs.getString("siteurl"); //取得數據庫中的數據 System.out.println(s + " " + f); /*String t = rs.getString(1); String l = rs.getString(2); System.out.println(t + " " + l);*/ /*jdbc提供了兩種方法識別字段,一種是使用getXXX(注意這裡的getXXX表示取不同類型字段的不同的方法)獲得字段名, 第二種*是通過字段索引,在這裡我把第二種方法註釋了*/ /*你可以訪問這個連接獲得getxxx的用法:http://java.sun.com/docs/books/tutorial/jdbc/basics/_retrievingTable.html*/ } stmt.close(); con.close(); //上面的語句關閉聲明和連接 } catch(SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); //顯示數據庫連接錯誤或者查詢錯誤 } } } //########################################################### //代碼結束 //###########################################################   在上面這個程序中我想你展示了如何使用JDBC-ODBC連接數據庫,使用SQL語句生成一個表,使用SELECT、INSERT 、UPDATE語句取的、插入和更新一個表中的數據,如何通過字段名和字段索引訪問數據庫中的東東!我希望你能從上面的代碼真正的學習到一些東西!   發揮你的想像力,設想一下JAVA到底,比如說可以通過數據庫做一個不需要GUI(圖形用戶界面)的聊天室,呵呵,感覺起來就像在DOS環境下打字的聊天室!哈哈!   最後需要說的是筆者的調試上面程序的環境:WIN2000 , JDK1.3,MS SQLSERVER編輯軟件:EDITPLUS 2.01a(這最後的東西可不是廢話,雖然早就了一些專業的JAVA開發工具,但是筆者建議JAVA初學者使用文本軟件開發JAVA程序)

 



 



第二種:直接用jdbc訪問數據庫

(1) 該實例已經運行通過

jsp連接Sql Server7.0/2000數據庫   testsqlserver.jsp如下:   <%@ page contentType="text/html;charset=gb2312"%>   <%@ page import="java.sql.*"%>   <html>   <body>   <%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();   String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";   //pubs為你的數據庫的   String user="sa";   String password="";     Connection conn= DriverManager.getConnection(url,user,password);   Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);   String sql="select * from test";   ResultSet rs=stmt.executeQuery(sql);   while(rs.next()) {%>   您的第一個字段內容為:<%=rs.getString(1);%>   您的第二個字段內容為:<%=rs.getString(2);%>   <%}%>   <%out.print("數據庫操作成功,恭喜你");%>   <%rs.close();   stmt.close();   conn.close();     %>   </body>   </html>

 



(2)java訪問sqlserver服務器

第一步:安裝jdbc

點擊SQL Server for JDBC驅動程序安裝程序setup.exe(可以到微軟網站下載 http://msdn.microsoft.com/library/default.asp?rul=/downloads/list/sqlserver.asp下載)

第二步:設置系統變量classpath

假設SQL Server for JDBC 驅動程序安裝在d:\jdbc\,則classpath應該設置如下:

classpath:=.;…;d:\jdbc\lib; d:\jdbc\lib\mssqlserver.jar; d:\jdbc\lib\msutil.jar; d:\jdbc\lib\msbase.jar;

注意:設置時要在最前面的點號和分號



第三步:編輯java程序並且運行

實例1如下:

//import com.microsoft.*;

//注意:在java與sql server 連接時不需要這個包,其他書上說這個包是必需的,這個問題有待進一步討論



import java.sql.*;

import java.net.URL;

class insert

{

       public static void main(String[] args)

       {

        String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=northwind";

 



              String query="select * from categories";

              String query1="insert categories values(10,'Hanbao','Sweet')";

              String query2="insert categories values(11,'Naicha','Coffee taste')";

              try

              {

                 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

                 Connection con=DriverManager.getConnection(url,"sa","739555");

                 Statement stmt=con.createStatement();

                 stmt.executeUpdate(query1);

                 stmt.executeUpdate(query2);

 



                 stmt.close();

                 con.close();

 



              }

              catch(SQLException ex)

              {

 



              }

              catch(java.lang.Exception ex)

              {

                 ex.printStackTrace();

              }

       }

}

 



實例2如下:

//import com.microsoft.*;

//注意:在java與sql server 連接時不需要這個包,其他書上說這個包是必需的,這個問題有待進一步討論

import java.sql.*;

import java.net.URL;

class java2sqlserver

{

       public static void main(String[] args)

       {

              String url="jdbc:microsoft:sqlserver://localhost:1433;User=sa;Password=739555;DatabaseName=northwind";

              String query="Select * From Categories";

              try

              {

                     Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

                     //DriverManager.setLogStream(System.out);

                     Connection con=DriverManager.getConnection(url);

                     checkForWarning(con.getWarnings());

                     Statement stmt=con.createStatement();

                     ResultSet rs=stmt.executeQuery(query);

                     dispResultSet(rs);

                     rs.close();

                     stmt.close();

                     con.close();

              }

              catch(SQLException ex)

              {

            System.out.println(ex.toString()+"----SQLException caught----");

                     while(ex!=null)

                     {

                            System.out.print("SQLState:"+ex.getSQLState());

                            System.out.print("Message:"+ex.getMessage());

                            System.out.print("Vendor:"+ex.getErrorCode());

                ex=ex.getNextException();

                            System.out.println("");

                     }

              }

              catch(java.lang.Exception ex)

              {

                     ex.printStackTrace();

              }

}

             

              private static boolean checkForWarning(SQLWarning warn)

              {

                     boolean rc=false;

                     if(warn!=null)

                     {

                            System.out.println("----Warning----");

                            rc=true;

                            while(warn!=null)

                            {

                            System.out.print("SQLState:"+warn.getSQLState());

                            System.out.print("Message:"+warn.getMessage());

                            System.out.print("Vendor:"+warn.getErrorCode());

                            System.out.println("");

                            warn=warn.getNextWarning();

 



                            }

                     }

                     return rc;

              }

 



              private static void dispResultSet(ResultSet rs) throws SQLException

              {

            int i;

                     ResultSetMetaData rsmd=rs.getMetaData();

                     int numCols=rsmd.getColumnCount();

                     for(i=1;i<=numCols;i++)

                     {

                            if(i>1) System.out.print(",    ");

                            System.out.print(rsmd.getColumnLabel(i));

 



                     }

                     System.out.println("");

                     boolean more=rs.next();

                     while(more)

                     {

                            for(i=1;i<numCols;i++)

                            {

                                   if(i<1) System.out.print(",    ");

                                   System.out.println(rs.getString(i));

                            }

                            System.out.println("");

                            more=rs.next();

                     }

              }

              //System.out.println("Hello World!");

       }

 



以上兩個實例筆者已經通過運行!

webasp.net