Java数据库连接(JDBC)之二:Statement对象和PreparedStatement对象的使用
1,Statement對(duì)象是Java 執(zhí)行數(shù)據(jù)庫操作的一個(gè)重要方法,用于在已經(jīng)建立數(shù)據(jù)庫連接的基礎(chǔ)上,向數(shù)據(jù)庫發(fā)送要執(zhí)行的SQL語句。Statement對(duì)象,用于執(zhí)行不帶參數(shù)的簡單SQL語句。
Statement 對(duì)象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 Statement 對(duì)象,它們都作為在給定連接上執(zhí)行SQL語句的包容器: Statement 對(duì)象用于執(zhí)行不帶參數(shù)的簡單SQL語句;
PreparedStatement(它從 Statement 繼承而來)用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語句;
CallableStatement(它從 PreparedStatement 繼承而來)CallableStatement 對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫已存在的存儲(chǔ)過程的調(diào)用。它們都專用于發(fā)送特定類型的 SQL 語句。
上文中
第一步:創(chuàng)建Statement對(duì)象實(shí)例stmt后,調(diào)用該對(duì)象的executeQuery(sql)方法執(zhí)行參數(shù)sql語句;當(dāng)然,Statement對(duì)象還有很多方法,如executeUpdate(String sql);
第二步:根據(jù)sql語句執(zhí)行查詢語句后,得出的是一個(gè)結(jié)果集或者說還是一張表,放在ResultSet 的對(duì)象rs中
第三步:循環(huán)遍歷結(jié)果集rs,rs.next()方法每次指向結(jié)果集的一項(xiàng)記錄或者說是一欄,循環(huán)體中調(diào)用get方法如rs.getString(“b”);參數(shù)是表的字段名。就可得到該字段中的值
2,該 PreparedStatement接口繼承Statement,并與之在兩方面有所不同:
PreparedStatement 實(shí)例包含已編譯的 SQL 語句。這就是使語句“準(zhǔn)備好”。包含于 PreparedStatement 對(duì)象中的 SQL 語句可具有一個(gè)或多個(gè) IN 參數(shù)。IN參數(shù)的值在 SQL 語句創(chuàng)建時(shí)未被指定。相反的,該語句為每個(gè) IN 參數(shù)保留一個(gè)問號(hào)(“?”)作為占位符。每個(gè)問號(hào)的值必須在該語句執(zhí)行之前,通過適當(dāng)?shù)膕etXXX 方法來提供。
由于 PreparedStatement 對(duì)象已預(yù)編譯過,所以其執(zhí)行速度要快于 Statement 對(duì)象。因此,多次執(zhí)行的 SQL 語句經(jīng)常創(chuàng)建為 PreparedStatement 對(duì)象,以提高效率。
通過使用java.sql.preparedstatement,這個(gè)問題可以自動(dòng)解決。一個(gè)preparedstatement是從java.sql.connection對(duì)象和所提供的sql字符串得到的,sql字符串中包含問號(hào)(?),這些問號(hào)標(biāo)明變量的位置,然后提供變量的值,最后執(zhí)行語句,例如:
string sql = "select * from people where id = ? and name = ?";//先定義要執(zhí)行的sql語句 ps.setint(1,id);// 設(shè)置問號(hào)里的變量值 ps.setstring(2,name); PreparedStatement ps = connection.prepareStatement(sql); Resultset rs = ps.executequery(); while(rs.next()){String u=rs.getString("id");String p=rs.getString("name"); }使用preparedstatement的另一個(gè)優(yōu)點(diǎn)是字符串不是動(dòng)態(tài)創(chuàng)建的.
PreparedStatement對(duì)象較Statement對(duì)象有很好代碼的可讀性和可維護(hù)性:比如
stmt.executeUpdate("insertintotb_name(col1,col2,col2,col4)values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt=con.prepareStatement("insertintotb_name(col1,col2,col2,col4)values(?,?,?,?)");perstmt.setString(1,var1);perstmt.setString(2,var2);perstmt.setString(3,var3);perstmt.setString(4,var4);perstmt.executeUpdate();不用我多說,對(duì)于第一種方法.別說其他人去讀你的代碼,就是你自己過一段時(shí)間再去讀,都會(huì)覺得傷心.
下面將給出一個(gè)完整的訪問數(shù)據(jù)庫的例子。
總結(jié)
以上是生活随笔為你收集整理的Java数据库连接(JDBC)之二:Statement对象和PreparedStatement对象的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java数据库连接(JDBC)之一:JD
- 下一篇: Java连接数据库(JDBC)之三:ja