[Java]jdbc[轉]

 

>>http://www.cnblogs.com/xiohao/p/3507483.htmlhtml

>>http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.htmljava

>>http://www.cnblogs.com/lee/archive/2007/08/25/869656.htmlmysql

JDBC鏈接各類數據庫方法

1)鏈接Oracle 8/8i/9i/10g/11g(thin模式)

Class.forName("oracle.JDBC.driver.OracleDriver").newInstance();

String url="JDBC:oracle:thin:@localhost:1521:orcl"       //orcl爲Oracle數據庫的SID

String user="test";

String password="test";

Connection con=DriverManager.getConnection(url,user,password);

2)鏈接DB2數據庫

Class.forName("com.ibm.db2.jcc.DB2Driver");

String url="JDBC:db2://localhost:5000/testDb";

String user="test"; String password="test";

Connection con=DriverManager.getConnection(url,user,password);

3)鏈接MySQL數據庫

Class.forName("com.mysql.jdbc.Driver");

String url="JDBC:mysql://localhost:8080/testDB";

String user="test"; String password="test";

Connection con=DriverManager.getConnection(url,user,password);

4)鏈接SQL Server2000數據庫

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

String url="JDBC:microsoft:sqlserver://localhost:1433;DatabaseName=testDb";

String user="test"; String password="test";

Connection con=DriverManager.getConnection(url,user,password);

5)鏈接PostgreSQL數據庫

Class.forName("org.postgresql.Driver");

String url="JDBC:postgresql://localhost/testDb";

String user="test"; String password="test";

Connection con=DriverManager.getConnection(url,user,password);

6)鏈接Access數據庫 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String url="JDBC:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/testDb/mdb");

Connection conn=DriverManager.getConnection(url,"","");

7鏈接Sybase數據庫

Class.forName("com.sybase.JDBC.SybDriver");

String url="JDBC:sybase:Tds:localhost:5007/testDb";

Properties pro=System.getProperties();

pro.put("user","userId");

pro.put("password","user_password");

Connection con=DriverManager.getConnection(url,pro);

8鏈接informix數據庫

Class.forName("com.informix.JDBC.ifxDriver");

String url="JDBC:informix-sqli:localhost:1533/testDb:INFORMIXSERVER=myserver"user=testUser;password=testpassword"; Connection con=DriverManager.getConnection(url);

完整java開發中JDBC鏈接數據庫代碼和步驟web

JDBC鏈接數據庫   
•建立一個以JDBC鏈接數據庫的程序,包含7個步驟1、加載JDBC驅動程序:   
    在鏈接數據庫以前,首先要加載想要鏈接的數據庫的驅動到JVM(Java虛擬機),   
    這經過java.lang.Class類的靜態方法forName(String  className)實現。   
    例如:   
    try{   
    //加載MySql的驅動類   
    Class.forName("com.mysql.jdbc.Driver") ;   
    }catch(ClassNotFoundException e){   
    System.out.println("找不到驅動程序類 ,加載驅動失敗!");   
    e.printStackTrace() ;   
    }   
   成功加載後,會將Driver類的實例註冊到DriverManager類中。   
 2、提供JDBC鏈接的URL   
   •鏈接URL定義了鏈接數據庫時的協議、子協議、數據源標識。   
    •書寫形式:協議:子協議:數據源標識   
    協議:在JDBC中老是以jdbc開始   
    子協議:是橋鏈接的驅動程序或是數據庫管理系統名稱。   
    數據源標識:標記找到數據庫來源的地址與鏈接端口。   
    例如:(MySql的鏈接URL)   
    jdbc:mysql:   
        //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;   
   useUnicode=true:表示使用Unicode字符集。若是characterEncoding設置爲   
   gb2312或GBK,本參數必須設置爲true 。characterEncoding=gbk:字符編碼方式。   
 3、建立數據庫的鏈接   
    •要鏈接數據庫,須要向java.sql.DriverManager請求並得到Connection對象,   
     該對象就表明一個數據庫的鏈接。   
    •使用DriverManager的getConnectin(String url , String username ,    
    String password )方法傳入指定的欲鏈接的數據庫的路徑、數據庫的用戶名和   
     密碼來得到。   
     例如:   
     //鏈接MySql數據庫,用戶名和密碼都是root   
     String url = "jdbc:mysql://localhost:3306/test" ;    
     String username = "root" ;   
     String password = "root" ;   
     try{   
    Connection con =    
             DriverManager.getConnection(url , username , password ) ;   
     }catch(SQLException se){   
    System.out.println("數據庫鏈接失敗!");   
    se.printStackTrace() ;   
     }   
 4、建立一個Statement   
    •要執行SQL語句,必須得到java.sql.Statement實例,Statement實例分爲如下3  
     種類型:   
      1、執行靜態SQL語句。一般經過Statement實例實現。   
      2、執行動態SQL語句。一般經過PreparedStatement實例實現。   
      3、執行數據庫存儲過程。一般經過CallableStatement實例實現。   
    具體的實現方式:   
        Statement stmt = con.createStatement() ;   
       PreparedStatement pstmt = con.prepareStatement(sql) ;   
       CallableStatement cstmt =    
                            con.prepareCall("{CALL demoSp(? , ?)}") ;   
 5、執行SQL語句   
    Statement接口提供了三種執行SQL語句的方法:executeQuery 、executeUpdate   
   和execute   
    1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句   
        ,返回一個結果集(ResultSet)對象。   
     二、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或   
        DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等   
     3、execute(sqlString):用於執行返回多個結果集、多個更新計數或兩者組合的   
        語句。   
   具體實現的代碼:   
          ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;   
    int rows = stmt.executeUpdate("INSERT INTO ...") ;   
    boolean flag = stmt.execute(String sql) ;   
 6、處理結果   
    兩種狀況:   
     1、執行更新返回的是本次操做影響到的記錄數。   
     2、執行查詢返回的結果是一個ResultSet對象。   
    • ResultSet包含符合SQL語句中條件的全部行,而且它經過一套get方法提供了對這些   
      行中數據的訪問。   
    • 使用結果集(ResultSet)對象的訪問方法獲取數據:   
     while(rs.next()){   
         String name = rs.getString("name") ;   
    String pass = rs.getString(1) ; // 此方法比較高效   
     }   
    (列是從左到右編號的,而且從列1開始)   
 7、關閉JDBC對象    
     操做完成之後要把全部使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲   
     明順序相反:   
     1、關閉記錄集   
     2、關閉聲明   
     3、關閉鏈接對象   
          if(rs != null){   // 關閉記錄集   
        try{   
            rs.close() ;   
        }catch(SQLException e){   
            e.printStackTrace() ;   
        }   
          }   
          if(stmt != null){   // 關閉聲明   
        try{   
            stmt.close() ;   
        }catch(SQLException e){   
            e.printStackTrace() ;   
        }   
          }   
          if(conn != null){  // 關閉鏈接對象   
         try{   
            conn.close() ;   
         }catch(SQLException e){   
            e.printStackTrace() ;   
         }   
          }  

 

 

jdbcsql

什麼是JDBC?
Java語言訪問數據庫的一種規範,是一套API
JDBC (Java Database Connectivity) API,即Java數據庫編程接口,是一組標準的Java語言中的接口和類,使用這些接口和類,Java客戶端程序能夠訪問各類不一樣類型的數據庫。好比創建數據庫鏈接、執行SQL語句進行數據的存取操做。
 
   JDBC規範採用接口和實現分離的思想設計了Java數據庫編程的框架。接口包含在java.sql及javax.sql包中,其中java.sql屬於JavaSE,javax.sql屬於JavaEE。這些接口的實現類叫作數據庫驅動程序,由數據庫的廠商或其它的廠商或我的提供。
 
   爲了使客戶端程序獨立於特定的數據庫驅動程序,JDBC規範建議開發者使用基於接口的編程方式,即儘可能使應用僅依賴java.sql及javax.sql中的接口和類。

 
JDBC驅動程序:
什麼是JDBC驅動程序?
這些是各個數據庫廠家根據JDBC的規範製做的JDBC實現類
JDBC驅動程序的四種類型:
1.       第一種類型的驅動程序的實現是經過將JDBC的調用所有委託給其它編程接口來實現的,好比ODBC。這種類型的驅動程序須要安裝本地代碼庫,即依賴於本地的程序,因此便攜性較差。好比JDBC-ODBC橋驅動程序
2.       第二種類型的驅動程序的實現是部分基於Java語言的。即該驅動程序一部分是用Java語言編寫,其它部分委託本地的數據庫的客戶端代碼來實現。同類型1的驅動同樣,該類型的驅動程序也依賴本地的程序,因此便攜性較差
3.       第三種類型的驅動程序的實現是所有基於JAVA語言的。該類型的驅動程序一般由某個中間件服務器提供,這樣客戶端程序可使用數據庫無關的協議和中間件服務器進行通訊,中間件服務器再將客戶端的JDBC調用轉發給數據庫進行處理
4.       第四種類型的驅動程序的實現是所有基於JAVA語言的。該類型的驅動程序中包含了特定數據庫的訪問協議,使得客戶端能夠直接和數據庫進行通訊
 
JDBC類結構:
                           DriverManager
 
Driver                     Driver
 
Connection                 Connection
 
Statement                  Statement
 
Resultset                  Resultset
 
DriverManager:這個是一個實現類,它是一個工廠類,用來生產Driver對象的
這個類的結構設計模式爲工廠方法
Driver:這是驅動程序對象的接口,它指向一個實實在在的數據庫驅動程序對象,那麼這個數據庫驅動程序對象是從哪裏來的呢?
DriverManager工廠中有個方法:getDriver(String URL),經過這個方法能夠獲得驅動程序對象,這個方法是在各個數據庫廠商按JDBC規範設計的數據庫驅動程序包裏的類中靜態實現的,也就是在靜態塊中
Connection:這個接口能夠制向一個數據庫鏈接對象,那麼如何獲得這個鏈接對象呢?
是經過DriverManager工廠中的getConnection(String URL)方法獲得的
Statement:用於執行靜態的SQL語句的接口,經過Connection中的createStatement方法獲得的
Resultset:用於指向結果集對象的接口,結果集對象是經過Statement中的execute等方法獲得的
 
JAVA使用JDBC訪問數據庫的步驟:
1.     獲得數據庫驅動程序
2.     建立數據庫鏈接
3.     執行SQL語句
4.     獲得結果集
5.     對結果集作相應的處理(增,刪,改,查)
6.     關閉資源:這裏釋放的是DB中的資源
 
  
設置classpath: 1.     在java文件中起的包名必定要是工程基目錄下的子目錄,classpath:基目錄
2.     .jar包,須要將這個.jar包的路徑包括這個文件的全名添加到classpath中來
Oracle鏈接字符串的書寫格式:
「oracle:jdbc:thin:@ip:1521: 數據庫名」,」數據庫用戶名」,」數據庫密碼」
 
簡單的例子:
package moudule1.first;
 
import java.sql.*;
 
public class FirstJdbc
{
      public static void main(String[] args)
      {
                 String sql="select * from yuchen_user";
                 Connection con=null;
                 Statement st=null;
                 ResultSet rs=null;
                
       try
       { 
                 Class.forName("oracle.jdbc.driver.OracleDriver");
                 con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
                 st=con.createStatement();
                 rs=st.executeQuery(sql);
                 while(rs.next())
                 {
                            System.out.println(rs.getInt("id"));
                            System.out.println(rs.getString("name"));
                 }
       }catch(Exception e)
       {
                 e.printStackTrace();
       }finally
       {
                 try
                 {
                      con.close();
                 }catch(Exception e)
                 {}
                
                 try
                 {
                      st.close();
                 }catch(Exception e)
                 {
                 }
                
                 try
                 {
                      rs.close();
                 }catch(Exception e)
                 {
                 }
                     
       }
 
                
      }
     
}
 
 
經常使用數據庫的驅動程序及JDBC URL:
Oracle數據庫:
驅動程序包名:ojdbc14.jar
驅動類的名字:oracle.jdbc.driver.OracleDriver
  JDBC URL:jdbc:oracle:thin:@dbip:port:databasename
 說明:驅動程序包名有可能會變
       JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部分須要根據數據庫的安裝狀況填寫。其中各個部分含義以下:
        dbip –爲數據庫服務器的IP地址,若是是本地可寫:localhost或127.0.0.1。
        port –爲數據庫的監聽端口,須要看安裝時的配置,缺省爲1521。
        databasename –爲數據庫的SID,一般爲全局數據庫的名字。
        舉例若是要訪問本地的數據庫allandb,端口1521,那麼URL寫法以下:
       jdbc:oracle:thin:@localhost:1521:allandb 下載地址以下:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

SQL Server數據庫 驅動程序包名:msbase.jar mssqlserver.jar msutil.jar 驅動類的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename 說明:驅動程序包名有可能會變 JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部須要根據數據庫的安裝狀況填寫。其中各個部分含義以下: dbip –爲數據庫服務器的IP地址,若是是本地可寫:localhost或127.0.0.1。 port –爲數據庫的監聽端口,須要看安裝時的配置,缺省爲1433。 databasename –數據庫的名字。 舉例若是要訪問本地的數據庫allandb,端口1433,那麼URL寫法以下: jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb 下載地址:http://www.microsoft.com/downloads/details.aspx
MySQL數據庫 驅動程序包名:mysql
-connector-java-3.1.11-bin.jar 驅動類的名字:com.mysql.jdbc.Driver JDBC URL:jdbc:mysql://dbip:port/databasename 說明:驅動程序包名有可能會變 JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部須要根據數據庫的安裝狀況填寫。其中各個部分含義以下: dbip –爲數據庫服務器的IP地址,若是是本地可寫:localhost或127.0.0.1。 port –爲數據庫的監聽端口,須要看安裝時的配置,缺省爲3306。 databasename –數據庫的名字。 舉例若是要訪問本地的數據庫allandb,端口1433,那麼URL寫法以下: jdbc:mysql://localhost:3306/allandb 下載地址:http://dev.mysql.com/downloads/connector/j/
Access數據庫 驅動程序包名:該驅動程序包含在JavaSE中,不須要額外安裝。 驅動類的名字:sun.jdbc.odbc.JdbcOdbcDriver JDBC URL:jdbc:odbc:datasourcename 說明:該驅動只能工做在Windows系統中,首先須要在操做系統中創建一個能夠訪問Access數據庫的本地數據源(ODBC),若是名字爲allandb,那麼URL寫法以下: jdbc:odbc:allandb PreparedStatement接口: 預編譯的sql語句對象 做用: 解決了書寫sql語句時一些特殊的字符與sql保留字符衝突的問題,很是方便
/** *知識點: *PreparedStatement接口及方法的使用 *程序目標: *java文件: *PreparedInsert.java:鏈接數據庫,插入一條數據 *JdbcUtil.java:實現一個工具類,功能:1.鏈接數據庫 2.關閉資源 */ package moudule1.preparedstatement; import java.sql.*; import moudule1.com.*; public class PreparedInsert { public static void main(String[] args) { String sql="insert into yuchen_user (id,name) values (?,?)"; System.out.println(sql); Connection con=null; PreparedStatement ps=null; try{ con=JdbcUtil.getConnection(); ps=con.prepareStatement(sql); ps.setInt(1,2); ps.setString(2,"zhangsan"); ps.executeUpdate(); ps.setInt(1,3); ps.setString(2,"lisi"); ps.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,ps); } } } package moudule1.com; import java.sql.*; public class JdbcUtil{ public static Connection getConnection() throws Exception{ Class.forName("oracle.jdbc.driver.OracleDriver"); return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger"); } public static void close(Connection con,Statement st){ close(con); close(st); } public static void close(Connection con,Statement st,ResultSet rs){ close(con,st); close(rs); } public static void close(Connection con){ try{ con.close(); }catch(Exception e){ } } public static void close(Statement st){ try{ st.close(); }catch(Exception e){ } } public static void close(ResultSet rs){ try{ rs.close(); }catch(Exception e){ } } } 數據庫的增刪改查的例子: /** *知識點: *JDBC+SQL+ORACLE *程序目標: *UserDao.java:實現了數據庫的增刪改查 *JdbcUtil.java:工具類,有連庫和關閉資源的方法 */ package moudule1.idus; import java.sql.*; import moudule1.com.*; public class UserDao{ private String sql; private Connection con; private Statement st; private ResultSet rs; public UserDao(){ sql=null; con=null; st=null; rs=null; } public void insert(){ sql="insert into yuchen_user (id,name) values("; sql+="4,'zhouwu')"; System.out.println(sql); try{ con=JdbcUtil.getConnection(); st=con.createStatement(); st.executeUpdate(sql); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,st); } } public void delete(){ sql="delete from yuchen_user where id=2"; System.out.println(sql); try{ con=JdbcUtil.getConnection(); st=con.createStatement(); st.executeUpdate(sql); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,st); } } public void update(){ sql="update yuchen_user set name='liumang' where id=1"; System.out.println(sql); try{ con=JdbcUtil.getConnection(); st=con.createStatement(); st.executeUpdate(sql); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,st); } } public void select(){ sql="select * from yuchen_user"; System.out.println(sql); try{ con=JdbcUtil.getConnection(); st=con.createStatement(); rs=st.executeQuery(sql); while(rs.next()){ System.out.println(rs.getInt(1)); System.out.println(rs.getString(2)); } }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,st,rs); } } public static void main(String[] args){ UserDao ud=new UserDao(); ud.select(); ud.insert(); ud.select(); ud.update(); ud.select(); ud.delete(); ud.select(); } } 一些經常使用的方法: /** *知識點: *execute方法,getResultSet(),getUpdateCount() *程序目標: *JdbcUtil.java:工具類,鏈接數據庫,關閉資源 *sqlExecutor.java:命令行參數輸入sql語句,並執行該語句 */ package moudule1.fangfa; import java.sql.*; import moudule1.com.*; public class sqlExecutor{ public static void main(String[] args){ Connection con=null; Statement st=null; try{ con=JdbcUtil.getConnection(); st=con.createStatement(); boolean str=st.execute(args[0]); if(str){ ResultSet rs=st.getResultSet(); while(rs.next()){ System.out.println(rs.getInt("id")+":"+rs.getString("name")); } rs.close(); }else{ int row=st.getUpdateCount(); System.out.println(row); } }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.close(con,st); } } } 2. 補充 JDBC鏈接MySQL 加載及註冊JDBC驅動程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver").newInstance(); JDBC URL 定義驅動程序與數據源之間的鏈接 標準語法: <protocol(主要通信協議)>:<subprotocol(次要通信協議,即驅動程序名稱)>:<data source identifier(數據源)> MySQL的JDBC URL格式: jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]…. 示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password 常見參數: user 用戶名 password 密碼 autoReconnect 聯機失敗,是否從新聯機(true/false) maxReconnect 嘗試從新聯機次數 initialTimeout 嘗試從新聯機間隔 maxRows 傳回最大行數 useUnicode 是否使用Unicode字體編碼(true/false) characterEncoding 何種編碼(GB2312/UTF-8/…) relaxAutocommit 是否自動提交(true/false) capitalizeTypeNames 數據定義的名稱以大寫表示 創建鏈接對象 String url="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password"; Connection con = DriverManager.getConnection(url); 創建SQL陳述式對象(Statement Object) Statement stmt = con.createStatement(); 執行SQL語句 executeQuery() String query = "select * from test"; ResultSet rs=stmt.executeQuery(query); 結果集ResultSet while(rs.next()) {rs.getString(1);rs.getInt(2);} executeUpdate() String upd="insert into test (id,name) values(1001,xuzhaori)"; int con=stmt.executeUpdate(upd); execute() 示例: try{ } catch(SQLException sqle) { } finally { } Java類型和SQL類型 技術手冊P421 PreparedStatement(預編語句) PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)"); stmt.setInt(1,id); stmt.setString(2,name); 注:一旦設定語句的參數值後,就能夠屢次執行改語句,直到調用clearParameters()方法將他清除爲止 CallableStatement(預儲程序)技術手冊P430 JDBC2.0使用 ResultSet對象中的光標上下自由移動 Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs=stmt.executeQuery("select * from test"); public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException resultSetType TYPE_FORWARD_ONLY 只能使用next()方法。 TYPE_SCROLL_SENSITIVE 能夠上下移動,能夠取得改變後的值。 TYPE_SCROLL_INSENSITIVE 能夠上下移動。 resultSetConcuttency CONCUR_READ_ONLY 只讀 CONCUR_UPDATABLE ResultSet對象能夠執行數據庫的新增、修改、和移除 直接使用ResultSet對象執行更新數據 新增數據 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery("select * from test"); uprs.moveToInsertRow(); uprs.updateInt(1,1001); uprs.updateString(2,"許召日"); uprs.insertRow; 更新數據 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery("select * from test"); uprs.last(); uprs.updateString("name","xuzhaori"); uprs.updateRow; 刪除數據 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery("select * from test"); uprs.absolute(4); uprs.deleteRow(); 批處理 con.setAutoCommit(false); 關閉自動承認模式 Statement stmt=con.createStatement(); int[] rows; stmt.addBatch("insert into test values(1001,xuzhaori)"); stmt.addBatch("insert into test values(1002,xuyalin)"); rows=stmt.executeBatch(); con.commit(); 沒有任何錯誤,執行批處理stmt.executeBatch(); JNDI-數據源(Data Source)與鏈接池(Connection Pool) Tomcat的JDBC數據源設置 技術手冊P439 鏈接池工具-Proxool Var 0.8.3 技術手冊P446 設置web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!--<?xml version="1.0" encoding="GB2312"?>--> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> …. <servlet> <servlet-name>ServletConfigurator</servlet-name> <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class> <init-param> <param-name>propertyFile</param-name> <param-value>WEB-INF/classes/Proxool.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 後端統計端口添加下列 <servlet> <servlet-name>Admin</servlet-name> <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Admin</servlet-name> <url-pattern>/Admin</url-pattern> </servlet-mapping> …. </web-app> 配置Proxool.properties jdbc-0.proxool.alias=JSPBook jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8 jdbc-0.proxool.maximum-connection-count=10 jdbc-0.proxool.prototype-count=4 jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE jdbc-0.proxool.verbose=true jdbc-0.proxool.statistics=10s,1m,1d 後端統計接口添加此行 jdbc-0.proxool.statistics-log-level=DEBUG 使用Proxool鏈接池 Connection con = DriverManager.getConnection("proxool.JSPBook"); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String query = "SELECT * FROM employee"; ResultSet rs = stmt.executeQuery(query);

 

JDBC事務提交和回滾示例

如下是使用事務提交和回滾描述的例子。

基於對環境和數據庫安裝在前面的章節中作此示例代碼已學習過。

複製過去下面的例子中JDBCExample.java,編譯並運行,以下所示:

//STEP 1. Import required packages
import java.sql.*;

public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
 public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Set auto commit as false.
      conn.setAutoCommit(false);

      //STEP 5: Execute a query to create statment with
      // required arguments for RS example.
      System.out.println("Creating statement...");
      stmt = conn.createStatement(
                           ResultSet.TYPE_SCROLL_INSENSITIVE,
                           ResultSet.CONCUR_UPDATABLE);
     
      //STEP 6: INSERT a row into Employees table
      System.out.println("Inserting one row....");
      String SQL = "INSERT INTO Employees " +
                    "VALUES (106, 20, 'Rita', 'Tez')";
      stmt.executeUpdate(SQL);  

      //STEP 7: INSERT one more row into Employees table
      SQL = "INSERT INTO Employees " +
                    "VALUES (107, 22, 'Sita', 'Singh')";
      stmt.executeUpdate(SQL);

      //STEP 8: Commit data here.
      System.out.println("Commiting data here....");
      conn.commit();
      
      //STEP 9: Now list all the available records.
      String sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);
      System.out.println("List result set for reference....");
      printRs(rs);

      //STEP 10: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
      // If there is an error then rollback the changes.
      System.out.println("Rolling back data here....");
      try{
         if(conn!=null)
            conn.rollback();
      }catch(SQLException se2){
         se2.printStackTrace();
      }//end try

   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main

   public static void printRs(ResultSet rs) throws SQLException{
      //Ensure we start with first row
      rs.beforeFirst();
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
     }
     System.out.println();
   }//end printRs()
}//end JDBCExample

如今讓咱們來編譯上面的例子以下:
C:\>javac JDBCExample.java
C:\>
當運行JDBCExample,它會產生如下結果:

C:\>java JDBCExample
Connecting to database...
Creating statement...
Inserting one row....
Commiting data here....
List result set for reference....
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
ID: 106, Age: 20, First: Rita, Last: Tez
ID: 107, Age: 22, First: Sita, Last: Singh
Goodbye!
C:\>

 老師的例子:數據庫

JdbcDemo.java編程

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JdbcDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        String username = "test";
        String password = "123456";
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        //localhost  127.0.0.1 orcl
        Connection conn = null;
        try {
            
            Class.forName("oracle.jdbc.driver.OracleDriver");  //加載驅動
            conn = DriverManager.getConnection(url,username,password);
/*            //String sql = "insert into demo(id,name,sex,address,birthday) 
       values(2,'張三1','1','南京1',to_date('2014-12-12','yyyy-mm-dd'))";
int id = 3; String name = "李四"; String sex = "1"; String address = "北京"; String birthday = "2012-12-12"; String sql = "insert into demo(id,name,sex,address,birthday)
       values("+id+",'"+name+"','"+sex+"','"+address+"',
       to_date('"+birthday+"','yyyy-mm-dd'))"; System.out.println(sql); Statement st = conn.createStatement(); st.executeUpdate(sql); sql = "delete from demo where id="+id;
*/ /*String sql = "select id,name,sex,address,
to_char(birthday,'yyyy-mm-dd') birthday from demo"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String sex = rs.getString("sex"); String address = rs.getString("address"); String birthday = rs.getString("birthday"); System.out.println(id); } rs.close(); st.close(); conn.close();
*/ /* int id = 4; String name = "李四"; String sex = "1"; String address = "北京"; String birthday = "2012-12-12"; String sql = "insert into demo(id,name,sex,address,birthday)
values(?,?,?,?,to_date('"+birthday+"','yyyy-mm-dd'))"; PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); pst.setString(2, name); pst.setString(3, sex); pst.setString(4, address); pst.executeUpdate();
*/ //1.手動提交 conn.setAutoCommit(false); int id = 6; String name = "李四"; String sex = "1"; String address = "北京"; String birthday = "2012-12-12"; String sql = "insert into demo(id,name,sex,address,birthday)
values(?,?,?,?,to_date('"+birthday+"','yyyy-mm-dd'))"; PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); pst.setString(2, name); pst.setString(3, sex); pst.setString(4, address); pst.executeUpdate(); id = 7; sql = "insert into demo(id,name,sex,address,birthday)
values(?,?,?,?,to_date('"+birthday+"','yyyy-mm-dd'))"; pst = conn.prepareStatement(sql); pst.setInt(1, id); pst.setString(2, name); pst.setString(3, sex); pst.setString(4, address); pst.executeUpdate(); conn.commit(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch(SQLException sqle){ sqle.printStackTrace(); try { conn.rollback(); //回滾 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }





































































































 

ConnDB.java後端

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnDB {

    private String username = "test";
    private String password = "123456";
    private String url = 
"jdbc:oracle:thin:@localhost:1521:orcl"; private Connection conn; public Connection getConn() { try { Class.forName
(
"oracle.jdbc.driver.OracleDriver"); conn =
DriverManager.getConnection
          (url,username,password); }
catch (ClassNotFoundException e) { e.printStackTrace(); } catch(SQLException sqle){ sqle.printStackTrace(); } return conn; } }






















































































































































































 

DemoDao.java設計模式

package jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import jdbc.ConnDB;
import jdbc.pojo.Demo;

public class DemoDao {
    
    /**
     * 新增
     * @param demo
     */
    public void add(Demo demo){
        
        ConnDB db = new ConnDB();
        Connection conn = db.getConn();
        
        String sql = "insert into demo(id,name,sex,address,birthday) 
values(?,?,?,?,to_date('"+demo.getBirthday()+"','yyyy-mm-dd'))"; try { PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, demo.getId()); pst.setString(2, demo.getName()); pst.setString(3, demo.getSex()); pst.setString(4, demo.getAddress()); pst.executeUpdate(); pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void update(Demo demo){ ConnDB db = new ConnDB(); Connection conn = db.getConn(); String sql = "update demo set name=?,sex=?,address=?,birthday=
to_date('"+demo.getBirthday()+"','yyyy-mm-dd') where id=?"; try { PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, demo.getName()); pst.setString(2, demo.getSex()); pst.setString(3, demo.getAddress()); pst.setInt(4, demo.getId()); pst.executeUpdate(); pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void delete(int id){ ConnDB db = new ConnDB(); Connection conn = db.getConn(); String sql = "delete from demo where id=?"; try { PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); pst.executeUpdate(); pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Demo getDemoById(int id){ ConnDB db = new ConnDB(); Connection conn = db.getConn(); Demo demo = new Demo(); String sql = "select id,name,sex,address,
to_char(birthday,'yyyy-mm-dd') birthday from demo where id=?"; try { PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); ResultSet rs = pst.executeQuery(); if(rs.next()){ demo.setId(rs.getInt("id")); demo.setName(rs.getString("name")); demo.setSex(rs.getString("sex")); demo.setAddress(rs.getString("address")); demo.setBirthday(rs.getString("birthday")); } pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return demo; } public Map getDemoMap(int id){ Map hm = new HashMap(); ConnDB db = new ConnDB(); Connection conn = db.getConn(); Demo demo = new Demo(); String sql = "select id,name,sex,address,
to_char(birthday,'yyyy-mm-dd') birthday from demo where id=?"; try { PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, id); ResultSet rs = pst.executeQuery(); if(rs.next()){ hm.put("id",rs.getInt("id")); hm.put("name",rs.getString("name")); hm.put("sex",rs.getString("sex")); hm.put("address",rs.getString("address")); hm.put("birthday",rs.getString("birthday")); } pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return hm; } public List getAllDemo(){ List list = new ArrayList(); ConnDB db = new ConnDB(); Connection conn = db.getConn(); Demo demo; String sql = "select id,name,sex,address,
to_char(birthday,'yyyy-mm-dd') birthday from demo"; try { PreparedStatement pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(); while(rs.next()){ demo = new Demo(); demo.setId(rs.getInt("id")); demo.setName(rs.getString("name")); demo.setSex(rs.getString("sex")); demo.setAddress(rs.getString("address")); demo.setBirthday(rs.getString("birthday")); list.add(demo); } pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } public static void main(String[] args){ Demo demo = new Demo(); /*demo.setId(8); demo.setName("張炸1"); demo.setSex("0"); demo.setAddress("上海1"); demo.setBirthday("2012-2-2"); */ DemoDao dd = new DemoDao(); Map hm = dd.getDemoMap(2); System.out.println(hm.get("name")); List list = dd.getAllDemo(); Iterator itr = list.iterator(); while(itr.hasNext()){ demo = (Demo)itr.next(); //System.out.println(demo.getName()); } } }

 

Demo.javaapi

package jdbc.pojo;

public class Demo {

    private int id;
    
    private String name;
    
    private String sex;
    
    private String address;
    
    private String birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    
    
    
}
相關文章
相關標籤/搜索