使用JDBC PreparedStatement将数据插入表中

时间:2019-11-20 08:52:36  来源:igfitidea点击:

在本教程中,您将学习如何使用PreparedStatement对象将数据插入MySQL表。

在上一教程中,我们向您展示了如何使用PreparedStatement对象更新数据。
调用executeUpdate()方法时,将获得受影响的行数。
当您将记录插入表中时,您可能希望将插入的ID返回给程序以进行进一步处理。
让我们看看我们如何做到这一点。

首先,像往常一样,打开与MySQL的新连接。
您可以利用我们在上一教程中开发的实用程序类MySQLJDBCUtil。

Connection conn = MySQLJDBCUtil.getConnection();

然后,使用占位符构造INSERT语句,并通过调用Connection对象的prepareStatement()方法创建一个新的PreparedStatement对象。
您将INSERT语句作为第一个参数传递,并将值为Statement.RETURN_GENERATED_KEYS的整数作为方法的第二个参数传递。
第二个参数指示JDBC返回所插入的ID。

String sql = "INSERT INTO candidates(first_name,last_name,dob,phone,email) "
            + "VALUES(?,?,?,?,?)";

PreparedStatement pstmt = conn.prepareStatement(sql,
                              Statement.RETURN_GENERATED_KEYS);

接下来,通过调用PreparedStatement对象的setYYY()方法为占位符提供值。

// set parameters for statement
pstmt.setString(1, firstName);
pstmt.setString(2, lastName);
pstmt.setDate(3, dob);
pstmt.setString(4, phone);
pstmt.setString(5, email);

之后,您调用executeUpdate()方法以执行INSERT语句。
此方法返回受影响的行数。
我们检查返回值以查看记录是否已成功插入。

int rowAffected = pstmt.executeUpdate();
if(rowAffected == 1)
{
   // process further here
}

最后,要获取插入的ID,请调用PreparedStatement对象的getGeneratedKeys()方法。
该方法返回一个ResultSet。
您只需要从ResultSet中获取数据,如下所示:

// get candidate id
int candidateId = 0;
ResultSet rs = pstmt.getGeneratedKeys();
if(rs.next())
   candidateId = rs.getInt(1);

以下是将数据插入候选表并将其取回的完整示例。

package org.theitroad;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author theitroad.local
 */
public class Main {

    /**
     * Insert a new candidate
     * @param firstName
     * @param lastName
     * @param dob
     * @param email
     * @param phone
     * @return 
     */
    public static int insertCandidate(String firstName,String lastName,Date dob, 
                                       String email, String phone) {
        // for insert a new candidate
        ResultSet rs = null;
        int candidateId = 0;
        
        String sql = "INSERT INTO candidates(first_name,last_name,dob,phone,email) "
                   + "VALUES(?,?,?,?,?)";
        
        try (Connection conn = MySQLJDBCUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);) {
            
            // set parameters for statement
            pstmt.setString(1, firstName);
            pstmt.setString(2, lastName);
            pstmt.setDate(3, dob);
            pstmt.setString(4, phone);
            pstmt.setString(5, email);

            int rowAffected = pstmt.executeUpdate();
            if(rowAffected == 1)
            {
                // get candidate id
                rs = pstmt.getGeneratedKeys();
                if(rs.next())
                    candidateId = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                if(rs != null)  rs.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        
        return candidateId;
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
         // insert a new candidate
         int id = insertCandidate("Bush", "Lily", Date.valueOf("1980-01-04"), 
                        "[email protected]", "(408) 898-6666");
         
         System.out.println(String.format("A new candidate with id %d has been inserted.",id));
    }
}

让我们运行程序。

它表明您已成功将新的候选者插入ID为134的候选者表中。

在本教程中,我们向您展示了如何使用PreparedStatement对象将新记录插入MySQL表并获取插入的ID以进行进一步处理。