Hướng dẫn mysql update prepared statement - câu lệnh chuẩn bị cập nhật mysql

Trong bài này mình sẽ hướng dẫn các bạn cách thay Update MySQL với Java JDBC Driver, bằng cách sử dụng PreparedStatement.

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức.

PreparedStatement được kế thừa từ lớp

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
3 nên được hưởng một số tính năng quan trọng như sau: được kế thừa từ lớp
String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
3 nên được hưởng một số tính năng quan trọng như sau:

  • Truyền tham số vào câu truy vấn bằng dấu hỏi [?], giúp tránh được lỗi SQL Injection.
  • Sử dụng lại PreparedStatement trong trường hợp bạn muốn thức thi nhiều câu truy vấn hoăc nhiều tham số khác nhau.
  • Giúp tăng hiệu suất xử lý bằng cách thực thi câu lệnh SQL trước.

Chúng ta sẽ sử dụng

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
4 để cập nhật dữ liệu trong bảng candidates.

Đầu tiên hãy mở kết nối vào database. Mình sử dụng lớp kết nối

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
5 đã được tạo trong bài kết nối MySQL bằng Java JDBC Driver.

Bài viết này được đăng tại [free tuts .net]

Connection conn = MySQLJDBCUtil.getConnection[];

Tiếp theo viết một câu lệnh SQL update với dấu hỏi

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
6 là nơi mà dữ liệu sẽ được replace bởi các phương thức của
String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
7.

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
7 thuộc đối tượng
String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
9 đã tạo ở trên và nó là một Object PreparedStatement, vì vậy đoạn code này sẽ được viết như sau:Object PreparedStatement, vì vậy đoạn code này sẽ được viết như sau:

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];

Vấn đề bây giờ là phải truyền dữ liệu

String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
0 và
String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
1 vào hai vị trí dấu hỏi trong câu SQL update trên.

Thật vui là PreparedStatement có cung cấp một số phương thức dạng

String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
2 để gán giá trị vào chuỗi SQL đó.PreparedStatement có cung cấp một số phương thức dạng
String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
2 để gán giá trị vào chuỗi SQL đó.

String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];

String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
3 đứng vị trí số 1 trong chuỗi SQL nên ta truyền vị trí cho nó là số 1, tương tự là số 2 cho
String lastName = "William";
int id = 100;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];
1.

Bây giờ hãy thực hiện lệnh update bằng cách gọi phương thức executeUpdate như sau:

int rowAffected = pstmt.executeUpdate[];

Trong trường hợp bạn muốn sử dụng lại

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
4 thì bạn cần nhập lai giá trị mới cho và gọi lại phương thức này.

// ĐỔi gái trị mới

lastName = "Grohe";
id = 101;

pstmt.setString[1, lastName];
pstmt.setInt[2, id];

rowAffected = pstmt.executeUpdate[];

Như thường lệ, sau khi thực hiện xong thì ta đóng kết nối lại cho an toàn.

Sau đây là toàn bộ chương trình ở trên.

package org.mysqltutorial;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 *
 * @author mysqltutorial.org
 */
public class Main {

    /**
     * Update candidate demo
     */
    public void update[] {

        String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

        try [Connection conn = MySQLJDBCUtil.getConnection[];
                PreparedStatement pstmt = conn.prepareStatement[sqlUpdate]] {

            // prepare data for update
            String lastName = "William";
            int id = 100;
            pstmt.setString[1, lastName];
            pstmt.setInt[2, id];

            int rowAffected = pstmt.executeUpdate[];
            System.out.println[String.format["Row affected %d", rowAffected]];

            // reuse the prepared statement
            lastName = "Grohe";
            id = 101;
            pstmt.setString[1, lastName];
            pstmt.setInt[2, id];

            rowAffected = pstmt.executeUpdate[];
            System.out.println[String.format["Row affected %d", rowAffected]];

        } catch [SQLException ex] {
            System.out.println[ex.getMessage[]];
        }
    }

    /**
     * main method
     *
     * @param args
     */
    public static void main[String[] args] {
        update[];

    }
}

Thực thi chương trình này sẽ thu được kết quả như sau:

Có một điều quan trọng muốn nhắc rằng, bạn có thể sử dụng hầu hết các câu truy vấn SQL thông qua đối tượng PreparedStatement.

Như vậy là trong bài này mình đã hướng dẫn xong cách update MySQL bằng JDBC PreparedStatement trong Java. Chúc bạn thực hiện thành công!

Tôi đang cố gắng học cách thích hợp để sử dụng các câu lệnh đã chuẩn bị để tránh tiêm SQL, v.v.

Khi tôi thực thi tập lệnh, tôi nhận được một thông báo từ tập lệnh của mình nói rằng 0 hàng được chèn, tôi hy vọng điều này sẽ nói 1 hàng được chèn và tất nhiên cập nhật bảng. Tôi không hoàn toàn chắc chắn về tuyên bố đã chuẩn bị của mình, vì tôi đã thực hiện một số nghiên cứu và ý tôi là nó thay đổi từ ví dụ.

Khi tôi cập nhật bảng của mình, tôi có cần phải khai báo tất cả các trường hay chỉ có thể cập nhật một trường không ??

Mọi thông tin đều giúp ích rất nhiều.

index.php

classes/class.Scripts.inc

public function update[] {
    if [isset[$_POST['update']]] {
        $stmt = $this->mysqli->prepare["UPDATE datadump SET content=? WHERE id=?"];
        $id = 1;
        /* Bind our params */                           
        $stmt->bind_param['is', $id, $content];
        /* Set our params */
        $content = isset[$_POST['content']] ? $this->mysqli->real_escape_string[$_POST['content']] : '';

        /* Execute the prepared Statement */
        $stmt->execute[];
        printf["%d Row inserted.\n", $stmt->affected_rows];

    }                   
}

Dharman ♦

Phù vàng 27.7K21 Huy hiệu vàng75 Huy hiệu bạc126 Hàng đồng21 gold badges75 silver badges126 bronze badges

Hỏi ngày 19 tháng 8 năm 2013 lúc 14:37Aug 19, 2013 at 14:37

7

$stmt = $this->mysqli->prepare["UPDATE datadump SET content=? WHERE id=?"];
/* BK: always check whether the prepare[] succeeded */
if [$stmt === false] {
  trigger_error[$this->mysqli->error, E_USER_ERROR];
  return;
}
$id = 1;
/* Bind our params */
/* BK: variables must be bound in the same order as the params in your SQL.
 * Some people prefer PDO because it supports named parameter. */
$stmt->bind_param['si', $content, $id];

/* Set our params */
/* BK: No need to use escaping when using parameters, in fact, you must not, 
 * because you'll get literal '\' characters in your content. */
$content = $_POST['content'] ?: '';

/* Execute the prepared Statement */
$status = $stmt->execute[];
/* BK: always check whether the execute[] succeeded */
if [$status === false] {
  trigger_error[$stmt->error, E_USER_ERROR];
}
printf["%d Row inserted.\n", $stmt->affected_rows];

Lại câu hỏi của bạn:

Tôi nhận được một tin nhắn từ tập lệnh của mình nói rằng 0 hàng được chèn

Điều này là do bạn đảo ngược thứ tự của các tham số khi bạn ràng buộc chúng. Vì vậy, bạn đang tìm kiếm cột ID cho giá trị số của nội dung $ của bạn, có thể được hiểu là 0. Vì vậy, mệnh đề của bản cập nhật khớp với các hàng không.

Tôi có cần phải khai báo tất cả các trường hay chỉ có thể cập nhật một trường ??

Không sao khi đặt chỉ một cột trong một câu lệnh cập nhật. Các cột khác sẽ không được thay đổi.

Đã trả lời ngày 19 tháng 8 năm 2013 lúc 14:48Aug 19, 2013 at 14:48

Bill Karwinbill KarwinBill Karwin

510K83 Huy hiệu vàng643 Huy hiệu bạc803 Huy hiệu Đồng83 gold badges643 silver badges803 bronze badges

6

Trên thực tế, các câu lệnh được chuẩn bị không phức tạp như nó được hiển thị trong câu trả lời khác. Hoàn toàn ngược lại, một tuyên bố đã chuẩn bị là cách đơn giản và ngăn nắp nhất để thực hiện truy vấn. Lấy ví dụ, trường hợp của bạn. Bạn chỉ cần ba dòng mã!

$stmt = $this->mysqli->prepare["UPDATE datadump SET content=? WHERE id=?"];
$stmt->bind_param['si', $content, $id];
$stmt->execute[];
  1. Chuẩn bị truy vấn của bạn với người giữ chỗ
  2. Sau đó liên kết các biến [một gợi ý: bạn có thể sử dụng "S" một cách an toàn cho bất kỳ biến nào]
  3. Và sau đó thực hiện truy vấn.

Đơn giản như 1-2-3!

Lưu ý rằng việc kiểm tra kết quả của mọi chức năng theo cách thủ công chỉ là điên rồ, nó sẽ chỉ làm mờ mã của bạn mà không có bất kỳ lợi ích nào. Thay vào đó, bạn nên định cấu hình MySQLI để tự động báo cáo lỗi một lần cho tất cả. Để làm như vậy, hãy thêm dòng sau trước ________ 26/________ 27:

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
0

Kết quả sẽ khá giống với Trigger_error nhưng không có một dòng mã bổ sung nào! Như bạn có thể thấy, mã có thể rất đơn giản và súc tích, nếu được sử dụng đúng cách.

Đã trả lời ngày 18 tháng 5 năm 2017 lúc 15:13May 18, 2017 at 15:13

Ý thức chung thông thường của bạnYour Common Sense

156K39 Huy hiệu vàng208 Huy hiệu bạc331 Huy hiệu Đồng39 gold badges208 silver badges331 bronze badges

Tôi muốn dọn dẹp mã tuyệt vời của Bill Karwin

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
1

Tôi khuyên bạn nên sử dụng "hoặc chết" thay vì nếu điều khoản tôi khuyên bạn nên buộc một loại biến để lấy các giá trị:

String sqlUpdate = "UPDATE candidates "
                + "SET last_name = ? "
                + "WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement[sqlUpdate];
2

Đã trả lời ngày 20 tháng 5 năm 2020 lúc 12:14May 20, 2020 at 12:14

2

Bài Viết Liên Quan

Chủ Đề