JAVA入門到精通-第65講-sql server JDBC
阿新 • • 發佈:2018-11-29
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;">