1. 程式人生 > >JDBC中PreparedStatement用法程式碼示例

JDBC中PreparedStatement用法程式碼示例

為了防止使用者使用sql語句注入攻擊資料庫,可以使用Statement介面的子介面
java.sql.PreparedStatement extends Statement
該介面表示預編譯的 SQL 語句的物件,SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。 

如何獲取PreparedStatement的實現類物件呢?

使用Connection介面中的方法PreparedStatement prepareStatement(String sql) 建立一個 PreparedStatement 物件將SQL 語句傳送到資料庫。

prepareStatement方法返回的是 PreparedStatement介面的實現類物件,由mysql驅動提供

程式碼實現一個使用者登入案例:

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();
		}

	}
}
使用PreparedStatement預編譯的執行者物件對資料庫進行增刪改查
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;
	}

}