JDBC小結


  老師如是說:有一個規律永遠不變,就是量變引起質變,什么時候你吃的鹽比我吃的米多,那你就可以教我了……

1.JDBC是一個標准,是J2EE的一部分;講tcp時就提到了分層思想,jdbc也是分層,即上層只需要和緊挨着的下層通訊,方便擴展。不管開奧拓車還是開奧迪車方向盤都在屁股前邊,檔都在右邊。不過jdbc還需要寫select語句等,而hibernate完全實現了數據庫底層,而且屏蔽了細小差別;現在的EJB也實現了某些功能。

2.TestJDBC

  若是連接字符串或者某些方法忘了(但是有些東西不能忘,比如System.out.println),就注明平時用多了Eclipse,若是查查還能知道……

 1 import java.sql.*;
 2  
 3  public class TestJDBC {
 4  
 5      public static void main(String[] args) {
 6          ResultSet rs = null;
 7          Statement stmt = null;
 8          Connection conn = null;
 9          /*
10           * 一定要加上try catch finally,不要throws
11           * 因為若在遍歷過程中出問題,那么下面的關閉就一直執行不了
12           * 服務器會越來越卡,最后死掉
13           */
14          try {
15              Class.forName("oracle.jdbc.driver.OracleDriver");
16              //new oracle.jdbc.driver.OracleDriver();
17              conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", 
18 
19 "scott", "tiger");
20              stmt = conn.createStatement();
21              //結果集就像游標,不過不像數據庫,第一條沒指向第一條,像iterator
22              rs = stmt.executeQuery("select * from dept");
23              while(rs.next()) {
24                  System.out.println(rs.getString("deptno"));
25                  //和實際字段類型無關,只要能轉換為int就可以
26                  System.out.println(rs.getInt("deptno"));
27              }
28          } catch (ClassNotFoundException e) {
29              e.printStackTrace();
30              /*
31               * 實際上要用log4j把異常記錄在日志里
32               */
33          } catch (SQLException e) {
34              e.printStackTrace();
35          } finally {
36              /*
37               * 要把rs,stmt,conn聲明在大try外邊
38               * 否則在這就不認識了
39               */
40              try {
41                  /*
42                   * 不加try catch會出錯,因為close也會出錯.
43                   * 如果rs沒有初始化,這直接close那么一定會報錯
44                   */
45                  if(rs != null) {
46                      rs.close();
47                      /*
48                       * 查過api后會發現close后會直接設置為null
49                       * 方便gc回收
50                       * 寫下面的是為了展現良好的編程風格
51                       */
52                      rs = null;
53                  }
54                  if(stmt != null) {
55                      stmt.close();
56                      stmt = null;
57                  }
58                  if(conn != null) {
59                      conn.close();
60                      conn = null;
61                  }
62              } catch (IOException e) {
63                  e.printStackTrace();
64              }
65          }
66      }
67  
68  }
69 
70 View Code
View Code

3.JDBC操作DML語句

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.sql.Statement;
 6 
 7 public class TestDML {
 8 
 9     /*
10      * 執行完DML語句后看是否成功
11      * 打開window--show view--other--data
12      */
13     public static void main(String[] args) {
14         Statement stmt = null;
15         Connection conn = null;
16         try {
17             Class.forName("com.mysql.jdbc.Driver");
18             conn = DriverManager.getConnection("jdbc:mysql:///news", "root", "root");
19             stmt = conn.createStatement();
20             String sql = "insert into dept2 values (98, 'GAME', 'BJ')";
21             stmt.executeUpdate(sql);
22         } catch (ClassNotFoundException e) {
23             e.printStackTrace();
24         } catch (SQLException e) {
25             e.printStackTrace();
26         } finally {
27             try {
28                 if(stmt != null) {
29                     stmt.close();
30                     stmt = null;
31                 }
32                 if(conn != null) {
33                     conn.close();
34                     conn = null;
35                 }
36             } catch (SQLException e) {
37                 e.printStackTrace();
38             }
39         }
40     }
41 
42 }
View Code
 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.sql.Statement;
 6 
 7 public class TestDML2 {
 8 
 9     /*
10      * 從命令行輸入
11      * 右鍵 進入run configuration,在arguments輸入
12      */
13     public static void main(String[] args) {
14         if(args.length != 3) {
15             System.out.println("Parameter Error! Please Input Again!");
16             System.exit(-1);
17         }
18         
19         int deptno = 0;
20         
21         try {
22             deptno = Integer.parseInt(args[0]);
23         } catch (NumberFormatException e) {
24             System.out.println("Parameter Error! Deptno should be Number Format!");
25             System.exit(-1);
26         }
27         /*
28          * 把這些變量名聲明在一塊
29          */
30         String dname = args[1];
31         String loc = args[2];
32         
33         Statement stmt = null;
34         Connection conn = null;
35         try {
36             Class.forName("oracle.jdbc.driver.OracleDriver");
37             //new oracle.jdbc.driver.OracleDriver();
38             conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");
39             stmt = conn.createStatement();
40             //注意values后邊有個空格
41             String sql = "insert into dept2 values (" + deptno + ",'" + dname + "','" + loc + "')";
42             System.out.println(sql);
43             stmt.executeUpdate(sql);
44         } catch (ClassNotFoundException e) {
45             e.printStackTrace();
46         } catch (SQLException e) {
47             e.printStackTrace();
48         } finally {
49             try {
50                 if(stmt != null) {
51                     stmt.close();
52                     stmt = null;
53                 }
54                 if(conn != null) {
55                     conn.close();
56                     conn = null;
57                 }
58             } catch (SQLException e) {
59                 e.printStackTrace();
60             }
61         }
62     }
63 
64 }
View Code

4.JDBC處理PreparedStatement

 1 import java.sql.*;
 2 
 3 
 4 public class TestPrepStmt {
 5 
 6     public static void main(String[] args) {
 7         if(args.length != 3) {
 8             System.out.println("Parameter Error! Please Input Again!");
 9             System.exit(-1);
10         }
11         
12         int deptno = 0;
13         
14         try {
15             deptno = Integer.parseInt(args[0]);
16         } catch (NumberFormatException e) {
17             System.out.println("Parameter Error! Deptno should be Number Format!");
18             System.exit(-1);
19         }
20         
21         String dname = args[1];
22         String loc = args[2];
23         
24         PreparedStatement pstmt = null;
25         Connection conn = null;
26         try {
27             Class.forName("oracle.jdbc.driver.OracleDriver");
28             //new oracle.jdbc.driver.OracleDriver();
29             conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");
30             pstmt = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
31             pstmt.setInt(1, deptno);
32             pstmt.setString(2, dname);
33             pstmt.setString(3, loc);
34             pstmt.executeUpdate();
35         } catch (ClassNotFoundException e) {
36             e.printStackTrace();
37         } catch (SQLException e) {
38             e.printStackTrace();
39         } finally {
40             try {
41                 if(pstmt != null) {
42                     pstmt.close();
43                     pstmt = null;
44                 }
45                 if(conn != null) {
46                     conn.close();
47                     conn = null;
48                 }
49             } catch (SQLException e) {
50                 e.printStackTrace();
51             }
52         }
53     }
54 
55 }
View Code

5.JDBC處理存儲過程

 1 import java.sql.*;
 2 public class TestProc {
 3 
 4     //用的比較少
 5     public static void main(String[] args) throws Exception {
 6         
 7         Class.forName("oracle.jdbc.driver.OracleDriver");
 8         Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");
 9         CallableStatement cstmt = conn.prepareCall("{call p(?, ?, ?, ?)}");
10         cstmt.registerOutParameter(3, Types.INTEGER);
11         cstmt.registerOutParameter(4, Types.INTEGER);
12         cstmt.setInt(1, 3);
13         cstmt.setInt(2, 4);
14         cstmt.setInt(4, 5);
15         cstmt.execute();
16         System.out.println(cstmt.getInt(3));
17         System.out.println(cstmt.getInt(4));
18         cstmt.close();
19         conn.close();
20     }
21 }
View Code

6.JDBC事務處理

  比如轉賬時至少需要兩條update語句,需要同時成功。

 1 import java.sql.*;
 2 public class TestTransaction {
 3     public static void main(String[] args) {
 4         
 5         Connection conn = null;
 6         Statement stmt = null;
 7         
 8         try {
 9             Class.forName("oracle.jdbc.driver.OracleDriver");
10             conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SXT", "scott", "tiger");
11             
12             conn.setAutoCommit(false);
13             stmt = conn.createStatement();
14             stmt.addBatch("insert into dept2 values (51, '500', 'haha')");
15             stmt.addBatch("insert into dept2 values (52, '500', 'haha')");
16             stmt.addBatch("insert into dept2 values (53, '500', 'haha')");
17             stmt.executeBatch();
18             conn.commit();
19             //恢復現場,就像那時候做坦克時,變換完前景色后,在恢復回來
20             conn.setAutoCommit(true);
21         } catch (ClassNotFoundException e) {
22             e.printStackTrace();
23         } catch(SQLException e) {
24             
25             e.printStackTrace();
26             
27             try {
28                 if(conn != null)
29                 {
30                     conn.rollback();
31                     /*
32                      * 下面這句要加上因為可能沒執行到18行而異常
33                      */
34                     conn.setAutoCommit(true);
35                 }
36             } catch (SQLException e1) {
37                 e1.printStackTrace();
38             }
39         }finally {
40             try {
41                 if(stmt != null)
42                     stmt.close();
43                 if(conn != null)
44                     conn.close();
45             } catch (SQLException e) {
46                 e.printStackTrace();
47             }
48         }
49     }
50 }
View Code

7.JDBC處理可滾動結果集 

 1 import java.sql.*;
 2 
 3 public class TestScroll {
 4     public static void main(String args[]) {
 5 
 6         try {
 7             new oracle.jdbc.driver.OracleDriver();
 8             String url = "jdbc:oracle:thin:@192.168.0.1:1521:SXT";
 9             Connection conn = DriverManager
10                     .getConnection(url, "scott", "tiger");
11             Statement stmt = conn.createStatement(
12                     //下面是靜態變量
13                     //對滾動不敏感表示你可以隨便滾動
14                     ResultSet.TYPE_SCROLL_INSENSITIVE,
15                     //表示並發訪問時只能讀取
16                     ResultSet.CONCUR_READ_ONLY);
17             ResultSet rs = stmt
18                     .executeQuery("select * from emp order by sal");
19             rs.next();
20             System.out.println(rs.getInt(1));
21             rs.last();
22             System.out.println(rs.getString(1));
23             System.out.println(rs.isLast());
24             System.out.println(rs.isAfterLast());
25             //當前記錄是第幾條記錄;先定位到最后一條,再調用,返回的值可表示共多少行
26             System.out.println(rs.getRow());
27             rs.previous();
28             System.out.println(rs.getString(1));
29             rs.absolute(6);
30             System.out.println(rs.getString(1));
31             rs.close();
32             stmt.close();
33             conn.close();
34         } catch (SQLException e) {
35             e.printStackTrace();
36         }
37     }
38 }
View Code

8.JDBC批處理

 1 import java.sql.*;
 2 public class TestBatch {
 3 
 4 
 5     public static void main(String[] args) throws Exception {
 6         Class.forName("oracle.jdbc.driver.OracleDriver");
 7         Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");
 8         
 9         PreparedStatement ps = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
10         ps.setInt(1, 61);
11         ps.setString(2, "haha");
12         ps.setString(3, "bj");
13         ps.addBatch();
14         
15         ps.setInt(1, 62);
16         ps.setString(2, "haha");
17         ps.setString(3, "bj");
18         ps.addBatch();
19         
20         ps.setInt(1, 63);
21         ps.setString(2, "haha");
22         ps.setString(3, "bj");
23         ps.addBatch();
24         
25         ps.executeBatch();
26         ps.close();
27         
28         conn.close();
29 
30     }
31 
32 }
View Code

9.JDBC處理可更新的結果集

  最傳統的方式往往最有效,新方式可能支持的不好。Oracle不支持的,但是MySql支持的。

 1 import java.sql.*;
 2 public class TestUpdataRs {
 3     public static void main(String args[]){
 4     
 5     try{
 6         new oracle.jdbc.driver.OracleDriver();
 7         String url="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
 8         Connection conn=DriverManager.getConnection(url,"scott","tiger");
 9         Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
10         
11         ResultSet rs=stmt.executeQuery("select * from emp2");
12         
13         rs.next();
14         //更新一行數據,在內存里
15         rs.updateString("ename","AAAA");
16         //更新進入數據庫
17         rs.updateRow();
18 
19         //插入新行
20         rs.moveToInsertRow();
21         rs.updateInt(1, 9999);
22         rs.updateString("ename","AAAA");
23         rs.updateInt("mgr", 7839);
24         rs.updateDouble("sal", 99.99);
25         //更新進入數據庫
26         rs.insertRow();
27         //將光標移動到新建的行
28         rs.moveToCurrentRow();
29 
30         //刪除行
31         rs.absolute(5);
32         rs.deleteRow();
33 
34         //取消更新
35         //rs.cancelRowUpdates();
36 
37       }catch(SQLException e){
38         e.printStackTrace();
39       }
40     }
41 }
View Code

 10.DataSource和RowSet簡介

  隨着J2EE的標准而出現,經常和企業級應用關聯在一塊。

 

題外話:

a.找不到安裝程序時先不要搜索,去程序中找屬性。
b.命令行下要想使用外部jar,則需要加進入classpath;普通的java工程使用外部jar文件需要右鍵--build path--add external archives;最好放在自己的某一工程下不要放在系統下,防止新舊文件或者和其他人的文件沖突,這也屬於耦合性的降低。
c.java.sql.*中Connection是接口,算是一流的公司賣標准,年年收專利費;但是做出讓人人都遵守的接口也不容易。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM