如何修复此代码?在处理日期时,我应该使用什么代替整数%d?
public static void entryAdd()
{
Scanner scan= new Scanner(System.in);
System.out.print(" Student Number :");
int newNumber= scan.nextInt();
System.out.print(" Entry no :");
int entryNumber=scan.nextInt();
System.out.print(" Borrow Date :");
int borrowDate=scan.nextInt();
System.out.print("Return Date :");
int returnDate=scan.nextInt();
try{
Statement stmt=con.createStatement();
String query=String.format("insert into entry values( %d, %d, %d, %d, %d)", newNumber,entryNumber,borrowDate, returnDate);
int add = stmt.executeUpdate(query);
System.out.println("Entry Added");
}catch(Exception e){ System.out.println(e);}
}
您可以使用字符串代替日期,在MySQL中,您可以插入字符串日期。 MySQL会将其更改为实际日期。
public static void entryAdd()
{
Scanner scan= new Scanner(System.in);
System.out.print(" Student Number :");
int newNumber= scan.nextInt();
System.out.print(" Entry no :");
int entryNumber=scan.nextInt();
System.out.print(" Borrow Date :");
String borrow=scan.next();
System.out.print("Return Date :");
String return=scan.next();
try{
Statement stmt=con.createStatement();
String query=String.format("insert into entry values( %d, %d, %d, %s, %s)", newNumber,entryNumber,borrow, return);
int add = stmt.executeUpdate(query);
System.out.println("Entry Added");
}catch(Exception e){ System.out.println(e);}
}
您不应该使用String.format
来构造查询字符串。当与字符串值(或其他对象)一起使用时,它会使您的代码容易受到SQL注入的影响或难以诊断语法错误。
正确的解决方案类似于:
// ...
// You may need to use `DateTimeFormatter` with a specific format, this will use yyyy-MM-dd
LocalData borrowDate = LocalDate.parse(scan.next())
LocalData returnDate = LocalDate.parse(scan.next())
try (Statement stmt = con.prepareStatement(
"insert into entry (newNumber, entryNumber, borrow, return) values (?, ?, ?, ?)")) {
stmt.setInt(1, newNumber);
stmt.setInt(2, entryNumber);
stmt.setObject(3, borrowDate);
stmt.setObject(4, returnDate);
stmt.executeUpdate();
}
这假设您要插入DATE
列,并且您的驱动程序符合JDBC 4.2。
我还明确指定要插入的列(我已经根据您的变量名猜测了列名)。这样可以防止您在插入重新排序的列或添加(可空)列的表更改中遇到问题。
您不应该使用String.format构造查询字符串。当与字符串值(或其他对象)一起使用时,它会使您的代码容易受到SQL注入的影响或难以诊断语法错误。
正确的解决方案类似于: