Проверить существующую запись в базе данных идентификатор автоматического увеличения -> несколько условий

#java #javafx #jdbc

#java #javafx #jdbc

Вопрос:

Я создаю приложение с графическим интерфейсом с пользовательской формой для создания листа, эти листы сохраняются в базе данных H2, что касается пользовательской формы, я вручную ввожу номер листа в текстовое поле и дату из datepicker.

Каждый лист имеет свой идентификатор, который должен быть уникальным для этого месяца. Первый созданный лист за этот месяц имеет идентификатор 1, а 2-й — 2 и так далее, Но в течение следующего месяца идентификатор должен быть перезапущен с 1.

Мне нужно проверить, существует ли запись уже в базе данных с этим номером листа в этом месяце. Я создал еще один столбец в базе данных, где хранятся число месяц год, которые я извлекаю из текстовых полей, и я проверяю его там, но я ищу другой метод без необходимости создавать дополнительный столбец.

Вот установщик и получатели (я вставил только 3 значения):

 public class FiseDetails {

    private final IntegerProperty sheetNumber;
    private final ObjectProperty<Date> sheetDate;
    private final StringProperty numberAndDate;

public FiseDetails(Integer sheetNumber, Date sheetDate, String numberAndDate) {
        this.sheetNumber = new SimpleIntegerProperty(sheetNumber);
        this.sheetDate = new SimpleObjectProperty<>(sheetDate);
        this.numberAndDate = new SimpleStringProperty(numberAndDate);
}

    public Integer getSheetNumber() {
        return sheetNumber.get();
    }

    public void setSheetNumber(Integer value) {
        sheetNumber.set(value);
    }

    public IntegerProperty SheetNumberProperty() {
        return sheetNumber;
    }

    public Date getSheetDate() {
        return sheetDate.get();
    }

    public void setSheetDate(Date value) {
        sheetDate.set(value);
    }

    public ObjectProperty SheetDateProperty() {
        return sheetDate;
    }

    public String getNumberAndDate() {
        return numberAndDate.get();
    }

    public void setNumberAndDate(String value) {
        numberAndDate.set(value);
    }

    public StringProperty NumberAndDateProperty() {
        return numberAndDate;
    }

}
  

Вот часть контроллера:

 public class StartGUIController implements Initializable {

    Connection conn = DbConnection.Connect();
    ObservableList<FiseDetails> data = FXCollections.observableArrayList();
    PreparedStatement preparedStatement = null;
    ResultSet rs = null;

    @FXML
    private TextField txt_SheetNumber;

    @FXML
    private DatePicker sheetDate;

@FXML
    void generateSheet(ActionEvent event) throws SQLException {

        Integer id = Integer.parseInt(txt_SheetNumber.getText());
        LocalDate selectedDate = sheetDate.getValue();
        Date date = Date.valueOf(selectedDate);
        LocalDate strgDate = sheetDate.getValue();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM- yyyy");
        String formatedDate = (strgDate).format(formatter);
        String last7 = formatedDate.substring(formatedDate.length() - 7);
        String numberAndDate = txt_SheetNumber.getText()   " "   last7;

try (PreparedStatement checkNumberAndDateExists = conn.prepareStatement("SELECT 1 FROM SHEETSDB WHERE NUMBERANDDATE = ?")) {
            checkNumberAndDateExists.setString(1, numberAndDate);
            try (ResultSet result = checkNumberAndDateExists.executeQuery()) {
                if (result.next()) {
                    Alert confirmation = new Alert(AlertType.INFORMATION);
                    confirmation.setTitle("Fisa existenta");
                    confirmation.setHeaderText(null);
                    confirmation.setContentText("Fisa "   txt_SheetNumber.getText()   "/"   sheetDate.getValue()   " exista");
                    confirmation.showAndWait();

                } else {
                    String query = "INSERT INTO SHEETSDB (ID, SHEETDATE,  NUMBERANDDATE) VALUES (?,?,?)";
                    preparedStatement = null;
                    try {
                        preparedStatement = conn.prepareStatement(query);
                        preparedStatement.setInt(1, id);
                        preparedStatement.setDate(2, date);
                        preparedStatement.setString(26, numberAndDate);

                    } catch (SQLException e) {
                        System.out.println(e);
                    } finally {
                        preparedStatement.execute();
                        preparedStatement.close();
                    }

                    Alert confirmation = new Alert(AlertType.INFORMATION);
                    confirmation.setTitle("Finalizare generare fisa");
                    confirmation.setHeaderText(null);
                    confirmation.setContentText("Fisa "   txt_SheetNumber.getText()   "/"   sheetDate.getValue()   " a fost creata cu succes");
                    confirmation.showAndWait();
                    TableData();
                }
            }
        }

    }

@Override
    public void initialize(URL url, ResourceBundle rb) {
//here I have some code that does not have any impact on my problem
     }
  
  1. Мой вопрос в том, как я могу эффективно проверить, существует ли номер листа в базе данных за этот месяц, без необходимости создавать дополнительный столбец. Дайте мне знать, если вы считаете, что фактическое решение является лучшим, поскольку дополнительный столбец — единственный столбец, который уникален, поэтому этот столбец я также использую, когда мне нужно удалить строку из базы данных.

  2. Также я не могу придумать решение для автоматического увеличения номера листа и установки его в текстовое поле, например, проверить номер последнего листа за текущий месяц и установить для него текстовое поле «txt_SheetNumber», если ни одно из них не установлено равным 1, поэтому всякий раз, когда я инициализирую приложение, в текстовом поле уже есть номер листа. Если вы можете помочь мне с этим, я также был бы очень признателен.

Я впервые работаю с Java или любым другим языком программирования, поэтому не стесняйтесь комментировать любой аспект. Приложение предназначено только для того, чтобы облегчить мою работу.

Комментарии:

1. выглядит не связанным с javafx … сначала изучите материал, связанный с db, затем сделайте следующий шаг 🙂

2. Не имеет отношения к вашей проблеме: пожалуйста, изучите соглашения об именовании Java и придерживайтесь их. И дополнительно убедитесь, что вы изучили специальные соглашения об именовании свойств javafx (должно быть sheetNumberProperty() f.i.)

3. хорошо, спасибо, сделаю, и я изменю свой код.

Ответ №1:

После некоторого копания я нашел решение для 2-й проблемы. Дайте мне знать, если я должен это улучшить.

 int lastId() {

    int newSheetNumber=0;
    String query = "SELECT MAX(ID) FROM SHEETSDB WHERE MONTH(`SHEETDATE`)=MONTH(NOW()) AND YEAR(`SHEETDATE`)=YEAR(NOW())";
    try {
        preparedStatement = conn.prepareStatement(query);

        rs = preparedStatement.executeQuery();
        if (!rs.next()) {
            newSheetNumber = 1;
        }else {
            newSheetNumber = rs.getInt(1)   1;
        }
        preparedStatement.close();
        rs.close();
        //System.out.println("The new sheet is: "   newSheetNumber);
    } catch (SQLException ex) {
        System.err.println("Error "   ex);
    }
    return newSheetNumber;
}