JDBC中PreparedStatement用法程式碼示例
阿新 • • 發佈:2018-12-30
為了防止使用者使用sql語句注入攻擊資料庫,可以使用Statement介面的子介面
java.sql.PreparedStatement extends Statement
該介面表示預編譯的 SQL 語句的物件,SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。
如何獲取PreparedStatement的實現類物件呢?
Users類
java.sql.PreparedStatement extends Statement
該介面表示預編譯的 SQL 語句的物件,SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。
如何獲取PreparedStatement的實現類物件呢?
使用Connection介面中的方法PreparedStatement prepareStatement(String sql) 建立一個 PreparedStatement 物件將SQL 語句傳送到資料庫。
prepareStatement方法返回的是 PreparedStatement介面的實現類物件,由mysql驅動提供
程式碼實現一個使用者登入案例:
使用PreparedStatement預編譯的執行者物件對資料庫進行增刪改查import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; public class Login { public static void main(String[] args) { /** * 建立鍵盤錄入 */ Scanner sc = new Scanner(System.in); System.out.print("請輸入使用者名稱:"); String username = sc.nextLine(); System.out.print("請輸入密碼:"); String password = sc.nextLine(); /** * 使用工具類JDBCUtils中的方法getConnection獲取資料庫連線物件 */ Connection conn = JDBCUtils.getConnection(); /** * 獲取預編譯的執行者物件,需要傳遞的sql語句中可以使用?佔位符代替實際引數 */ String sql = "SELECT * FROM users WHERE username=? AND PASSWORD = ?"; /** * 使用PreparedStatement介面中的方法,設定?佔位符的實際引數 * void setObject(int parameterIndex,Object x) * 引數: * int parameterIndex:要設定的第幾個?佔位符;1,2,3..... * Object x:給?佔位符設定的實際引數 * 注意: * 必須保證給所有的?佔位符都設定實際引數,有幾個?佔位符就呼叫幾次setObject方法 */ PreparedStatement pst = null; ResultSet rs = null; try { pst = conn.prepareStatement(sql); pst.setObject(1, username); pst.setObject(2, password); rs = pst.executeQuery(); /** * 處理查詢結果 */ if (rs.next()) { System.out.println("登入成功!"); System.out.println(rs.getString("username") + "\t" + rs.getString("password")); } else { System.out.println("您輸入的使用者名稱或者密碼有誤!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, pst, conn); sc.close(); } } }
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class Demo03 { public static void main(String[] args) throws Exception { /** * 獲取資料庫連線物件 */ Connection conn = JDBCUtils.getConnection(); /** * 方法呼叫實現相應功能 */ insert(conn); update(conn); delete(conn); /** * 開發中常用方式 */ select(conn); } /** * 把資料庫中查詢出來的每一行記錄,儲存到一個javabean物件中 * 把多個javabean物件儲存到一個集合中 */ private static void select(Connection conn) throws SQLException { /** * 使用?佔位符拼接select語句 */ String sql = "SELECT * FROM users WHERE username IN(?,?,?)"; /** * 獲取預編譯的執行者物件 */ PreparedStatement pst = conn.prepareStatement(sql); /** * 設定?佔位符的實際引數 */ pst.setObject(1, "java"); pst.setObject(2, "python"); pst.setObject(3, "golang"); /** * 執行sql語句,獲取查詢結果集 */ ResultSet rs = pst.executeQuery(); /** * 定義一個儲存Users物件的集合 */ ArrayList<Users> list = new ArrayList<Users>(); while (rs.next()) { /** * 取出結果 */ int uid = rs.getInt("uid"); String username = rs.getString("username"); String password = rs.getString("password"); /** * 把資料庫中查詢出來的每一行記錄,儲存到一個javabean物件中 */ Users u = new Users(uid, username, password); /** * 把物件儲存到集合中 */ list.add(u); } /** * 可以把這個集合傳遞到前臺的頁面上,給使用者遍歷顯示 */ for (Users u : list) { System.out.println(u); } /** * 釋放資源 */ JDBCUtils.close(rs, pst, conn); } /** * 使用java程式對資料庫表的資料進行刪除 */ private static void delete(Connection conn) throws SQLException { //使用?佔位符拼接delete語句 String sql = "DELETE FROM users WHERE uid IN (?,?)"; //獲取預編譯的執行者物件 PreparedStatement pst = conn.prepareStatement(sql); //設定?佔位符的實際引數 pst.setObject(1, 1); pst.setObject(2, 2); //使用預編譯的執行者物件,執行sql語句 int row = pst.executeUpdate(); //處理結果集 if(row>0){ System.out.println(row+"行資料,刪除成功!"); }else{ System.out.println("資料刪除失敗!"); } //釋放資源 JDBCUtils.close(null, pst, conn); } /** * 使用java程式對資料庫表的資料進行修改 */ private static void update(Connection conn) throws SQLException { //使用?佔位符拼接update語句 String sql = "UPDATE users SET PASSWORD=? WHERE username=?"; //獲取預編譯的執行者物件 PreparedStatement pst = conn.prepareStatement(sql); //設定?佔位符的實際引數 pst.setObject(1, "馬雲"); pst.setObject(2, "馬化騰"); //使用預編譯的執行者物件,執行sql語句 int row = pst.executeUpdate(); //處理結果集 System.out.println(row); //7.釋放資源 JDBCUtils.close(null, pst, conn); } /* * 使用java程式對資料庫表進行新增資料 */ private static void insert(Connection conn) throws SQLException { //使用?佔位符拼接insert語句 String sql = "INSERT INTO users(username,PASSWORD) VALUES(?,?)"; //獲取預編譯的執行者物件 PreparedStatement pst = conn.prepareStatement(sql); //設定?佔位符的實際引數 pst.setObject(1, "喬布斯"); pst.setObject(2, "比爾蓋茨"); //使用預編譯的執行者物件,執行sql語句 int row = pst.executeUpdate(); //處理結果集 System.out.println(row); //釋放資源 JDBCUtils.close(null, pst, conn); } }
Users類
import java.io.Serializable;
/**
* javabean:資料庫中表與java中類對應
* users表-->Users類
* 表中的列(cid,username,password)-->類中的成員變數
* 表中的行-->Users物件(多行數儲存在一個集合中)
*
* 包含:
* 1.私有的成員變數
* 2.公共的get/set方法
* 3.空引數構造方法
* 4.toString方法
* 5.實現序列化介面
*
*/
public class Users implements Serializable {
private static final long serialVersionUID = 5169686823386234072L;
private int uid;
private String username;
private String password;
public Users() {
super();
}
public Users(int uid, String username, String password) {
super();
this.uid = uid;
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "Users [uid=" + uid + ", username=" + username + ", password=" + password + "]";
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}