有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mysql在插入之前检查注册数据?JAVA

我有一个SQL数据库和一个名为“Vehicle”的表。它有一个主键作为VARCHAR。我要做的是验证我输入的ID是否已经注册。“盘子”是我的主键

这是我对车辆类别的“插入”方法:

int match = 0;
       try {
        String query = "insert into vehicle values  ('"+this.plate+"','"+this.maker+"','"+this.model+"','"+this.color+"','"+this.year+"','"+ this.price+"') ";

        state = con.createStatement();

        match = state.executeUpdate(query);

        return match;
    } catch (SQLException ex) {
        Logger.getLogger(Vehicle.class.getName()).log(Level.SEVERE, null, ex);
    }
    return match;

这是我在内部框架上的“插入”代码:

String plate = txtPlate.getText().trim();
    String model = txtModel.getText().trim();
    String maker = txtMker.getText().trim();
    String color = txtColor.getText().trim();
    String year = txtYear.getText().trim();
    String price = txtPrice.getText().trim();

    if(plate.equals("") || maker.equals("") || model.equals("") || color.equals("") || year.equals("") || price.equals("") )
        JOptionPane.showMessageDialog(rootPane, "Cant leave blank spaces");

    else{

        try {
            int year = Integer.parseInt(year);
            int price = Integer.parseInt(price);

            Vehicle v1 = new Vehicle(plate, model, maker, color, year, price);


        if (v1.insert() > 0) 
            {
                JOptionPane.showMessageDialog(rootPane, "Register succes!");
            }else
            {
                JOptionPane.showMessageDialog(rootPane, "Register failed");
            }

        }catch (NumberFormatException exc)
        { 
            JOptionPane.showMessageDialog(this, "Error, insert numbers on 'YEAR and PRICE'");

        }

    }

我试图捕捉异常,但没有成功。每次我添加一个重复板(PK),我的程序都会抛出一个异常,尽管我似乎无法使用它

这是尝试添加具有相同车牌(PK)的车辆后的一点日志

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'ARP22' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

共 (2) 个答案

  1. # 1 楼答案

    使用INSERT IGNORE(特定于MySQL),或者使用SQLException作为复制键的信号。INSERT IGNORE不会引发异常

    最好使用事先准备好的声明。除了作为防止SQL注入的安全措施外,它还避免了撇号和反斜杠等特殊字符。并允许类型

        String query = "insert ignore into"
            + " vehicle(plate, maker, model, color, year, price)"
            + " values(?, ?, ?, ?, ?, ?)";
    
        try (PreparedStatement stm = con.prepareStatement(query)) {
            stm.setString(1, this.plate);
            stm.setString(2, this.maker);
            stm.setString(3, this.model);
            stm.setString(4, this.color);
            stm.setInt(5, this.year);
            stm.setInt(6, this.price);
            match = state.executeUpdate();
        }
    

    列出列名可以确保数据库更改保持可追踪性

  2. # 2 楼答案

    在插入时更新比赛条件

    正如@david所指出的,如果第二个源试图插入一行,其主键与您当前尝试插入的行相同,那么我下面建议的解决方案可能仍然容易出错。要解决此问题,您可以:

    为防止插入数据库时出现异常,只需在尝试插入之前查询将插入的车牌号:

    select 1 from vehicle where plate = <vehicle_plate>

    如果从该查询返回任何信息,则您知道车辆ID已经存在。上面的查询假设plate是车辆的PK字段

    然而,更重要的是,与数据库交互的代码容易受到SQL注入的攻击

    将用户输入的查询字符串传递给数据库是一个好主意。请使用parameterized queries。附加链接:parameterized queries in Java

    有关SQL注入的更多信息:

    https://en.wikipedia.org/wiki/SQL_injection

    What is SQL injection?

    https://stackoverflow.com/search?q=sql+injection