1. 程式人生 > >JAVA入門到精通-第65講-sql server JDBC

JAVA入門到精通-第65講-sql server JDBC

int i=sm.executeUpdate()     --ResultSet結果集 rs表示結果集的遊標;指向第一行記錄的最上面;指向頭 rs.next ( ) 取出第一條; rs.getInt(1)     需要首先需要rs.next(); 這會導致rs遊標向下指一下; rs.getInt(1) rs.getString(2)     這時,rs可以取出資料庫中需要的資訊了;   ---預編譯
statement 把sql語句傳送給資料庫 資料庫拿到sql,會對sql語句解釋和編譯; 速度會有一定的影響,資料庫會 慢很多;   preparedstatement 預編譯, (1)減輕資料庫的壓力,先把sql語句編譯 成二進位制, 然後把結果傳送資料庫,這時資料庫立即執行,不需要編譯; (2)有智慧記憶功能,有快取;會把壓力減輕; 將來資料庫是併發的;胖伺服器,應該把壓力分散給應用程式, 緩解資料庫的壓力; 電驢,下載的時候自己客戶端是伺服器; (3)有效防止漏洞注入;   --SQL注入漏洞
    or 1='1' 本身是一個漏洞;   --PreparedStatement   查詢: ps.setInt(1, 20);             查編號為20的 ps.setString(2, "dd");     查詢地址為dd的 部門號為20 ,地址在dd的結果;   Preparedstatement通過?機制,防止漏洞注入;
  parepareStatement不會有任何結果,防止注入漏洞;   最好不用字元拼接的方式去執行, 用問號?機制去執行程式設計; -------------------- ---------------------  
java程式操作sql server
Statement和PreparedStatement的區別(1)
    Statement和PreparedStatement都可以用於把sql語句從java程式中傳送到指定資料庫,並執行sql語句,但是他們也存在區別:
1、直接使用Statement,驅動程式一般不會對sql語句作處理而直接交給資料庫;使用PreparedStamen,形成預編譯的過程,並且會對語句作字符集的轉換(至少在sql server)中如此。
    如此,有兩個好處:對於多次重複執行的語句,使用PreparedStament效率會更高一點,並且在這種情況下也比較適合使用batch;另外,可以比較好地解決系統的本地化問題。
2、PreparedStatement還能有效的防止危險字元的注入,也就是sql注入的問題。

PreparedStatement的使用[Sql_test2.java]
/**
 * PreparedStatement使用CRUD
 * 1、PreparedStatement可以提高執行效率(因為它有預編譯的功能)
 * 2、PreparedStatement可以防止SQL注入,但是要求用?賦值的方式才可以
 */
package com.sqlserver;
import java.sql.*;
public class Sql_test2 {
    public static void main(String[] args) {
        Connection ct=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //1、載入驅動(把需要的驅動程式加入記憶體)
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2、得到連線(指定連線到哪個資料來源、資料庫的使用者名稱和密碼)
            ct=DriverManager.getConnection("jdbc:odbc:mytest","sa","sa");
            //3、建立PreparedStatement
            //PreparedStatement用處:主要用於傳送SQL語句到資料庫
            ps=ct.prepareStatement("select * from dept where deptno=? and loc=?");
             //給?賦值(可防止SQL注入漏洞問題),不要直接使用拼接的方式
            ps.setInt(1, 20);
            ps.setString(2, "dallas");
            //演示:查詢,顯示所有的部門資訊
            //ResultSet結果集,大家可以把ResultSet理解成返回一張錶行的結果集
               rs=ps.executeQuery();
            //迴圈取出
            while(rs.next()){
                int a=rs.getInt(1);
                String b=rs.getString(2);
                System.out.println(a+"\t"+b+"\t"+c);    
            }
            
            //使用PreparedStetement新增一條記錄
            ps=ct.prepareStatement("insert into dept values(?,?,?)");
            ps.setInt(1, 60);
            ps.setString(2, "安全部");
            ps.setString(3, "上海");
              //執行
            int i=ps.executeUpdate();
             if(i==1){
                System.out.println("新增成功");
            }else{
                System.out.println("新增失敗");
            }
            
            //使用PreparedStetement修改一條記錄從dept表中修改loc=上海 deptno改為50
            ps=ct.prepareStatement("update dept set deptno=? where loc='上海'");
            ps.setInt(1, 50);
            //執行
            int i=ps.executeUpdate();
            if(i==1){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失敗");
            }
            
            //使用PreparedStetement刪除一條記錄
            ps=ct.prepareStatement("delete from dept where deptno=?");
            ps.setInt(1, 50);
            int i=ps.executeUpdate();
            if(i==1){
                System.out.println("刪除成功");
            }else{
                System.out.println("刪除失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //關閉資源,關閉順序先建立後關閉,後建立先關閉
            try {
                if(rs!=null){
                    rs.close();
                }
                if(ps!=null){
                    ps.close();
                }
                if(ct!=null){
                    ct.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

           

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

       



來自為知筆記(Wiz)