java核心技術之JDBC (一)

JDBC


1.什麼是JDBC
 JDBC的全稱是Java DataBase Connection,也就是Java數據庫連接,我們可以
用它來操作關係型數據庫。JDBC接口及相關類在java.sql包和javax.sql包裏。我們
可以用它來連接數據庫,執行SQL查詢,存儲過程,並處理返回的結果。
JDBC接口讓Java程序和JDBC驅動實現了鬆耦合,使得切換不同的數據庫變得更加
簡單
2.jdbc使用過程
  • 1.     註冊驅動 (Driver)
  • 2.     建立連接(創建Connection)
  • 3.     創建執行sql語句(通常是創建Statement或者其子類)
  • 4.     執行語句
  • 5.     處理執行結果(在非查詢語句中,該步驟是可以省略的)
  • 6.     釋放相關資源
package com. db.jdbc ;

import java. sql.Connection ;
import java. sql.DriverManager ;
import java. sql.ResultSet ;
import java. sql.SQLException ;
import java. sql.Statement ;
import org. junit.Test ;

public class jdbcTest {
      final String url = "jdbc:mysql://localhost:3306/test" ;
      final String user = "root";
      final String password = "";
     ResultSet rs = null;
     Statement st = null;
     Connection connection = null;
      @Test
      public void test_jdbc(){
           try {
              Class .forName( "com.mysql.jdbc.Driver");//加載驅動
               connection = DriverManager.getConnection( url, user, password);//獲取鏈接
               st = connection. createStatement();//創建執行
               rs = st. executeQuery("select * from test");//執行
               while( rs.next ()){//處理結果
                   System .out. println(rs .getString( "name"));
               }
              
           } catch (Exception e) {
              e .printStackTrace();
           }finally {
                    try {
                         if( rs!=null){
                              rs.close ();
                         }
                         if( st!=null){
                              st.close ();
                         }
                         if( connection!=null){
                              connection.close ();
                         }
                        
                    } catch (SQLException e) {
                         // TODO Auto-generated catch block
                        e .printStackTrace();
                    }
              
           }
      }
}




3.註冊驅動的方式
  • Class.forName("com.mysql.jdbc.Driver");
  • System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
  • DriverManager .registerDriver(new Driver());
測試代碼:
@Test
      public void test_register_Driver(){
           try {
//            Class.forName("com.mysql.jdbc.Driver");
//            System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
              DriverManager .registerDriver( new Driver());
              Connection connection = DriverManager.getConnection( url, user, password);
              Assert .assertEquals( false, connection.isClosed());
           } catch (Exception e) {
              e .printStackTrace();
           }
      }

這三個註冊驅動的方式有什麼不同喃?
4.statement
一個statement 只能維護一個resultSet
爲什麼喃?
我是這樣理解的,一個連接可以通過不同的操作來獲取不同的結果,每一個不同的結果都有不同的statement來裝,而一個statement對象對應着一個resultset結果,如果一個statement裝着不同的結果,那我們以哪個爲準喃?所以一個statement 只能維護一個resultSet
@Test
public void test_statement() throws Exception{
          Class .forName( "com.mysql.jdbc.Driver");
          Connection connection = DriverManager.getConnection( url, user, password);
          Statement st = connection.createStatement ();
          ResultSet rs = st.executeQuery ("select * from test");
           while( rs.next ()){
              rs .close();
           }
          ResultSet rs1 = st.executeQuery ("select * from test");
           while( rs1.next ()){
              
           }
          
      }
結果:報錯

5.Statement和PrparedStatement的區別?
看看statement和 PrparedStatement執行同樣的查詢

@Test
public void test_statement() throws Exception{
          Class .forName( "com.mysql.jdbc.Driver");
          Connection connection = DriverManager.getConnection( url, user, password);
          Statement st = connection.createStatement ();
          String id = "1";
          ResultSet rs = st.executeQuery ("select * from test where id="+id );
           while( rs.next ()){
          System .out. println(rs .getString( "name"));
           }
          
      }

結果:OK


@Test
 public void test_prestatement() throws Exception{
          Class .forName( "com.mysql.jdbc.Driver");
          Connection connection = DriverManager.getConnection( url, user, password);
          PreparedStatement ps = connection.prepareStatement( "select * from test where id=?");
          ps .setString( 1, "1");
          ResultSet rs = ps.executeQuery ();
           while( rs.next ()){
          System .out. println(rs .getString( "name"));
           }
          
      }

結果:OK


結果都是OK,到底有什麼區別喃?

如果我們把id的值賦值爲“or 1 or ”,上面查出來的就是全部。。
這個就是我們經常說sql注入攻擊
第二個區別就是:preparedStetement 可以預編譯語句,可以緩存起來,提高查詢速度


下次繼續寫JDBC的事物,數據庫隔離級別,存儲過程,還有就是回答上面的那個問題,三個注入有什麼區別?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章