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)
# 1 楼答案
使用INSERT IGNORE(特定于MySQL),或者使用SQLException作为复制键的信号。INSERT IGNORE不会引发异常
最好使用事先准备好的声明。除了作为防止SQL注入的安全措施外,它还避免了撇号和反斜杠等特殊字符。并允许类型
列出列名可以确保数据库更改保持可追踪性
# 2 楼答案
在插入时更新比赛条件
正如@david所指出的,如果第二个源试图插入一行,其主键与您当前尝试插入的行相同,那么我下面建议的解决方案可能仍然容易出错。要解决此问题,您可以:
插入前Lock tables
或者,如果你不在乎哪个insert赢了,你可以INSERT IGNORE。当使用
INSERT IGNORE
最后,您可以使用INSERT ... ON DUPLICATE KEY UPDATE。如果PK不存在,这将插入该行,否则将更新现有的PK
为防止插入数据库时出现异常,只需在尝试插入之前查询将插入的车牌号:
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