java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null
делаю проект банкомат, но выдает ошибку java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null.
У меня всего 4 класса:
public class Account {
private String firstName;
private String lastName;
private Integer balance;
Account(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
/*
Registration of new user
*/
public Boolean register() {
try {
Connection c = Database.connection();
Statement stmt = c.createStatement();
String sql = "INSERT INTO account VALUES (null, '" + this.firstName + "', '" + this.lastName + "')";
stmt.executeUpdate(sql);
Statement stmt2 = c.createStatement();
String sql2 = "SELECT LAST_INSERT_ID()";
ResultSet rs2 = stmt.executeQuery(sql2);
Integer last_account_id = 0;
while (rs2.next()) {
last_account_id = rs2.getInt(1);
}
String cardNumber = this.generateCardNumber();
String code = this.generatePincode();
Statement stmt3 = c.createStatement();
String sql3 = "INSERT INTO card VALUES ('" + last_account_id + "', '" + cardNumber + "', '" + code + "')";
stmt3.executeUpdate(sql3);
Statement stmt4 = c.createStatement();
String sql4 = "INSERT INTO balance VALUES ('" + cardNumber + "', '0')";
stmt4.executeUpdate(sql4);
c.close();
System.out.println("Account created successfully");
System.out.println("Card number: " + cardNumber);
System.out.println("Pincode: " + code);
return true;
} catch (Exception e) {
System.out.println(e);
}
return false;
}
/*
Card number generation
*/
public String generateCardNumber() {
Integer length = 8;
String passwordSet = "1234567890";
char[] cardNumber = new char[length];
for (int i = 0; i < length; i++) {
int rand = (int) (Math.random() * passwordSet.length());
cardNumber[i] = passwordSet.charAt(rand);
}
return new String(cardNumber);
}
/*
Pin code generation
*/
public String generatePincode() {
Integer length = 4;
String passwordSet = "1234567890";
char[] cardNumber = new char[length];
for (int i = 0; i < length; i++) {
int rand = (int) (Math.random() * passwordSet.length());
cardNumber[i] = passwordSet.charAt(rand);
}
return new String(cardNumber);
}
}
public class BasicAtm {
public static boolean isLogin = false;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Integer option = 0;
Scanner scanner = new Scanner(System.in);
//Displaying the main menu
while (option == 0) {
System.out.println("==== SELECT AN OPTION ====");
System.out.println("1. Create an account");
System.out.println("2. Sign in\n");
while (option < 1 || option > 2) {
System.out.println("Type your choice: ");
option = scanner.nextInt();
}
}
//Data entry depending on the selected option
switch(option) {
case 1: //Creating a new account
System.out.println("\n\n=== CREATE NEW ACCOUNT ===\n");
System.out.println("Enter first name:");
String firstName = scanner.next().trim();
System.out.println("Enter last name:");
String lastName = scanner.next().trim();
Account account = new Account(firstName, lastName);
account.register();
break;
case 2: //Login to an existing account
System.out.println("\n\n==== SIGN IN ====\n");
System.out.println("Enter your card number: ");
String cardNumber = scanner.next();
System.out.println("Enter your pincode: ");
String pincode = scanner.next();
Operation operation = new Operation(cardNumber, pincode);
//Checking that the user exists
try {
Connection c = Database.connection();
Statement stmt4 = c.createStatement();
String sql4 = "SELECT * FROM card WHERE card_number = '" + cardNumber + "' AND pincode = '" + pincode + "'";
ResultSet rs4 = stmt4.executeQuery(sql4);
//Display the menu of the user who is logged in
if (rs4.next()) {
isLogin = true;
System.out.println("\n\n==== LOGIN SUCCESS ====\n");
System.out.println("--- Enter an option ---");
System.out.println("1. Balance");
System.out.println("2. Deposit");
System.out.println("3. Send to other person");
Integer option_user = 0;
while (option_user < 1 || option_user > 3) {
System.out.println("\nType your choice: ");
option_user = scanner.nextInt();
}
Integer balance = 0;
//Data entry depending on the selected option
switch(option_user) {
case 1:
System.out.println("\n\n==== SHOW BALANCE ====\n");
balance = operation.showBalance(cardNumber);
System.out.println(balance);
break;
case 2:
System.out.println("\n\n==== MAKE DEPOSIT ====\n");
Integer amount = 0;
while (amount <= 0) {
System.out.println("Type amount: ");
amount = scanner.nextInt();
}
operation.deposit(amount, cardNumber);
balance = operation.showBalance(cardNumber);
System.out.println("\nCurrent balance is " + balance);
break;
case 3:
System.out.println("\n\n==== SEND MONEY TO OTHER CARD ====\n");
System.out.println("Enter number of other client: ");
String number_other = scanner.next();
Integer amountOther = 0;
while (amountOther <= 0) {
System.out.println("Enter amount for other client: ");
amountOther = scanner.nextInt();
}
operation.sendMoneyToOther(amountOther, number_other, cardNumber);
System.out.println("\nYou've sent " + amountOther + " to " + number_other);
break;
default:
break;
}
} else {
System.out.println("\nLogin fail");
}
} catch (Exception e) {
}
break;
default:
break;
}
}
}
public class Database {
private static final String dbClassName = "com.mysql.cj.jdbc.Driver";
private static final String CONNECTION = "jdbc:mysql://localhost:3306/java";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static java.sql.Connection connection() throws Exception {
Class.forName(dbClassName);
return DriverManager.getConnection(CONNECTION, USER, PASSWORD);
}
}
public class Operation {
private String cardNumber;
private String pincode;
private Integer balance;
Operation(String cardNumber, String pincode) {
this.cardNumber = cardNumber;
this.pincode = pincode;
}
/*
Displaying the balance of the bank card
*/
public Integer showBalance(String cardNumber) {
try {
Connection c = Database.connection();
Statement stmt5 = c.createStatement();
String sql5 = "SELECT * FROM balance WHERE card_number = " + cardNumber;
ResultSet rs5 = stmt5.executeQuery(sql5);
while (rs5.next()) {
this.balance = rs5.getInt(2);
}
} catch (Exception e) {
System.out.println(e);
}
return this.balance;
}
/*
Put money on a bank card
*/
public void deposit(Integer amount, String cardNumber) {
try {
Connection c = Database.connection();
Statement stmt6 = c.createStatement();
String sql6 = "UPDATE balance SET balance = balance + '" + amount + "' WHERE card_number = " + cardNumber;
stmt6.executeUpdate(sql6);
} catch (Exception e) {
System.out.println(e);
}
}
/*
Transfer money to another user
*/
public void sendMoneyToOther(Integer amountOther, String numberOther, String cardNumber) {
try {
Connection c = Database.connection();
Statement stmt8 = c.createStatement();
String sql8 = "UPDATE balance SET balance = balance + " + amountOther + " WHERE card_number = '" + numberOther + "'";
stmt8.executeUpdate(sql8);
Statement stmt9 = c.createStatement();
String sql9 = "UPDATE balance SET balance = balance - " + amountOther + " WHERE card_number = '" + cardNumber + "'";
stmt9.executeUpdate(sql9);
} catch (Exception e) {
System.out.println(e);
}
}
}