vi /home/www/cnmsql.jsp ## 源代碼如下: <%@ page language="Java" import="java.sql.*"%> <% Class.forName ("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://host_name/db_name","user_name","passWord"); Statement stmt = conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from prov"); rs.next(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.next(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.previous(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.last(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.first(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.close(); stmt.close(); conn.close(); %> 4 測試該程序 lynx http://www.yesgo.loc/cnmysql ##正確的結果應該是: 1 安徽 2 北京 1 安徽 34 台灣 1 安徽 例二:使用連接池連接數據庫 1 建立數據源 vi /usr/local/resin/conf/resin.conf <resource-ref> <res-ref-name>jdbc/yesgo</res-ref-name> //數據源名稱 <res-type>javax.sql.DataSource</res-type> //數據源類型 <init-param driver-name="org.gjt.mm.mysql.Driver"/> //數據庫驅動 <init-param url=" jdbc:mysql://localhost/yesgo "/> //連接串 <init-param user="your_user_name"/> //用戶名 <init-param password="your_password"/> //密碼 <init-param max-connections="20"/> //最大連接數 <init-param max-idle-time="30"/> //延時時間 </resource-ref> 2 創建JSP源文件 toUCh /home/www/testpool.jsp chown -R www /home/www/testpool.jsp chgrp -r root /home/www/testpool.jsp chmod 771 /home/www/testpool.jsp vi /home/www/testpool.jsp ## 源代碼如下: <%@ page language="java" import="java.sql.*,com.caucho.sql.*;"%> <% DBPool pool=new DBPool(); Connection conn = pool.getPool("data_source_name ").getConnection(); Statement stmt = conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from prov"); rs.next(); out.print(rs.getString("prov_id")+rs.getString("prov_name")+""); rs.next(); out.print(rs.getString("prov_id")+rs.getString("prov_name")+""); rs.previous(); out.print(rs.getString("prov_id")+rs.getString("prov_name")+""); rs.last(); out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+""); rs.first(); out.print(rs.getString("prov_id")+rs.getString("prov_name")+""); rs.close(); stmt.close(); conn.close(); %> 3 調試該程序 lynx http://www.yesgo.loc/testpool.jsp ##處理的結果跟例一是一樣的: 1 安徽 2 北京 1 安徽 34 台灣 1 安徽 例三:使用處理層連接數據庫 ##本例告訴你如何使用組件 ##其實你完全可以寫一個bean來處理數據庫,而不用象例二那麼羅索。只用四條語句就可以取出數據庫中的所有數據並顯示出來,這樣做實現了處理層和邏輯層的徹底分離,由邏輯層發出指令、由處理層去響應相關處理,記錄集也不會返回到邏輯層的jsp頁面,而由處理層的bean處理,使得代碼非常精簡,效率也更高。至於如何書寫組件不是本文檔的重點,下面僅給出一個組件的例子並說明邏輯層的調用方法,你會發現其實邏輯層是個官僚,處理層是下屬,呵呵。 1 創建處理層組件 下面的組件是我為公司寫的數據庫處理組件的簡化版本,考慮到篇幅和可讀性等問題,這裡我簡化了它的功能(象數據分頁、批量更新、獲取字段數和字段名稱,用set和get提高其擴展性、對其他連庫方法的支持等都沒有出現在下面的代碼中),使之包含所有常用的功能並使之更加清晰和易於理解;其二,我將連庫動作加到了構造函數中,這是個優點也是個缺點,優點是簡化了連庫動作,缺點是降低了通用性,我沒有添加設置數據源等方法,從而每當變換一次數據庫就需要改寫組件中的連接池名稱,這在做一個固定項目的時候是可以的,如果你需要set數據源,可以自行添加; ##使用組件的方法: 我這裡說的是使用bean的通用方法,你建立自己的bean目錄可以仿照該例子。在你的站點根目錄下建立resin.conf中指定的存放bean的目錄,我上面的舉例是classes,那你就建立classes目錄,那麼classes就是你站點的class根目錄。然後在下面依次建立com\gledecity\yesgo\sql,注意它們之間是父子關系,不是同級文件夾,然後將下面即將建立的DBBridge.java放到"站點根目錄\classes\com\gledecity\yesgo\sql"目錄下,然後將該文件上傳到服務器端即可。上面的步驟在微軟平台上使用UltraDev之類的開發工具即可完成,當然手工也可以。 源文件如下: //------------------------------------------------------------------------------ // File: DBBridge.java // Copyright (c) 2001-2002 Mr.Fengjun Zhao. All Rights Reserved. // Author: 趙鳳君@06/18/01 // Last Revision: 趙鳳君@01/18/2002 // Description: 數據庫接口類。一個統一的數據庫接口,實現了邏輯層和 數據層的徹底分離,封裝了常用的數據庫操作。主要功能是:連接數據庫、執行SQL語句、數據庫取值操作、數據分頁、清除數據、關閉數據庫等。 // Version:簡化版1.0 //------------------------------------------------------------------------------ //指定包目錄 package com.gledecity.yesgo.sql; //導入包 import java.sql.* ; import com.caucho.sql.*; public class DBBridge { //聲明屬性 private DBPool pool ; private Connection conn ; private ResultSet rs ; private Statement stmt ; // -------------------------------------- 構造函數--------------------------------- public DBBridge() { pool=null ; conn=null ; rs=null ; stmt=null ; try{open();} catch(java.sql.SQLException ex){ex.toString();} } // //連接數據庫的方法 public void open() throws SQLException { if( conn!=null && !conn.isClosed() ) throw new SQLException( "The connection has been established already." ) ; clear () ; pool=new DBPool(); conn = pool.getPool("your_data_source_name").getConnection(); } //執行SQL語句的方法,將JDBC中的executeQuary()和executeUpdate()兩個方法//合而為一,注意返回值為整形, public int execSQL( String sqlStmt ) throws SQLException { if( conn==null conn.isClosed() ) throw new SQLException( "This connection has not been established yet." ) ; if( sqlStmt==null ) throw new SQLException( "SQL-statement is null." ) ; clear () ; conn.setAutoCommit( true ) ; stmt=conn.createStatement() ; if( sqlStmt.toUpperCase().startsWith( "SELECT" ) ) { rs=stmt.executeQuery( sqlStmt ) ; return -1 ; } else { int numRow=stmt.executeUpdate( sqlStmt ) ; clear() ; return num