如何避免将硬编码值发送到 mySQL 数据库

问题描述

在我的项目中,我已经组装了一个基本的密码簿,该项目旨在在单击“保存信息”按钮后将用户信息发送到 MysqL 数据库。当 String 值被硬编码时它工作正常,但是当我尝试使用任何类型的 String 变量或 toString() 方法时,我开始收到错误。有谁知道将 UN 硬编码值发送到 MysqL 的正确方法吗?

import javax.swing.*;
//import java.io.*;
//import java.lang.Thread.State;
import java.awt.event.*;
import java.sql.*;

public class PasswordBook implements ActionListener
{
    private static JLabel websiteLabel;
    private static JTextField websiteText;
    private static JLabel userLabel;
    private static JTextField userText;
    private static JLabel passLabel;
    private static JTextField passtext;
    private static JLabel emailLabel;
    private static JTextField emailText;
    private static JButton button;
    private static JButton clearButton;
    private static JLabel success;
    //private static String websitetoString; (values I tried)
    //private static String userToString;
    //private static String emailToString;
    //private static String passtoString;

    public static void main (String[]args)
    {
        
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.setSize(400,350);
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);

        panel.setLayout(null); // rows columns

        websiteLabel = new JLabel("Website"); //1st
        websiteLabel.setBounds(10,20,80,25);
        panel.add(websiteLabel);

        websiteText = new JTextField(); //1st
        websiteText.setBounds(100,165,25);
        panel.add(websiteText);
        //websitetoString = websiteText.toString();

        userLabel = new JLabel("Username"); //2nd
        userLabel.setBounds(10,60,25);
        panel.add(userLabel);

        userText = new JTextField(20); // 2nd
        userText.setBounds(100,25);
        panel.add(userText);
        //userToString = userText.toString();

        emailLabel = new JLabel("Email"); //3rd
        emailLabel.setBounds(10,100,25);
        panel.add(emailLabel);

        emailText = new JTextField(); //2nd
        emailText.setBounds(100,25);
        panel.add(emailText);
        //emailToString = emailText.toString();

        passLabel = new JLabel("Password"); //4th
        passLabel.setBounds(10,140,25);
        panel.add(passLabel);

        passtext = new JTextField(); // 4th
        passtext.setBounds(100,25);
        panel.add(passtext);
        //passtoString = passtext.toString();

        button = new JButton("Save information");
        button.setBounds(10,180,150,25);
        button.addActionListener(new PasswordBook()); // action listener to button
        panel.add(button);

        clearButton = new JButton("Clear");
        clearButton.setBounds(180,25);

        // CLEARS THE TEXT FIELDS WHEN pressed
        clearButton.addActionListener(new ActionListener() {

            @Override // Override allows function to perfrom independently of the parent class
            public void actionPerformed(ActionEvent event)
            {
                websiteText.setText("");
                userText.setText("");
                emailText.setText("");
                passtext.setText("");
                success.setText("");
            }
        });

        panel.add(clearButton);

        success = new JLabel("");
        success.setBounds(10,220,300,25);
        panel.add(success);
        

        frame.setVisible(true);

    }

    public void actionPerformed(ActionEvent event) {
        try {

            Connection myConn = DriverManager.getConnection("jdbc:MysqL://localhost:3306/passwordbook","root","password");
            //Statement myStatement = myConn.createStatement();
            String sq1 = "INSERT into website_and_user_info"
                        + " (Website,Username,Email,Password)"
                        + " values (?,?,?)";
            
            PreparedStatement statement = myConn.prepareStatement(sq1);
            statement.setString(1,websiteText.toString()); // These values work when hardcoded
            statement.setString(2,userText.toString());
            statement.setString(3,emailText.toString());
            statement.setString(4,passtext.toString());
            
            
            statement.executeUpdate();

            System.out.println("insert complete");
            
        } catch (Exception e) {
            e.printstacktrace();
        }

        

    }


}



解决方法

如果我没看错,passText 是一个 Textfild(建议使用匈牙利表示法,使代码更易于阅读)来获取您需要的文本 .gettext()。像准备的preparedStatement.setString(int,passText.getText());这应该够了吧。但是您需要在清除字段之前获取文本。您的代码似乎首先清除,然后在语句中使用 .setTxt。如果我错了,我很抱歉,atm。我只有手机可以浏览。